Commit 86266452f80545285c14e20a8024f79c4fb88a86

Authored by Oliver Neukum
Committed by Greg Kroah-Hartman
1 parent f9de332ebf

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>

Showing 20 changed files with 99 additions and 15 deletions Side-by-side Diff

drivers/hid/usbhid/hiddev.c
... ... @@ -265,9 +265,10 @@
265 265 static int hiddev_open(struct inode *inode, struct file *file)
266 266 {
267 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 273 if (i >= HIDDEV_MINORS || i < 0 || !hiddev_table[i])
273 274 return -ENODEV;
274 275  
... ... @@ -313,10 +314,12 @@
313 314 usbhid_open(hid);
314 315 }
315 316  
  317 + unlock_kernel();
316 318 return 0;
317 319 bail:
318 320 file->private_data = NULL;
319 321 kfree(list);
  322 + unlock_kernel();
320 323 return res;
321 324 }
322 325  
drivers/media/video/dabusb.c
... ... @@ -616,10 +616,12 @@
616 616 {
617 617 int devnum = iminor(inode);
618 618 pdabusb_t s;
  619 + int r;
619 620  
620 621 if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB))
621 622 return -EIO;
622 623  
  624 + lock_kernel();
623 625 s = &dabusb[devnum - DABUSB_MINOR];
624 626  
625 627 dbg("dabusb_open");
... ... @@ -634,6 +636,7 @@
634 636 msleep_interruptible(500);
635 637  
636 638 if (signal_pending (current)) {
  639 + unlock_kernel();
637 640 return -EAGAIN;
638 641 }
639 642 mutex_lock(&s->mutex);
... ... @@ -641,6 +644,7 @@
641 644 if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
642 645 mutex_unlock(&s->mutex);
643 646 dev_err(&s->usbdev->dev, "set_interface failed\n");
  647 + unlock_kernel();
644 648 return -EINVAL;
645 649 }
646 650 s->opened = 1;
... ... @@ -649,7 +653,9 @@
649 653 file->f_pos = 0;
650 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 661 static int dabusb_release (struct inode *inode, struct file *file)
drivers/staging/frontier/alphatrack.c
... ... @@ -41,6 +41,7 @@
41 41 #include <linux/mutex.h>
42 42  
43 43 #include <linux/uaccess.h>
  44 +#include <linux/smp_lock.h>
44 45 #include <linux/input.h>
45 46 #include <linux/usb.h>
46 47 #include <linux/poll.h>
... ... @@ -325,6 +326,7 @@
325 326 int retval = 0;
326 327 struct usb_interface *interface;
327 328  
  329 + lock_kernel();
328 330 nonseekable_open(inode, file);
329 331 subminor = iminor(inode);
330 332  
... ... @@ -394,6 +396,7 @@
394 396  
395 397 unlock_disconnect_exit:
396 398 mutex_unlock(&disconnect_mutex);
  399 + unlock_kernel();
397 400  
398 401 return retval;
399 402 }
drivers/staging/frontier/tranzport.c
... ... @@ -40,6 +40,7 @@
40 40 #include <linux/mutex.h>
41 41  
42 42 #include <linux/uaccess.h>
  43 +#include <linux/smp_lock.h>
43 44 #include <linux/input.h>
44 45 #include <linux/usb.h>
45 46 #include <linux/poll.h>
... ... @@ -343,6 +344,7 @@
343 344 int retval = 0;
344 345 struct usb_interface *interface;
345 346  
  347 + lock_kernel();
346 348 nonseekable_open(inode, file);
347 349 subminor = iminor(inode);
348 350  
... ... @@ -413,6 +415,7 @@
413 415  
414 416 unlock_disconnect_exit:
415 417 mutex_unlock(&disconnect_mutex);
  418 + unlock_kernel();
416 419  
417 420 return retval;
418 421 }
drivers/usb/class/cdc-wdm.c
... ... @@ -19,6 +19,7 @@
19 19 #include <linux/uaccess.h>
20 20 #include <linux/bitops.h>
21 21 #include <linux/poll.h>
  22 +#include <linux/smp_lock.h>
22 23 #include <linux/usb.h>
23 24 #include <linux/usb/cdc.h>
24 25 #include <asm/byteorder.h>
... ... @@ -516,6 +517,7 @@
516 517 struct usb_interface *intf;
517 518 struct wdm_device *desc;
518 519  
  520 + lock_kernel();
