diff options
author | Oliver Neukum <oliver@neukum.org> | 2010-01-13 09:33:15 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-02 17:54:23 -0500 |
commit | 86266452f80545285c14e20a8024f79c4fb88a86 (patch) | |
tree | ebb0a287f9bf189737d4924536d18b36492fd330 | |
parent | f9de332ebf9df71892d52f7eb64af101a647349f (diff) |
USB: Push BKL on open down into the drivers
Straightforward push into the drivers to allow
auditing individual drivers separately
Signed-off-by: Oliver Neukum <oliver@neukum.org>
Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/hid/usbhid/hiddev.c | 7 | ||||
-rw-r--r-- | drivers/media/video/dabusb.c | 8 | ||||
-rw-r--r-- | drivers/staging/frontier/alphatrack.c | 3 | ||||
-rw-r--r-- | drivers/staging/frontier/tranzport.c | 3 | ||||
-rw-r--r-- | drivers/usb/class/cdc-wdm.c | 3 | ||||
-rw-r--r-- | drivers/usb/class/usblp.c | 3 | ||||
-rw-r--r-- | drivers/usb/class/usbtmc.c | 3 | ||||
-rw-r--r-- | drivers/usb/core/file.c | 2 | ||||
-rw-r--r-- | drivers/usb/image/mdc800.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/adutux.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/ftdi-elan.c | 15 | ||||
-rw-r--r-- | drivers/usb/misc/idmouse.c | 8 | ||||
-rw-r--r-- | drivers/usb/misc/iowarrior.c | 4 | ||||
-rw-r--r-- | drivers/usb/misc/ldusb.c | 12 | ||||
-rw-r--r-- | drivers/usb/misc/legousbtower.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/rio500.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/sisusbvga/sisusb.c | 14 | ||||
-rw-r--r-- | drivers/usb/misc/usblcd.c | 5 | ||||
-rw-r--r-- | drivers/usb/misc/vstusb.c | 9 | ||||
-rw-r--r-- | drivers/usb/usb-skeleton.c | 3 |
20 files changed, 99 insertions, 15 deletions
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 867e08433e4b..433602aed468 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
@@ -265,9 +265,10 @@ static int hiddev_release(struct inode * inode, struct file * file) | |||
265 | static int hiddev_open(struct inode *inode, struct file *file) | 265 | static int hiddev_open(struct inode *inode, struct file *file) |
266 | { | 266 | { |
267 | struct hiddev_list *list; | 267 | struct hiddev_list *list; |
268 | int res; | 268 | int res, i; |
269 | 269 | ||
270 | int i = iminor(inode) - HIDDEV_MINOR_BASE; | 270 | lock_kernel(); |
271 | i = iminor(inode) - HIDDEV_MINOR_BASE; | ||
271 | 272 | ||
272 | if (i >= HIDDEV_MINORS || i < 0 || !hiddev_table[i]) | 273 | if (i >= HIDDEV_MINORS || i < 0 || !hiddev_table[i]) |
273 | return -ENODEV; | 274 | return -ENODEV; |
@@ -313,10 +314,12 @@ static int hiddev_open(struct inode *inode, struct file *file) | |||
313 | usbhid_open(hid); | 314 | usbhid_open(hid); |
314 | } | 315 | } |
315 | 316 | ||
317 | unlock_kernel(); | ||
316 | return 0; | 318 | return 0; |
317 | bail: | 319 | bail: |
318 | file->private_data = NULL; | 320 | file->private_data = NULL; |
319 | kfree(list); | 321 | kfree(list); |
322 | unlock_kernel(); | ||
320 | return res; | 323 | return res; |
321 | } | 324 | } |
322 | 325 | ||
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) |
diff --git a/drivers/staging/frontier/alphatrack.c b/drivers/staging/frontier/alphatrack.c index 15aed87fe1bb..e2f82f0dbad8 100644 --- a/drivers/staging/frontier/alphatrack.c +++ b/drivers/staging/frontier/alphatrack.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
42 | 42 | ||
43 | #include <linux/uaccess.h> | 43 | #include <linux/uaccess.h> |
44 | #include <linux/smp_lock.h> | ||
44 | #include <linux/input.h> | 45 | #include <linux/input.h> |
45 | #include <linux/usb.h> | 46 | #include <linux/usb.h> |
46 | #include <linux/poll.h> | 47 | #include <linux/poll.h> |
@@ -325,6 +326,7 @@ static int usb_alphatrack_open(struct inode *inode, struct file *file) | |||
325 | int retval = 0; | 326 | int retval = 0; |
326 | struct usb_interface *interface; | 327 | struct usb_interface *interface; |
327 | 328 | ||
329 | lock_kernel(); | ||
328 | nonseekable_open(inode, file); | 330 | nonseekable_open(inode, file); |
329 | subminor = iminor(inode); | 331 | subminor = iminor(inode); |
330 | 332 | ||
@@ -394,6 +396,7 @@ unlock_exit: | |||
394 | 396 | ||
395 | unlock_disconnect_exit: | 397 | unlock_disconnect_exit: |
396 | mutex_unlock(&disconnect_mutex); | 398 | mutex_unlock(&disconnect_mutex); |
399 | unlock_kernel(); | ||
397 | 400 | ||
398 | return retval; | 401 | return retval; |
399 | } | 402 | } |
diff --git a/drivers/staging/frontier/tranzport.c b/drivers/staging/frontier/tranzport.c index ef8fcc8c67bd..1d3f7dc90f4f 100644 --- a/drivers/staging/frontier/tranzport.c +++ b/drivers/staging/frontier/tranzport.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/mutex.h> | 40 | #include <linux/mutex.h> |
41 | 41 | ||
42 | #include <linux/uaccess.h> | 42 | #include <linux/uaccess.h> |
43 | #include <linux/smp_lock.h> | ||
43 | #include <linux/input.h> | 44 | #include <linux/input.h> |
44 | #include <linux/usb.h> | 45 | #include <linux/usb.h> |
45 | #include <linux/poll.h> | 46 | #include <linux/poll.h> |
@@ -343,6 +344,7 @@ static int usb_tranzport_open(struct inode *inode, struct file *file) | |||
343 | int retval = 0; | 344 | int retval = 0; |
344 | struct usb_interface *interface; | 345 | struct usb_interface *interface; |
345 | 346 | ||
347 | lock_kernel(); | ||
346 | nonseekable_open(inode, file); | 348 | nonseekable_open(inode, file); |
347 | subminor = iminor(inode); | 349 | subminor = iminor(inode); |
348 | 350 | ||
@@ -413,6 +415,7 @@ unlock_exit: | |||
413 | 415 | ||
414 | unlock_disconnect_exit: | 416 | unlock_disconnect_exit: |
415 | mutex_unlock(&disconnect_mutex); | 417 | mutex_unlock(&disconnect_mutex); |
418 | unlock_kernel(); | ||
416 | 419 | ||
417 | return retval; | 420 | return retval; |
418 | } | 421 | } |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 18aafcb08fc8..b75a3d8bb02f 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/uaccess.h> | 19 | #include <linux/uaccess.h> |
20 | #include <linux/bitops.h> | 20 | #include <linux/bitops.h> |
21 | #include <linux/poll.h> | 21 | #include <linux/poll.h> |
22 | #include <linux/smp_lock.h> | ||
22 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
23 | #include <linux/usb/cdc.h> | 24 | #include <linux/usb/cdc.h> |
24 | #include <asm/byteorder.h> | 25 | #include <asm/byteorder.h> |
@@ -516,6 +517,7 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
516 | struct usb_interface *intf; | 517 | struct usb_interface *intf; |
517 | struct wdm_device *desc; | 518 | struct wdm_device *desc; |
518 | 519 | ||
520 | lock_kernel(); | ||
519 | mutex_lock(&wdm_mutex); | 521 | mutex_lock(&wdm_mutex); |
520 | intf = usb_find_interface(&wdm_driver, minor); | 522 | intf = usb_find_interface(&wdm_driver, minor); |
521 | if (!intf) | 523 | if (!intf) |
@@ -548,6 +550,7 @@ static int wdm_open(struct inode *inode, struct file *file) | |||
548 | usb_autopm_put_interface(desc->intf); | 550 | usb_autopm_put_interface(desc->intf); |
549 | out: | 551 | out: |
550 | mutex_unlock(&wdm_mutex); | 552 | mutex_unlock(&wdm_mutex); |
553 | unlock_kernel(); | ||
551 | return rv; | 554 | return rv; |
552 | } | 555 | } |
553 | 556 | ||
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 93b5f85d7ceb..d53f9499f936 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include <linux/slab.h> | 56 | #include <linux/slab.h> |
57 | #include <linux/lp.h> | 57 | #include <linux/lp.h> |
58 | #include <linux/mutex.h> | 58 | #include <linux/mutex.h> |
59 | #include <linux/smp_lock.h> | ||
59 | #undef DEBUG | 60 | #undef DEBUG |
60 | #include <linux/usb.h> | 61 | #include <linux/usb.h> |
61 | 62 | ||
@@ -395,6 +396,7 @@ static int usblp_open(struct inode *inode, struct file *file) | |||
395 | if (minor < 0) | 396 | if (minor < 0) |
396 | return -ENODEV; | 397 | return -ENODEV; |
397 | 398 | ||
399 | lock_kernel(); | ||
398 | mutex_lock (&usblp_mutex); | 400 | mutex_lock (&usblp_mutex); |
399 | 401 | ||
400 | retval = -ENODEV; | 402 | retval = -ENODEV; |
@@ -434,6 +436,7 @@ static int usblp_open(struct inode *inode, struct file *file) | |||
434 | } | 436 | } |
435 | out: | 437 | out: |
436 | mutex_unlock (&usblp_mutex); | 438 | mutex_unlock (&usblp_mutex); |
439 | unlock_kernel(); | ||
437 | return retval; | 440 | return retval; |
438 | } | 441 | } |
439 | 442 | ||
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 8588c0937a89..426bfc72b9b4 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/uaccess.h> | 26 | #include <linux/uaccess.h> |
27 | #include <linux/kref.h> | 27 | #include <linux/kref.h> |
28 | #include <linux/mutex.h> | 28 | #include <linux/mutex.h> |
29 | #include <linux/smp_lock.h> | ||
29 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
30 | #include <linux/usb/tmc.h> | 31 | #include <linux/usb/tmc.h> |
31 | 32 | ||
@@ -113,6 +114,7 @@ static int usbtmc_open(struct inode *inode, struct file *filp) | |||
113 | struct usbtmc_device_data *data; | 114 | struct usbtmc_device_data *data; |
114 | int retval = 0; | 115 | int retval = 0; |
115 | 116 | ||
117 | lock_kernel(); | ||
116 | intf = usb_find_interface(&usbtmc_driver, iminor(inode)); | 118 | intf = usb_find_interface(&usbtmc_driver, iminor(inode)); |
117 | if (!intf) { | 119 | if (!intf) { |
118 | printk(KERN_ERR KBUILD_MODNAME | 120 | printk(KERN_ERR KBUILD_MODNAME |
@@ -128,6 +130,7 @@ static int usbtmc_open(struct inode *inode, struct file *filp) | |||
128 | filp->private_data = data; | 130 | filp->private_data = data; |
129 | 131 | ||
130 | exit: | 132 | exit: |
133 | unlock_kernel(); | ||
131 | return retval; | 134 | return retval; |
132 | } | 135 | } |
133 | 136 | ||
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index bfc6c2eea647..c3536f151f02 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
@@ -34,7 +34,6 @@ static int usb_open(struct inode * inode, struct file * file) | |||
34 | int err = -ENODEV; | 34 | int err = -ENODEV; |
35 | const struct file_operations *old_fops, *new_fops = NULL; | 35 | const struct file_operations *old_fops, *new_fops = NULL; |
36 | 36 | ||
37 | lock_kernel(); | ||
38 | down_read(&minor_rwsem); | 37 | down_read(&minor_rwsem); |
39 | c = usb_minors[minor]; | 38 | c = usb_minors[minor]; |
40 | 39 | ||
@@ -53,7 +52,6 @@ static int usb_open(struct inode * inode, struct file * file) | |||
53 | fops_put(old_fops); | 52 | fops_put(old_fops); |
54 | done: | 53 | done: |
55 | up_read(&minor_rwsem); | 54 | up_read(&minor_rwsem); |
56 | unlock_kernel(); | ||
57 | return err; | 55 | return err; |
58 | } | 56 | } |
59 | 57 | ||
diff --git a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c index e192e8f7c560..dce4f7b69ac3 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c | |||
@@ -96,6 +96,7 @@ | |||
96 | #include <linux/module.h> | 96 | #include <linux/module.h> |
97 | #include <linux/wait.h> | 97 | #include <linux/wait.h> |
98 | #include <linux/mutex.h> | 98 | #include <linux/mutex.h> |
99 | #include <linux/smp_lock.h> | ||
99 | 100 | ||
100 | #include <linux/usb.h> | 101 | #include <linux/usb.h> |
101 | #include <linux/fs.h> | 102 | #include <linux/fs.h> |
@@ -622,6 +623,7 @@ static int mdc800_device_open (struct inode* inode, struct file *file) | |||
622 | int retval=0; | 623 | int retval=0; |
623 | int errn=0; | 624 | int errn=0; |
624 | 625 | ||
626 | lock_kernel(); | ||
625 | mutex_lock(&mdc800->io_lock); | 627 | mutex_lock(&mdc800->io_lock); |
626 | 628 | ||
627 | if (mdc800->state == NOT_CONNECTED) | 629 | if (mdc800->state == NOT_CONNECTED) |
@@ -660,6 +662,7 @@ static int mdc800_device_open (struct inode* inode, struct file *file) | |||
660 | 662 | ||
661 | error_out: | 663 | error_out: |
662 | mutex_unlock(&mdc800->io_lock); | 664 | mutex_unlock(&mdc800->io_lock); |
665 | unlock_kernel(); | ||
663 | return errn; | 666 | return errn; |
664 | } | 667 | } |
665 | 668 | ||
diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c index 306e97825b36..ac8ad91c2dac 100644 --- a/drivers/usb/misc/adutux.c +++ b/drivers/usb/misc/adutux.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/usb.h> | 26 | #include <linux/usb.h> |
27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
28 | #include <linux/smp_lock.h> | ||
28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
29 | 30 | ||
30 | #ifdef CONFIG_USB_DEBUG | 31 | #ifdef CONFIG_USB_DEBUG |
@@ -274,6 +275,7 @@ static int adu_open(struct inode *inode, struct file *file) | |||
274 | 275 | ||
275 | dbg(2,"%s : enter", __func__); | 276 | dbg(2,"%s : enter", __func__); |
276 | 277 | ||
278 | lock_kernel(); | ||
277 | subminor = iminor(inode); | 279 | subminor = iminor(inode); |
278 | 280 | ||
279 | if ((retval = mutex_lock_interruptible(&adutux_mutex))) { | 281 | if ((retval = mutex_lock_interruptible(&adutux_mutex))) { |
@@ -332,6 +334,7 @@ static int adu_open(struct inode *inode, struct file *file) | |||
332 | exit_no_device: | 334 | exit_no_device: |
333 | mutex_unlock(&adutux_mutex); | 335 | mutex_unlock(&adutux_mutex); |
334 | exit_no_lock: | 336 | exit_no_lock: |
337 | unlock_kernel(); | ||
335 | dbg(2,"%s : leave, return value %d ", __func__, retval); | 338 | dbg(2,"%s : leave, return value %d ", __func__, retval); |
336 | return retval; | 339 | return retval; |
337 | } | 340 | } |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index f21bf5160f83..32c47fbee288 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/module.h> | 45 | #include <linux/module.h> |
46 | #include <linux/kref.h> | 46 | #include <linux/kref.h> |
47 | #include <linux/mutex.h> | 47 | #include <linux/mutex.h> |
48 | #include <linux/smp_lock.h> | ||
48 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
49 | #include <linux/usb.h> | 50 | #include <linux/usb.h> |
50 | #include <linux/workqueue.h> | 51 | #include <linux/workqueue.h> |
@@ -623,22 +624,30 @@ static void ftdi_elan_status_work(struct work_struct *work) | |||
623 | */ | 624 | */ |
624 | static int ftdi_elan_open(struct inode *inode, struct file *file) | 625 | static int ftdi_elan_open(struct inode *inode, struct file *file) |
625 | { | 626 | { |
626 | int subminor = iminor(inode); | 627 | int subminor; |
627 | struct usb_interface *interface = usb_find_interface(&ftdi_elan_driver, | 628 | struct usb_interface *interface; |
628 | subminor); | 629 | |
630 | lock_kernel(); | ||
631 | subminor = iminor(inode); | ||
632 | interface = usb_find_interface(&ftdi_elan_driver, subminor); | ||
633 | |||
629 | if (!interface) { | 634 | if (!interface) { |
635 | unlock_kernel(); | ||
630 | printk(KERN_ERR "can't find device for minor %d\n", subminor); | 636 | printk(KERN_ERR "can't find device for minor %d\n", subminor); |
631 | return -ENODEV; | 637 | return -ENODEV; |
632 | } else { | 638 | } else { |
633 | struct usb_ftdi *ftdi = usb_get_intfdata(interface); | 639 | struct usb_ftdi *ftdi = usb_get_intfdata(interface); |
634 | if (!ftdi) { | 640 | if (!ftdi) { |
641 | unlock_kernel(); | ||
635 | return -ENODEV; | 642 | return -ENODEV; |
636 | } else { | 643 | } else { |
637 | if (down_interruptible(&ftdi->sw_lock)) { | 644 | if (down_interruptible(&ftdi->sw_lock)) { |
645 | unlock_kernel(); | ||
638 | return -EINTR; | 646 | return -EINTR; |
639 | } else { | 647 | } else { |
640 | ftdi_elan_get_kref(ftdi); | 648 | ftdi_elan_get_kref(ftdi); |
641 | file->private_data = ftdi; | 649 | file->private_data = ftdi; |
650 | unlock_kernel(); | ||
642 | return 0; | 651 | return 0; |
643 | } | 652 | } |
644 | } | 653 | } |
diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index a54c3cb804ce..68df9ac76699 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
25 | #include <linux/completion.h> | 25 | #include <linux/completion.h> |
26 | #include <linux/mutex.h> | 26 | #include <linux/mutex.h> |
27 | #include <linux/smp_lock.h> | ||
27 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
28 | #include <linux/usb.h> | 29 | #include <linux/usb.h> |
29 | 30 | ||
@@ -226,16 +227,20 @@ static int idmouse_open(struct inode *inode, struct file *file) | |||
226 | struct usb_interface *interface; | 227 | struct usb_interface *interface; |
227 | int result; | 228 | int result; |
228 | 229 | ||
230 | lock_kernel(); | ||
229 | /* get the interface from minor number and driver information */ | 231 | /* get the interface from minor number and driver information */ |
230 | interface = usb_find_interface (&idmouse_driver, iminor (inode)); | 232 | interface = usb_find_interface (&idmouse_driver, iminor (inode)); |
231 | if (!interface) | 233 | if (!interface) { |
234 | unlock_kernel(); | ||
232 | return -ENODEV; | 235 | return -ENODEV; |
236 | } | ||
233 | 237 | ||
234 | mutex_lock(&open_disc_mutex); | 238 | mutex_lock(&open_disc_mutex); |
235 | /* get the device information block from the interface */ | 239 | /* get the device information block from the interface */ |
236 | dev = usb_get_intfdata(interface); | 240 | dev = usb_get_intfdata(interface); |
237 | if (!dev) { | 241 | if (!dev) { |
238 | mutex_unlock(&open_disc_mutex); | 242 | mutex_unlock(&open_disc_mutex); |
243 | unlock_kernel(); | ||
239 | return -ENODEV; | 244 | return -ENODEV; |
240 | } | 245 | } |
241 | 246 | ||
@@ -272,6 +277,7 @@ error: | |||
272 | 277 | ||
273 | /* unlock this device */ | 278 | /* unlock this device */ |
274 | mutex_unlock(&dev->lock); | 279 | mutex_unlock(&dev->lock); |
280 | unlock_kernel(); | ||
275 | return result; | 281 | return result; |
276 | } | 282 | } |
277 | 283 | ||
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index 5206423211fb..d3c852363883 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c | |||
@@ -602,10 +602,12 @@ static int iowarrior_open(struct inode *inode, struct file *file) | |||
602 | 602 | ||
603 | dbg("%s", __func__); | 603 | dbg("%s", __func__); |
604 | 604 | ||
605 | lock_kernel(); | ||
605 | subminor = iminor(inode); | 606 | subminor = iminor(inode); |
606 | 607 | ||
607 | interface = usb_find_interface(&iowarrior_driver, subminor); | 608 | interface = usb_find_interface(&iowarrior_driver, subminor); |
608 | if (!interface) { | 609 | if (!interface) { |
610 | unlock_kernel(); | ||
609 | err("%s - error, can't find device for minor %d", __func__, | 611 | err("%s - error, can't find device for minor %d", __func__, |
610 | subminor); | 612 | subminor); |
611 | return -ENODEV; | 613 | return -ENODEV; |
@@ -615,6 +617,7 @@ static int iowarrior_open(struct inode *inode, struct file *file) | |||
615 | dev = usb_get_intfdata(interface); | 617 | dev = usb_get_intfdata(interface); |
616 | if (!dev) { | 618 | if (!dev) { |
617 | mutex_unlock(&iowarrior_open_disc_lock); | 619 | mutex_unlock(&iowarrior_open_disc_lock); |
620 | unlock_kernel(); | ||
618 | return -ENODEV; | 621 | return -ENODEV; |
619 | } | 622 | } |
620 | 623 | ||
@@ -641,6 +644,7 @@ static int iowarrior_open(struct inode *inode, struct file *file) | |||
641 | 644 | ||
642 | out: | 645 | out: |
643 | mutex_unlock(&dev->mutex); | 646 | mutex_unlock(&dev->mutex); |
647 | unlock_kernel(); | ||
644 | return retval; | 648 | return retval; |
645 | } | 649 | } |
646 | 650 | ||
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index 7c0bd13eccb2..8de32df5978a 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
35 | #include <linux/mutex.h> | 35 | #include <linux/mutex.h> |
36 | #include <linux/smp_lock.h> | ||
36 | 37 | ||
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
38 | #include <linux/input.h> | 39 | #include <linux/input.h> |
@@ -296,12 +297,14 @@ static int ld_usb_open(struct inode *inode, struct file *file) | |||
296 | int retval; | 297 | int retval; |
297 | struct usb_interface *interface; | 298 | struct usb_interface *interface; |
298 | 299 | ||
300 | lock_kernel(); | ||
299 | nonseekable_open(inode, file); | 301 | nonseekable_open(inode, file); |
300 | subminor = iminor(inode); | 302 | subminor = iminor(inode); |
301 | 303 | ||
302 | interface = usb_find_interface(&ld_usb_driver, subminor); | 304 | interface = usb_find_interface(&ld_usb_driver, subminor); |
303 | 305 | ||
304 | if (!interface) { | 306 | if (!interface) { |
307 | unlock_kernel(); | ||
305 | err("%s - error, can't find device for minor %d\n", | 308 | err("%s - error, can't find device for minor %d\n", |
306 | __func__, subminor); | 309 | __func__, subminor); |
307 | return -ENODEV; | 310 | return -ENODEV; |
@@ -309,12 +312,16 @@ static int ld_usb_open(struct inode *inode, struct file *file) | |||
309 | 312 | ||
310 | dev = usb_get_intfdata(interface); | 313 | dev = usb_get_intfdata(interface); |
311 | 314 | ||
312 | if (!dev) | 315 | if (!dev) { |
316 | unlock_kernel(); | ||
313 | return -ENODEV; | 317 | return -ENODEV; |
318 | } | ||
314 | 319 | ||
315 | /* lock this device */ | 320 | /* lock this device */ |
316 | if (mutex_lock_interruptible(&dev->mutex)) | 321 | if (mutex_lock_interruptible(&dev->mutex)) { |
322 | unlock_kernel(); | ||
317 | return -ERESTARTSYS; | 323 | return -ERESTARTSYS; |
324 | } | ||
318 | 325 | ||
319 | /* allow opening only once */ | 326 | /* allow opening only once */ |
320 | if (dev->open_count) { | 327 | if (dev->open_count) { |
@@ -353,6 +360,7 @@ static int ld_usb_open(struct inode *inode, struct file *file) | |||
353 | 360 | ||
354 | unlock_exit: | 361 | unlock_exit: |
355 | mutex_unlock(&dev->mutex); | 362 | mutex_unlock(&dev->mutex); |
363 | unlock_kernel(); | ||
356 | 364 | ||
357 | return retval; | 365 | return retval; |
358 | } | 366 | } |
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 3d4378fb4410..94e1b84134dd 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c | |||
@@ -82,6 +82,7 @@ | |||
82 | #include <linux/module.h> | 82 | #include <linux/module.h> |
83 | #include <linux/completion.h> | 83 | #include <linux/completion.h> |
84 | #include <linux/mutex.h> | 84 | #include <linux/mutex.h> |
85 | #include <linux/smp_lock.h> | ||
85 | #include <asm/uaccess.h> | 86 | #include <asm/uaccess.h> |
86 | #include <linux/usb.h> | 87 | #include <linux/usb.h> |
87 | #include <linux/poll.h> | 88 | #include <linux/poll.h> |
@@ -345,6 +346,7 @@ static int tower_open (struct inode *inode, struct file *file) | |||
345 | 346 | ||
346 | dbg(2, "%s: enter", __func__); | 347 | dbg(2, "%s: enter", __func__); |
347 | 348 | ||
349 | lock_kernel(); | ||
348 | nonseekable_open(inode, file); | 350 | nonseekable_open(inode, file); |
349 | subminor = iminor(inode); | 351 | subminor = iminor(inode); |
350 | 352 | ||
@@ -430,6 +432,7 @@ unlock_exit: | |||
430 | mutex_unlock(&dev->lock); | 432 | mutex_unlock(&dev->lock); |
431 | 433 | ||
432 | exit: | 434 | exit: |
435 | unlock_kernel(); | ||
433 | dbg(2, "%s: leave, return value %d ", __func__, retval); | 436 | dbg(2, "%s: leave, return value %d ", __func__, retval); |
434 | 437 | ||
435 | return retval; | 438 | return retval; |
diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c index 17e4eecaee73..47ce46bb5b01 100644 --- a/drivers/usb/misc/rio500.c +++ b/drivers/usb/misc/rio500.c | |||
@@ -77,7 +77,7 @@ static struct rio_usb_data rio_instance; | |||
77 | static int open_rio(struct inode *inode, struct file *file) | 77 | static int open_rio(struct inode *inode, struct file *file) |
78 | { | 78 | { |
79 | struct rio_usb_data *rio = &rio_instance; | 79 | struct rio_usb_data *rio = &rio_instance; |
80 | 80 | lock_kernel(); | |
81 | mutex_lock(&(rio->lock)); | 81 | mutex_lock(&(rio->lock)); |
82 | 82 | ||
83 | if (rio->isopen || !rio->present) { | 83 | if (rio->isopen || !rio->present) { |
@@ -91,6 +91,7 @@ static int open_rio(struct inode *inode, struct file *file) | |||
91 | mutex_unlock(&(rio->lock)); | 91 | mutex_unlock(&(rio->lock)); |
92 | 92 | ||
93 | dev_info(&rio->rio_dev->dev, "Rio opened.\n"); | 93 | dev_info(&rio->rio_dev->dev, "Rio opened.\n"); |
94 | unlock_kernel(); | ||
94 | 95 | ||
95 | return 0; | 96 | return 0; |
96 | } | 97 | } |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index bb0b315b521d..3991655f8f09 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -2416,21 +2416,28 @@ sisusb_open(struct inode *inode, struct file *file) | |||
2416 | struct usb_interface *interface; | 2416 | struct usb_interface *interface; |
2417 | int subminor = iminor(inode); | 2417 | int subminor = iminor(inode); |
2418 | 2418 | ||
2419 | if (!(interface = usb_find_interface(&sisusb_driver, subminor))) | 2419 | lock_kernel(); |
2420 | if (!(interface = usb_find_interface(&sisusb_driver, subminor))) { | ||
2421 | unlock_kernel(); | ||
2420 | return -ENODEV; | 2422 | return -ENODEV; |
2423 | } | ||
2421 | 2424 | ||
2422 | if (!(sisusb = usb_get_intfdata(interface))) | 2425 | if (!(sisusb = usb_get_intfdata(interface))) { |
2426 | unlock_kernel(); | ||
2423 | return -ENODEV; | 2427 | return -ENODEV; |
2428 | } | ||
2424 | 2429 | ||
2425 | mutex_lock(&sisusb->lock); | 2430 | mutex_lock(&sisusb->lock); |
2426 | 2431 | ||
2427 | if (!sisusb->present || !sisusb->ready) { | 2432 | if (!sisusb->present || !sisusb->ready) { |
2428 | mutex_unlock(&sisusb->lock); | 2433 | mutex_unlock(&sisusb->lock); |
2434 | unlock_kernel(); | ||
2429 | return -ENODEV; | 2435 | return -ENODEV; |
2430 | } | 2436 | } |
2431 | 2437 | ||
2432 | if (sisusb->isopen) { | 2438 | if (sisusb->isopen) { |
2433 | mutex_unlock(&sisusb->lock); | 2439 | mutex_unlock(&sisusb->lock); |
2440 | unlock_kernel(); | ||
2434 | return -EBUSY; | 2441 | return -EBUSY; |
2435 | } | 2442 | } |
2436 | 2443 | ||
@@ -2439,11 +2446,13 @@ sisusb_open(struct inode *inode, struct file *file) | |||
2439 | if (sisusb_init_gfxdevice(sisusb, 0)) { | 2446 | if (sisusb_init_gfxdevice(sisusb, 0)) { |
2440 | mutex_unlock(&sisusb->lock); | 2447 | mutex_unlock(&sisusb->lock); |
2441 | dev_err(&sisusb->sisusb_dev->dev, "Failed to initialize device\n"); | 2448 | dev_err(&sisusb->sisusb_dev->dev, "Failed to initialize device\n"); |
2449 | unlock_kernel(); | ||
2442 | return -EIO; | 2450 | return -EIO; |
2443 | } | 2451 | } |
2444 | } else { | 2452 | } else { |
2445 | mutex_unlock(&sisusb->lock); | 2453 | mutex_unlock(&sisusb->lock); |
2446 | dev_err(&sisusb->sisusb_dev->dev, "Device not attached to USB 2.0 hub\n"); | 2454 | dev_err(&sisusb->sisusb_dev->dev, "Device not attached to USB 2.0 hub\n"); |
2455 | unlock_kernel(); | ||
2447 | return -EIO; | 2456 | return -EIO; |
2448 | } | 2457 | } |
2449 | } | 2458 | } |
@@ -2456,6 +2465,7 @@ sisusb_open(struct inode *inode, struct file *file) | |||
2456 | file->private_data = sisusb; | 2465 | file->private_data = sisusb; |
2457 | 2466 | ||
2458 | mutex_unlock(&sisusb->lock); | 2467 | mutex_unlock(&sisusb->lock); |
2468 | unlock_kernel(); | ||
2459 | 2469 | ||
2460 | return 0; | 2470 | return 0; |
2461 | } | 2471 | } |
diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index 499d7508be9a..90aede90553e 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c | |||
@@ -74,10 +74,12 @@ static int lcd_open(struct inode *inode, struct file *file) | |||
74 | struct usb_interface *interface; | 74 | struct usb_interface *interface; |
75 | int subminor, r; | 75 | int subminor, r; |
76 | 76 | ||
77 | lock_kernel(); | ||
77 | subminor = iminor(inode); | 78 | subminor = iminor(inode); |
78 | 79 | ||
79 | interface = usb_find_interface(&lcd_driver, subminor); | 80 | interface = usb_find_interface(&lcd_driver, subminor); |
80 | if (!interface) { | 81 | if (!interface) { |
82 | unlock_kernel(); | ||
81 | err ("USBLCD: %s - error, can't find device for minor %d", | 83 | err ("USBLCD: %s - error, can't find device for minor %d", |
82 | __func__, subminor); | 84 | __func__, subminor); |
83 | return -ENODEV; | 85 | return -ENODEV; |
@@ -87,6 +89,7 @@ static int lcd_open(struct inode *inode, struct file *file) | |||
87 | dev = usb_get_intfdata(interface); | 89 | dev = usb_get_intfdata(interface); |
88 | if (!dev) { | 90 | if (!dev) { |
89 | mutex_unlock(&open_disc_mutex); | 91 | mutex_unlock(&open_disc_mutex); |
92 | unlock_kernel(); | ||
90 | return -ENODEV; | 93 | return -ENODEV; |
91 | } | 94 | } |
92 | 95 | ||
@@ -98,11 +101,13 @@ static int lcd_open(struct inode *inode, struct file *file) | |||
98 | r = usb_autopm_get_interface(interface); | 101 | r = usb_autopm_get_interface(interface); |
99 | if (r < 0) { | 102 | if (r < 0) { |
100 | kref_put(&dev->kref, lcd_delete); | 103 | kref_put(&dev->kref, lcd_delete); |
104 | unlock_kernel(); | ||
101 | return r; | 105 | return r; |
102 | } | 106 | } |
103 | 107 | ||
104 | /* save our object in the file's private structure */ | 108 | /* save our object in the file's private structure */ |
105 | file->private_data = dev; | 109 | file->private_data = dev; |
110 | unlock_kernel(); | ||
106 | 111 | ||
107 | return 0; | 112 | return 0; |
108 | } | 113 | } |
diff --git a/drivers/usb/misc/vstusb.c b/drivers/usb/misc/vstusb.c index 874c81bb27b9..b787b25d4cc4 100644 --- a/drivers/usb/misc/vstusb.c +++ b/drivers/usb/misc/vstusb.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
30 | #include <linux/smp_lock.h> | ||
30 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
31 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
32 | 33 | ||
@@ -103,19 +104,23 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
103 | struct vstusb_device *vstdev; | 104 | struct vstusb_device *vstdev; |
104 | struct usb_interface *interface; | 105 | struct usb_interface *interface; |
105 | 106 | ||
107 | lock_kernel(); | ||
106 | interface = usb_find_interface(&vstusb_driver, iminor(inode)); | 108 | interface = usb_find_interface(&vstusb_driver, iminor(inode)); |
107 | 109 | ||
108 | if (!interface) { | 110 | if (!interface) { |
109 | printk(KERN_ERR KBUILD_MODNAME | 111 | printk(KERN_ERR KBUILD_MODNAME |
110 | ": %s - error, can't find device for minor %d\n", | 112 | ": %s - error, can't find device for minor %d\n", |
111 | __func__, iminor(inode)); | 113 | __func__, iminor(inode)); |
114 | unlock_kernel(); | ||
112 | return -ENODEV; | 115 | return -ENODEV; |
113 | } | 116 | } |
114 | 117 | ||
115 | vstdev = usb_get_intfdata(interface); | 118 | vstdev = usb_get_intfdata(interface); |
116 | 119 | ||
117 | if (!vstdev) | 120 | if (!vstdev) { |
121 | unlock_kernel(); | ||
118 | return -ENODEV; | 122 | return -ENODEV; |
123 | } | ||
119 | 124 | ||
120 | /* lock this device */ | 125 | /* lock this device */ |
121 | mutex_lock(&vstdev->lock); | 126 | mutex_lock(&vstdev->lock); |
@@ -123,6 +128,7 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
123 | /* can only open one time */ | 128 | /* can only open one time */ |
124 | if ((!vstdev->present) || (vstdev->isopen)) { | 129 | if ((!vstdev->present) || (vstdev->isopen)) { |
125 | mutex_unlock(&vstdev->lock); | 130 | mutex_unlock(&vstdev->lock); |
131 | unlock_kernel(); | ||
126 | return -EBUSY; | 132 | return -EBUSY; |
127 | } | 133 | } |
128 | 134 | ||
@@ -137,6 +143,7 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
137 | dev_dbg(&vstdev->usb_dev->dev, "%s: opened\n", __func__); | 143 | dev_dbg(&vstdev->usb_dev->dev, "%s: opened\n", __func__); |
138 | 144 | ||
139 | mutex_unlock(&vstdev->lock); | 145 | mutex_unlock(&vstdev->lock); |
146 | unlock_kernel(); | ||
140 | 147 | ||
141 | return 0; | 148 | return 0; |
142 | } | 149 | } |
diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 61522787f39c..e94176bfd272 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kref.h> | 20 | #include <linux/kref.h> |
21 | #include <linux/smp_lock.h> | ||
21 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> |
22 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
23 | #include <linux/mutex.h> | 24 | #include <linux/mutex.h> |
@@ -90,6 +91,7 @@ static int skel_open(struct inode *inode, struct file *file) | |||
90 | int subminor; | 91 | int subminor; |
91 | int retval = 0; | 92 | int retval = 0; |
92 | 93 | ||
94 | lock_kernel(); | ||
93 | subminor = iminor(inode); | 95 | subminor = iminor(inode); |
94 | 96 | ||
95 | interface = usb_find_interface(&skel_driver, subminor); | 97 | interface = usb_find_interface(&skel_driver, subminor); |
@@ -135,6 +137,7 @@ static int skel_open(struct inode *inode, struct file *file) | |||
135 | mutex_unlock(&dev->io_mutex); | 137 | mutex_unlock(&dev->io_mutex); |
136 | 138 | ||
137 | exit: | 139 | exit: |
140 | unlock_kernel(); | ||
138 | return retval; | 141 | return retval; |
139 | } | 142 | } |
140 | 143 | ||