USB: BKL removal from ioctl path of usbfs
Oliver Neukum [Thu, 14 Jan 2010 15:23:56 +0000 (16:23 +0100)]
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>

drivers/usb/core/devio.c

index efe82c9..e59efea 100644 (file)
@@ -1636,7 +1636,10 @@ static int proc_ioctl(struct dev_state *ps, struct usbdevfs_ioctl *ctl)
                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 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
        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 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
                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 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
                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 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
                break;
        }
        usb_unlock_device(dev);
-       unlock_kernel();
        if (ret >= 0)
                inode->i_atime = CURRENT_TIME;
        return ret;