519 521 mutex_lock(&wdm_mutex);
520 522 intf = usb_find_interface(&wdm_driver, minor);
521 523 if (!intf)
... ... @@ -548,6 +550,7 @@
548 550 usb_autopm_put_interface(desc->intf);
549 551 out:
550 552 mutex_unlock(&wdm_mutex);
  553 + unlock_kernel();
551 554 return rv;
552 555 }
553 556  
drivers/usb/class/usblp.c
... ... @@ -56,6 +56,7 @@
56 56 #include <linux/slab.h>
57 57 #include <linux/lp.h>
58 58 #include <linux/mutex.h>
  59 +#include <linux/smp_lock.h>
59 60 #undef DEBUG
60 61 #include <linux/usb.h>
61 62  
... ... @@ -395,6 +396,7 @@
395 396 if (minor < 0)
396 397 return -ENODEV;
397 398  
  399 + lock_kernel();
398 400 mutex_lock (&usblp_mutex);
399 401  
400 402 retval = -ENODEV;
... ... @@ -434,6 +436,7 @@
434 436 }
435 437 out:
436 438 mutex_unlock (&usblp_mutex);
  439 + unlock_kernel();
437 440 return retval;
438 441 }
439 442  
drivers/usb/class/usbtmc.c
... ... @@ -26,6 +26,7 @@
26 26 #include <linux/uaccess.h>
27 27 #include <linux/kref.h>
28 28 #include <linux/mutex.h>
  29 +#include <linux/smp_lock.h>
29 30 #include <linux/usb.h>
30 31 #include <linux/usb/tmc.h>
31 32  
... ... @@ -113,6 +114,7 @@
113 114 struct usbtmc_device_data *data;
114 115 int retval = 0;
115 116  
  117 + lock_kernel();
116 118 intf = usb_find_interface(&usbtmc_driver, iminor(inode));
117 119 if (!intf) {
118 120 printk(KERN_ERR KBUILD_MODNAME
... ... @@ -128,6 +130,7 @@
128 130 filp->private_data = data;
129 131  
130 132 exit:
  133 + unlock_kernel();
131 134 return retval;
132 135 }
133 136  
drivers/usb/core/file.c
... ... @@ -34,7 +34,6 @@
34 34 int err = -ENODEV;
35 35 const struct file_operations *old_fops, *new_fops = NULL;
36 36  
37   - lock_kernel();
38 37 down_read(&minor_rwsem);
39 38 c = usb_minors[minor];
40 39  
... ... @@ -53,7 +52,6 @@
53 52 fops_put(old_fops);
54 53 done:
55 54 up_read(&minor_rwsem);
56   - unlock_kernel();
57 55 return err;
58 56 }
59 57  
drivers/usb/image/mdc800.c
... ... @@ -96,6 +96,7 @@
96 96 #include <linux/module.h>
97 97 #include <linux/wait.h>
98 98 #include <linux/mutex.h>
  99 +#include <linux/smp_lock.h>
99 100  
100 101 #include <linux/usb.h>
101 102 #include <linux/fs.h>
... ... @@ -622,6 +623,7 @@
622 623 int retval=0;
623 624 int errn=0;
624 625  
  626 + lock_kernel();
625 627 mutex_lock(&mdc800->io_lock);
626 628  
627 629 if (mdc800->state == NOT_CONNECTED)
... ... @@ -660,6 +662,7 @@
660 662  
661 663 error_out:
662 664 mutex_unlock(&mdc800->io_lock);
  665 + unlock_kernel();
663 666 return errn;
664 667 }
665 668  
drivers/usb/misc/adutux.c
... ... @@ -25,6 +25,7 @@
25 25 #include <linux/module.h>
26 26 #include <linux/usb.h>
27 27 #include <linux/mutex.h>
  28 +#include <linux/smp_lock.h>
28 29 #include <asm/uaccess.h>
29 30  
30 31 #ifdef CONFIG_USB_DEBUG
... ... @@ -274,6 +275,7 @@
274 275  
275 276 dbg(2,"%s : enter", __func__);
276 277  
  278 + lock_kernel();
277 279 subminor = iminor(inode);
278 280  
279 281 if ((retval = mutex_lock_interruptible(&adutux_mutex))) {
... ... @@ -332,6 +334,7 @@
332 334 exit_no_device:
333 335 mutex_unlock(&adutux_mutex);
334 336 exit_no_lock:
  337 + unlock_kernel();
335 338 dbg(2,"%s : leave, return value %d ", __func__, retval);
336 339 return retval;
337 340 }
drivers/usb/misc/ftdi-elan.c
... ... @@ -45,6 +45,7 @@
45 45 #include <linux/module.h>
46 46 #include <linux/kref.h>
47 47 #include <linux/mutex.h>
  48 +#include <linux/smp_lock.h>
