diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2007-05-22 11:38:19 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-05-22 23:45:50 -0700 |
commit | dd865571d7af06ba1285c2db85083649193cceab (patch) | |
tree | 125256fec4cb97995fb200cef37f05d63b490790 /drivers | |
parent | 7ed92f1a149dddc3cb537ccd7441e98adac12c3e (diff) | |
download | linux-dd865571d7af06ba1285c2db85083649193cceab.tar.gz linux-dd865571d7af06ba1285c2db85083649193cceab.tar.bz2 linux-dd865571d7af06ba1285c2db85083649193cceab.zip |
USB: handle errors in power/level attribute
This patch (as906) improves the error handling for the USB power/level
attribute file. If an error occurs, the original power-level settings
will be restored.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/core/sysfs.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index e7c982377488..be37c863fdfb 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -232,12 +232,15 @@ set_level(struct device *dev, struct device_attribute *attr, int len = count; char *cp; int rc = 0; + int old_autosuspend_disabled, old_autoresume_disabled; cp = memchr(buf, '\n', count); if (cp) len = cp - buf; usb_lock_device(udev); + old_autosuspend_disabled = udev->autosuspend_disabled; + old_autoresume_disabled = udev->autoresume_disabled; /* Setting the flags without calling usb_pm_lock is a subject to * races, but who cares... @@ -263,6 +266,10 @@ set_level(struct device *dev, struct device_attribute *attr, } else rc = -EINVAL; + if (rc) { + udev->autosuspend_disabled = old_autosuspend_disabled; + udev->autoresume_disabled = old_autoresume_disabled; + } usb_unlock_device(udev); return (rc < 0 ? rc : count); } |