]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] usbfs: Remove extraneous disconnection checks
authorGreg Kroah-Hartman <greg@kroah.com>
Thu, 16 Dec 2004 07:49:19 +0000 (23:49 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 16 Dec 2004 07:49:19 +0000 (23:49 -0800)
This patch fixes a bug in the usbfs code.  The driver is too zealous about
checking for disconnected devices before doing things.  In particular, it
is necessary to reap all outstanding asynchronous URBs and unbind from
interfaces when the device file is closed, even if the device is no longer
connected.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/usb/core/devio.c

index a50a648a556bee2cb4c726cb75982c41d4062749..ff47c18a01e15f582e23df247144aae84d548295 100644 (file)
@@ -523,13 +523,12 @@ static int usbdev_release(struct inode *inode, struct file *file)
 
        usb_lock_device(dev);
        list_del_init(&ps->list);
-
-       if (connected(dev)) {
-               for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed); ifnum++)
-                       if (test_bit(ifnum, &ps->ifclaimed))
-                               releaseintf(ps, ifnum);
-               destroy_all_async(ps);
+       for (ifnum = 0; ps->ifclaimed && ifnum < 8*sizeof(ps->ifclaimed);
+                       ifnum++) {
+               if (test_bit(ifnum, &ps->ifclaimed))
+                       releaseintf(ps, ifnum);
        }
+       destroy_all_async(ps);
        usb_unlock_device(dev);
        usb_put_dev(dev);
        ps->dev = NULL;
@@ -1023,7 +1022,7 @@ static int proc_reapurb(struct dev_state *ps, void __user *arg)
        int ret;
 
        add_wait_queue(&ps->wait, &wait);
-       while (connected(dev)) {
+       for (;;) {
                __set_current_state(TASK_INTERRUPTIBLE);
                if ((as = async_getcompleted(ps)))
                        break;