diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2012-12-20 17:02:51 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-01-05 04:35:35 +0100 |
commit | 7d051b35d5196ad6011a17e751dbd3d180abb046 (patch) | |
tree | 718bd75e1967da3d27861ee7a1fc15ca2f015492 /include/media/soc_camera.h | |
parent | [media] mt9v022: fix potential NULL pointer dereference in mt9v022_probe() (diff) | |
download | linux-7d051b35d5196ad6011a17e751dbd3d180abb046.tar.xz linux-7d051b35d5196ad6011a17e751dbd3d180abb046.zip |
[media] soc-camera: properly fix camera probing races
The recently introduced host_lock causes lockdep warnings, besides, list
enumeration in scan_add_host() must be protected by holdint the list_lock.
OTOH, holding .video_lock in soc_camera_open() isn't enough to protect
the host during its building of the pipeline, because .video_lock is per
soc-camera device. If, e.g. more than one sensor can be attached to a host
and the user tries to open both device nodes simultaneously, host's .add()
method can be called simultaneously for both sensors. Fix these problems
by holding list_lock instead of .host_lock in scan_add_host() and taking
it shortly at the beginning of soc_camera_open(), and using .host_lock to
protect host's .add() and .remove() operations only.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'include/media/soc_camera.h')
-rw-r--r-- | include/media/soc_camera.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index 6442edc2a151..0370a9517282 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h @@ -62,7 +62,7 @@ struct soc_camera_device { struct soc_camera_host { struct v4l2_device v4l2_dev; struct list_head list; - struct mutex host_lock; /* Protect during probing */ + struct mutex host_lock; /* Protect pipeline modifications */ unsigned char nr; /* Host number */ u32 capabilities; void *priv; |