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>

diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c
index 7c0bd13..8de32df 100644
--- a/drivers/usb/misc/ldusb.c
+++ b/drivers/usb/misc/ldusb.c
@@ -33,6 +33,7 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
+#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <linux/input.h>
@@ -296,12 +297,14 @@
 	int retval;
 	struct usb_interface *interface;
 
+	lock_kernel();
 	nonseekable_open(inode, file);
 	subminor = iminor(inode);
 
 	interface = usb_find_interface(&ld_usb_driver, subminor);
 
 	if (!interface) {
+		unlock_kernel();
 		err("%s - error, can't find device for minor %d\n",
 		     __func__, subminor);
 		return -ENODEV;
@@ -309,12 +312,16 @@
 
 	dev = usb_get_intfdata(interface);
 
-	if (!dev)
+	if (!dev) {
+		unlock_kernel();
 		return -ENODEV;
+	}
 
 	/* lock this device */
-	if (mutex_lock_interruptible(&dev->mutex))
+	if (mutex_lock_interruptible(&dev->mutex)) {
+		unlock_kernel();
 		return -ERESTARTSYS;
+	}
 
 	/* allow opening only once */
 	if (dev->open_count) {
@@ -353,6 +360,7 @@
 
 unlock_exit:
 	mutex_unlock(&dev->mutex);
+	unlock_kernel();
 
 	return retval;
 }