USB: Reduce scope of BKL in usb ioctl handling
authorOliver Neukum <oliver@neukum.org>
Wed, 13 Jan 2010 14:33:43 +0000 (15:33 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:54:24 +0000 (14:54 -0800)
This pushes BKL down in ioctl handling and drops it
for some important ioctls

Signed-off-by: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/devio.c

index 300f65f681a34a6dc35b72045c30b4afaa3666e8..efe82c9683663b5a28bc502c7d5b77a93f6b415d 100644 (file)
@@ -1719,9 +1719,12 @@ 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;
        }
 
@@ -1780,10 +1783,12 @@ 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
@@ -1835,13 +1840,17 @@ 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:
@@ -1875,6 +1884,7 @@ 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;
@@ -1885,9 +1895,7 @@ static long usbdev_ioctl(struct file *file, unsigned int cmd,
 {
        int ret;
 
-       lock_kernel();
        ret = usbdev_do_ioctl(file, cmd, (void __user *)arg);
-       unlock_kernel();
 
        return ret;
 }
@@ -1898,9 +1906,7 @@ static long usbdev_compat_ioctl(struct file *file, unsigned int cmd,
 {
        int ret;
 
-       lock_kernel();
        ret = usbdev_do_ioctl(file, cmd, compat_ptr(arg));
-       unlock_kernel();
 
        return ret;
 }