48 49 #include <asm/uaccess.h>
49 50 #include <linux/usb.h>
50 51 #include <linux/workqueue.h>
51 52  
52 53  
53 54  
54 55  
... ... @@ -623,22 +624,30 @@
623 624 */
624 625 static int ftdi_elan_open(struct inode *inode, struct file *file)
625 626 {
626   - int subminor = iminor(inode);
627   - struct usb_interface *interface = usb_find_interface(&ftdi_elan_driver,
628   - subminor);
  627 + int subminor;
  628 + struct usb_interface *interface;
  629 +
  630 + lock_kernel();
  631 + subminor = iminor(inode);
  632 + interface = usb_find_interface(&ftdi_elan_driver, subminor);
  633 +
629 634 if (!interface) {
  635 + unlock_kernel();
630 636 printk(KERN_ERR "can't find device for minor %d\n", subminor);
631 637 return -ENODEV;
632 638 } else {
633 639 struct usb_ftdi *ftdi = usb_get_intfdata(interface);
634 640 if (!ftdi) {
  641 + unlock_kernel();
635 642 return -ENODEV;
636 643 } else {
637 644 if (down_interruptible(&ftdi->sw_lock)) {
  645 + unlock_kernel();
638 646 return -EINTR;
639 647 } else {
640 648 ftdi_elan_get_kref(ftdi);
641 649 file->private_data = ftdi;
  650 + unlock_kernel();
642 651 return 0;
643 652 }
644 653 }
drivers/usb/misc/idmouse.c
... ... @@ -24,6 +24,7 @@
24 24 #include <linux/module.h>
25 25 #include <linux/completion.h>
26 26 #include <linux/mutex.h>
  27 +#include <linux/smp_lock.h>
27 28 #include <asm/uaccess.h>
28 29 #include <linux/usb.h>
29 30  
30 31  
31 32  
32 33  
... ... @@ -226,16 +227,20 @@
226 227 struct usb_interface *interface;
227 228 int result;
228 229  
  230 + lock_kernel();
229 231 /* get the interface from minor number and driver information */
230 232 interface = usb_find_interface (&idmouse_driver, iminor (inode));
231   - if (!interface)
  233 + if (!interface) {
  234 + unlock_kernel();
232 235 return -ENODEV;
  236 + }
233 237  
234 238 mutex_lock(&open_disc_mutex);
235 239 /* get the device information block from the interface */
236 240 dev = usb_get_intfdata(interface);
237 241 if (!dev) {
238 242 mutex_unlock(&open_disc_mutex);
  243 + unlock_kernel();
239 244 return -ENODEV;
240 245 }
241 246  
... ... @@ -272,6 +277,7 @@
272 277  
273 278 /* unlock this device */
274 279 mutex_unlock(&dev->lock);
  280 + unlock_kernel();
275 281 return result;
276 282 }
277 283  
drivers/usb/misc/iowarrior.c
... ... @@ -602,10 +602,12 @@
602 602  
603 603 dbg("%s", __func__);
604 604  
  605 + lock_kernel();
605 606 subminor = iminor(inode);
606 607  
607 608 interface = usb_find_interface(&iowarrior_driver, subminor);
608 609 if (!interface) {
  610 + unlock_kernel();
609 611 err("%s - error, can't find device for minor %d", __func__,
610 612 subminor);
611 613 return -ENODEV;
... ... @@ -615,6 +617,7 @@
615 617 dev = usb_get_intfdata(interface);
616 618 if (!dev) {
617 619 mutex_unlock(&iowarrior_open_disc_lock);
  620 + unlock_kernel();
618 621 return -ENODEV;
619 622 }
620 623  
... ... @@ -641,6 +644,7 @@
641 644  
642 645 out:
643 646 mutex_unlock(&dev->mutex);
  647 + unlock_kernel();
644 648 return retval;
645 649 }
646 650  
drivers/usb/misc/ldusb.c
... ... @@ -33,6 +33,7 @@
33 33 #include <linux/slab.h>
34 34 #include <linux/module.h>
35 35 #include <linux/mutex.h>
  36 +#include <linux/smp_lock.h>
36 37  
37 38 #include <asm/uaccess.h>
38 39 #include <linux/input.h>
39 40  
... ... @@ -296,12 +297,14 @@
296 297 int retval;
297 298 struct usb_interface *interface;
298 299  
  300 + lock_kernel();
299 301 nonseekable_open(inode, file);
300 302 subminor = iminor(inode);
301 303  
302 304 interface = usb_find_interface(&ld_usb_driver, subminor);
303 305  
304 306 if (!interface) {
  307 + unlock_kernel();
305 308 err("%s - error, can't find device for minor %d\n",
306 309 __func__, subminor);
307 310 return -ENODEV;
308 311  
309 312  
310 313  
... ... @@ -309,12 +312,16 @@
309 312  
310 313 dev = usb_get_intfdata(interface);
311 314  
312   - if (!dev)
  315 + if (!dev) {
  316 + unlock_kernel();
313 317 return -ENODEV;
  318 + }
314 319  
315 320 /* lock this device */
316   - if (mutex_lock_interruptible(&dev->mutex))
  321 + if (mutex_lock_interruptible(&dev->mutex)) {
  322 + unlock_kernel();
317 323 return -ERESTARTSYS;
  324 + }
318 325  
319 326 /* allow opening only once */
320 327 if (dev->open_count) {
... ... @@ -353,6 +360,7 @@
353 360  
354 361 unlock_exit:
355 362 mutex_unlock(&dev->mutex);
  363 + unlock_kernel();
356 364  
357 365 return retval;
358 366 }
drivers/usb/misc/legousbtower.c
... ... @@ -82,6 +82,7 @@
82 82 #include <linux/module.h>
83 83 #include <linux/completion.h>
84 84 #include <linux/mutex.h>
  85 +#include <linux/smp_lock.h>
85 86 #include <asm/uaccess.h>
86 87 #include <linux/usb.h>
87 88 #include <linux/poll.h>
... ... @@ -345,6 +346,7 @@
345 346  
346 347 dbg(2, "%s: enter", __func__);
347 348  
  349 + lock_kernel();
348 350 nonseekable_open(inode, file);
349 351 subminor = iminor(inode);
350 352  
... ... @@ -430,6 +432,7 @@
430 432 mutex_unlock(&dev->lock);
431 433  
432 434 exit:
  435 + unlock_kernel();
433 436 dbg(2, "%s: leave, return value %d ", __func__, retval);
434 437  
435 438 return retval;
drivers/usb/misc/rio500.c
... ... @@ -77,7 +77,7 @@
77 77 static int open_rio(struct inode *inode, struct file *file)
78 78 {
79 79 struct rio_usb_data *rio = &rio_instance;
80   -
  80 + lock_kernel();
81 81 mutex_lock(&(rio->lock));
82 82  
83 83 if (rio->isopen || !rio->present) {
... ... @@ -91,6 +91,7 @@
91 91 mutex_unlock(&(rio->lock));
92 92  
93 93 dev_info(&rio->rio_dev->dev, "Rio opened.\n");
  94 + unlock_kernel();
94 95  
95 96 return 0;
96 97 }
drivers/usb/misc/sisusbvga/sisusb.c
... ... @@ -2416,21 +2416,28 @@
2416 2416 struct usb_interface *interface;
2417 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 2422 return -ENODEV;
  2423 + }
2421 2424  
2422   - if (!(sisusb = usb_get_intfdata(interface)))
  2425 + if (!(sisusb = usb_get_intfdata(interface))) {
  2426 + unlock_kernel();
2423 2427 return -ENODEV;
  2428 + }
2424 2429  
2425 2430 mutex_lock(&sisusb->lock);
2426 2431  
2427 2432 if (!sisusb->present || !sisusb->ready) {
2428 2433 mutex_unlock(&sisusb->lock);
  2434 + unlock_kernel();
2429 2435 return -ENODEV;
2430 2436 }
2431 2437  
2432 2438 if (sisusb->isopen) {
2433 2439 mutex_unlock(&sisusb->lock);
  2440 + unlock_kernel();
2434 2441 return -EBUSY;
2435 2442 }
2436 2443  
2437 2444  
... ... @@ -2439,11 +2446,13 @@
2439 2446 if (sisusb_init_gfxdevice(sisusb, 0)) {
2440 2447 mutex_unlock(&sisusb->lock);
2441 2448 dev_err(&sisusb->sisusb_dev->dev, "Failed to initialize device\n");
  2449 + unlock_kernel();
2442 2450 return -EIO;
2443 2451 }
2444 2452 } else {
2445 2453 mutex_unlock(&sisusb->lock);
2446 2454 dev_err(&sisusb->sisusb_dev->dev, "Device not attached to USB 2.0 hub\n");
  2455 + unlock_kernel();
2447 2456 return -EIO;
2448 2457 }
2449 2458 }
... ... @@ -2456,6 +2465,7 @@
2456 2465 file->private_data = sisusb;
2457 2466  
2458 2467 mutex_unlock(&sisusb->lock);
  2468 + unlock_kernel();
