]> git.baikalelectronics.ru Git - kernel.git/commit
USB: fix possible deadlock involving sysfs attributes
authorAlan Stern <stern@rowland.harvard.edu>
Tue, 20 May 2008 20:37:34 +0000 (16:37 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 29 May 2008 20:59:03 +0000 (13:59 -0700)
commitdb742dadfb9ac5ee9ceed9683b8254fd488ef1a9
tree688efa40b57e8fdb56335f7c5844492026d090cf
parent6ede2ceb02dbcad4a7f6f3bb38ae4b2a37c403fd
USB: fix possible deadlock involving sysfs attributes

There is a potential deadlock when the usb_generic driver is unbound
from a device.  The problem is that generic_disconnect() is called
with the device lock held, and it removes a bunch of device attributes
from sysfs.  If a user task happens to be running an attribute method
at the time, the removal will block until the method returns.  But at
least one of the attribute methods (the store routine for power/level)
needs to acquire the device lock!

This patch (as1093) eliminates the deadlock by moving the calls to
create and remove the sysfs attributes from the usb_generic driver
into usb_new_device() and usb_disconnect(), where they can be invoked
without holding the device lock.

Besides, the other sysfs attributes are created when the device is
registered and removed when the device is unregistered.  So it seems
only fitting for the extra attributes to be created and removed at the
same time.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/generic.c
drivers/usb/core/hub.c