• Alan Stern's avatar
    USB: fix possible deadlock involving sysfs attributes · e16362a0
    Alan Stern authored
    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: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
hub.c 92.2 KB