2459 2469  
2460 2470 return 0;
2461 2471 }
drivers/usb/misc/usblcd.c
... ... @@ -74,10 +74,12 @@
74 74 struct usb_interface *interface;
75 75 int subminor, r;
76 76  
  77 + lock_kernel();
77 78 subminor = iminor(inode);
78 79  
79 80 interface = usb_find_interface(&lcd_driver, subminor);
80 81 if (!interface) {
  82 + unlock_kernel();
81 83 err ("USBLCD: %s - error, can't find device for minor %d",
82 84 __func__, subminor);
83 85 return -ENODEV;
... ... @@ -87,6 +89,7 @@
87 89 dev = usb_get_intfdata(interface);
88 90 if (!dev) {
89 91 mutex_unlock(&open_disc_mutex);
  92 + unlock_kernel();
90 93 return -ENODEV;
91 94 }
92 95  
93 96  
... ... @@ -98,11 +101,13 @@
98 101 r = usb_autopm_get_interface(interface);
99 102 if (r < 0) {
100 103 kref_put(&dev->kref, lcd_delete);
  104 + unlock_kernel();
101 105 return r;
102 106 }
103 107  
104 108 /* save our object in the file's private structure */
105 109 file->private_data = dev;
  110 + unlock_kernel();
106 111  
107 112 return 0;
108 113 }
drivers/usb/misc/vstusb.c
... ... @@ -27,6 +27,7 @@
27 27 #include <linux/slab.h>
28 28 #include <linux/module.h>
29 29 #include <linux/mutex.h>
  30 +#include <linux/smp_lock.h>
