Commit 86266452f80545285c14e20a8024f79c4fb88a86
Committed by
Greg Kroah-Hartman
1 parent
f9de332ebf
Exists in
master
and in
7 other branches
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
- drivers/media/video/dabusb.c
- drivers/staging/frontier/alphatrack.c
- drivers/staging/frontier/tranzport.c
- drivers/usb/class/cdc-wdm.c
- drivers/usb/class/usblp.c
- drivers/usb/class/usbtmc.c
- drivers/usb/core/file.c
- drivers/usb/image/mdc800.c
- drivers/usb/misc/adutux.c
- drivers/usb/misc/ftdi-elan.c
- drivers/usb/misc/idmouse.c
- drivers/usb/misc/iowarrior.c
- drivers/usb/misc/ldusb.c
- drivers/usb/misc/legousbtower.c
- drivers/usb/misc/rio500.c
- drivers/usb/misc/sisusbvga/sisusb.c
- drivers/usb/misc/usblcd.c
- drivers/usb/misc/vstusb.c
- drivers/usb/usb-skeleton.c
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 |