diff options
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/dabusb.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/media/video/dabusb.c b/drivers/media/video/dabusb.c index 9b413a35e048..0f505086774c 100644 --- a/drivers/media/video/dabusb.c +++ b/drivers/media/video/dabusb.c | |||
@@ -616,10 +616,12 @@ static int dabusb_open (struct inode *inode, struct file *file) | |||
616 | { | 616 | { |
617 | int devnum = iminor(inode); | 617 | int devnum = iminor(inode); |
618 | pdabusb_t s; | 618 | pdabusb_t s; |
619 | int r; | ||
619 | 620 | ||
620 | if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB)) | 621 | if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB)) |
621 | return -EIO; | 622 | return -EIO; |
622 | 623 | ||
624 | lock_kernel(); | ||
623 | s = &dabusb[devnum - DABUSB_MINOR]; | 625 | s = &dabusb[devnum - DABUSB_MINOR]; |
624 | 626 | ||
625 | dbg("dabusb_open"); | 627 | dbg("dabusb_open"); |
@@ -634,6 +636,7 @@ static int dabusb_open (struct inode *inode, struct file *file) | |||
634 | msleep_interruptible(500); | 636 | msleep_interruptible(500); |
635 | 637 | ||
636 | if (signal_pending (current)) { | 638 | if (signal_pending (current)) { |
639 | unlock_kernel(); | ||
637 | return -EAGAIN; | 640 | return -EAGAIN; |
638 | } | 641 | } |
639 | mutex_lock(&s->mutex); | 642 | mutex_lock(&s->mutex); |
@@ -641,6 +644,7 @@ static int dabusb_open (struct inode *inode, struct file *file) | |||
641 | if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) { | 644 | if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) { |
642 | mutex_unlock(&s->mutex); | 645 | mutex_unlock(&s->mutex); |
643 | dev_err(&s->usbdev->dev, "set_interface failed\n"); | 646 | dev_err(&s->usbdev->dev, "set_interface failed\n"); |
647 | unlock_kernel(); | ||
644 | return -EINVAL; | 648 | return -EINVAL; |
645 | } | 649 | } |
646 | s->opened = 1; | 650 | s->opened = 1; |
@@ -649,7 +653,9 @@ static int dabusb_open (struct inode *inode, struct file *file) | |||
649 | file->f_pos = 0; | 653 | file->f_pos = 0; |
650 | file->private_data = s; | 654 | file->private_data = s; |
651 | 655 | ||
652 | return nonseekable_open(inode, file); | 656 | r = nonseekable_open(inode, file); |
657 | unlock_kernel(); | ||
658 | return r; | ||
653 | } | 659 | } |
654 | 660 | ||
655 | static int dabusb_release (struct inode *inode, struct file *file) | 661 | static int dabusb_release (struct inode *inode, struct file *file) |