30 31 #include <linux/uaccess.h>
31 32 #include <linux/usb.h>
32 33  
33 34  
34 35  
35 36  
... ... @@ -103,19 +104,23 @@
103 104 struct vstusb_device *vstdev;
104 105 struct usb_interface *interface;
105 106  
  107 + lock_kernel();
106 108 interface = usb_find_interface(&vstusb_driver, iminor(inode));
107 109  
108 110 if (!interface) {
109 111 printk(KERN_ERR KBUILD_MODNAME
110 112 ": %s - error, can't find device for minor %d\n",
111 113 __func__, iminor(inode));
  114 + unlock_kernel();
112 115 return -ENODEV;
113 116 }
114 117  
115 118 vstdev = usb_get_intfdata(interface);
116 119  
117   - if (!vstdev)
  120 + if (!vstdev) {
  121 + unlock_kernel();
118 122 return -ENODEV;
  123 + }
119 124  
120 125 /* lock this device */
121 126 mutex_lock(&vstdev->lock);
... ... @@ -123,6 +128,7 @@
123 128 /* can only open one time */
124 129 if ((!vstdev->present) || (vstdev->isopen)) {
125 130 mutex_unlock(&vstdev->lock);
  131 + unlock_kernel();
126 132 return -EBUSY;
127 133 }
128 134  
... ... @@ -137,6 +143,7 @@
137 143 dev_dbg(&vstdev->usb_dev->dev, "%s: opened\n", __func__);
138 144  
139 145 mutex_unlock(&vstdev->lock);
  146 + unlock_kernel();
140 147  
141 148 return 0;
142 149 }
drivers/usb/usb-skeleton.c
... ... @@ -18,6 +18,7 @@
18 18 #include <linux/slab.h>
19 19 #include <linux/module.h>
20 20 #include <linux/kref.h>
  21 +#include <linux/smp_lock.h>
21 22 #include <linux/uaccess.h>
22 23 #include <linux/usb.h>
23 24 #include <linux/mutex.h>
... ... @@ -90,6 +91,7 @@
90 91 int subminor;
91 92 int retval = 0;
92 93  
  94 + lock_kernel();
93 95 subminor = iminor(inode);
94 96  
95 97 interface = usb_find_interface(&skel_driver, subminor);
... ... @@ -135,6 +137,7 @@
135 137 mutex_unlock(&dev->io_mutex);
136 138  
137 139 exit:
  140 + unlock_kernel();
138 141 return retval;
139 142 }
140 143