USB: BKL removal from ioctl path of usbfs

Total removal from the ioctl code path except for the outcall
to external modules. Locking is ensured by the normal locks
of usbfs.

Signed-off-by: Oliver Neukum <oliver@neukum.org>
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index efe82c9..e59efea 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -1636,7 +1636,10 @@
 		if (driver == NULL || driver->ioctl == NULL) {
 			retval = -ENOTTY;
 		} else {
+			/* keep API that guarantees BKL */
+			lock_kernel();
 			retval = driver->ioctl(intf, ctl->ioctl_code, buf);
+			unlock_kernel();
 			if (retval == -ENOIOCTLCMD)
 				retval = -ENOTTY;
 		}
@@ -1720,11 +1723,9 @@
 	if (!(file->f_mode & FMODE_WRITE))
 		return -EPERM;
 
-	lock_kernel();
 	usb_lock_device(dev);
 	if (!connected(ps)) {
 		usb_unlock_device(dev);
-		unlock_kernel();
 		return -ENODEV;
 	}
 
@@ -1783,12 +1784,10 @@
 		break;
 
 	case USBDEVFS_SUBMITURB:
-		unlock_kernel();
 		snoop(&dev->dev, "%s: SUBMITURB\n", __func__);
 		ret = proc_submiturb(ps, p);
 		if (ret >= 0)
 			inode->i_mtime = CURRENT_TIME;
-		lock_kernel();
 		break;
 
 #ifdef CONFIG_COMPAT
@@ -1840,17 +1839,13 @@
 		break;
 
 	case USBDEVFS_REAPURB:
-		unlock_kernel();
 		snoop(&dev->dev, "%s: REAPURB\n", __func__);
 		ret = proc_reapurb(ps, p);
-		lock_kernel();
 		break;
 
 	case USBDEVFS_REAPURBNDELAY:
-		unlock_kernel();
 		snoop(&dev->dev, "%s: REAPURBNDELAY\n", __func__);
 		ret = proc_reapurbnonblock(ps, p);
-		lock_kernel();
 		break;
 
 	case USBDEVFS_DISCSIGNAL:
@@ -1884,7 +1879,6 @@
 		break;
 	}
 	usb_unlock_device(dev);
-	unlock_kernel();
 	if (ret >= 0)
 		inode->i_atime = CURRENT_TIME;
 	return ret;