]> git.karo-electronics.de Git - karo-tx-linux.git/commit
USB: usbfs: keep async URBs until the device file is closed
authorAlan Stern <stern@rowland.harvard.edu>
Mon, 9 Mar 2009 17:44:02 +0000 (13:44 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 23 Mar 2009 21:55:29 +0000 (14:55 -0700)
commit25be075ce7093af6ef783e3c01219836548466af
tree65df96973b2f2b6dc2614253c7e216d2a76b06ae
parent76840acdb3a430e1d7eedacbcbb42397577f3288
USB: usbfs: keep async URBs until the device file is closed

commit 6ff10464096540e14d7575a72c50d0316d003714 upstream.

The usbfs driver manages a list of completed asynchronous URBs.  But
it is too eager to free the entries on this list: destroy_async() gets
called whenever an interface is unbound or a device is removed, and it
deallocates the outstanding struct async entries for all URBs on that
interface or device.  This is wrong; the user program should be able
to reap an URB any time after it has completed, regardless of whether
or not the interface is still bound or the device is still present.

This patch (as1222) moves the code for deallocating the completed list
entries from destroy_async() to usbdev_release().  The outstanding
entries won't be freed until the user program has closed the device
file, thereby eliminating any possibility that the remaining URBs
might still be reaped.

This fixes a bug in which a program can hang in the USBDEVFS_REAPURB
ioctl when the device is unplugged.

Reported-and-tested-by: Martin Poupe <martin.poupe@upek.com>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/devio.c