|
@@ -1270,8 +1270,14 @@ static int dv1394_mmap(struct file *file, struct vm_area_struct *vma)
|
|
|
struct video_card *video = file_to_video_card(file);
|
|
|
int retval = -EINVAL;
|
|
|
|
|
|
- /* serialize mmap */
|
|
|
- mutex_lock(&video->mtx);
|
|
|
+ /*
|
|
|
+ * We cannot use the blocking variant mutex_lock here because .mmap
|
|
|
+ * is called with mmap_sem held, while .ioctl, .read, .write acquire
|
|
|
+ * video->mtx and subsequently call copy_to/from_user which will
|
|
|
+ * grab mmap_sem in case of a page fault.
|
|
|
+ */
|
|
|
+ if (!mutex_trylock(&video->mtx))
|
|
|
+ return -EAGAIN;
|
|
|
|
|
|
if ( ! video_card_initialized(video) ) {
|
|
|
retval = do_dv1394_init_default(video);
|