USB: change locking for device-level autosuspend

This patch (as1323) changes the locking requirements for
usb_autosuspend_device(), usb_autoresume_device(), and
usb_try_autosuspend_device().  This isn't a very important change;
mainly it's meant to make the locking more uniform.

The most tricky part of the patch involves changes to usbdev_open().
To avoid an ABBA locking problem, it was necessary to reduce the
region protected by usbfs_mutex.  Since that mutex now protects only
against simultaneous open and remove, this posed no difficulty -- its
scope was larger than necessary.

And it turns out that usbfs_mutex is no longer needed in
usbdev_release() at all.  The list of usbfs "ps" structures is now
protected by the device lock instead of by usbfs_mutex.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Alan Stern
2010-01-08 12:56:19 -05:00
committed by Greg Kroah-Hartman
parent 0f3dda9f7f
commit 62e299e61a
3 changed files with 30 additions and 20 deletions

View File

@@ -352,6 +352,7 @@ set_autosuspend(struct device *dev, struct device_attribute *attr,
return -EINVAL;
value *= HZ;
usb_lock_device(udev);
udev->autosuspend_delay = value;
if (value >= 0)
usb_try_autosuspend_device(udev);
@@ -359,6 +360,7 @@ set_autosuspend(struct device *dev, struct device_attribute *attr,
if (usb_autoresume_device(udev) == 0)
usb_autosuspend_device(udev);
}
usb_unlock_device(udev);
return count;
}