diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2008-05-20 12:53:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-20 13:12:26 -0400 |
commit | 81b2dbcad86732ffc02bad87aa25c4651199fc77 (patch) | |
tree | 6c956c561fbaaa7e04ef612695bf5d3d0b5faef2 /include | |
parent | babd90b274e6b43a7dc7bb08562bf566cbabdbf8 (diff) |
Fix a deadlock in the bttv driver
vidiocgmbuf() does this:
mutex_lock(&fh->cap.vb_lock);
retval = videobuf_mmap_setup(&fh->cap, gbuffers, gbufsize,
V4L2_MEMORY_MMAP);
and videobuf_mmap_setup() then just does
mutex_lock(&q->vb_lock);
ret = __videobuf_mmap_setup(q, bcount, bsize, memory);
mutex_unlock(&q->vb_lock);
which is an obvious double-take deadlock.
This patch fixes this by having vidiocgmbuf() just call the
__videobuf_mmap_setup function instead.
Acked-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Reported-by: Koos Vriezen <koos.vriezen@gmail.com>
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/media/videobuf-core.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/media/videobuf-core.h b/include/media/videobuf-core.h index 5b39a22533fe..874f1340d049 100644 --- a/include/media/videobuf-core.h +++ b/include/media/videobuf-core.h | |||
@@ -237,6 +237,9 @@ unsigned int videobuf_poll_stream(struct file *file, | |||
237 | int videobuf_mmap_setup(struct videobuf_queue *q, | 237 | int videobuf_mmap_setup(struct videobuf_queue *q, |
238 | unsigned int bcount, unsigned int bsize, | 238 | unsigned int bcount, unsigned int bsize, |
239 | enum v4l2_memory memory); | 239 | enum v4l2_memory memory); |
240 | int __videobuf_mmap_setup(struct videobuf_queue *q, | ||
241 | unsigned int bcount, unsigned int bsize, | ||
242 | enum v4l2_memory memory); | ||
240 | int videobuf_mmap_free(struct videobuf_queue *q); | 243 | int videobuf_mmap_free(struct videobuf_queue *q); |
241 | int videobuf_mmap_mapper(struct videobuf_queue *q, | 244 | int videobuf_mmap_mapper(struct videobuf_queue *q, |
242 | struct vm_area_struct *vma); | 245 | struct vm_area_struct *vma); |