diff options
| author | Pavel Machek <pavel@suse.cz> | 2006-01-22 16:38:52 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-06 15:17:17 -0500 |
| commit | 022f7b07bf2b384ece7fbd7edb90e54cd78db252 (patch) | |
| tree | 7eae52ca103253babb194b8bae92c15340d82c0b /drivers/base/power | |
| parent | 68f5f996347dc2724a0dd511683643a2b6912380 (diff) | |
[PATCH] Fix Userspace interface breakage in power/state
Prevent passing invalid values down to the drivers.
Signed-off-by: Pavel Machek <pavel@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base/power')
| -rw-r--r-- | drivers/base/power/sysfs.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index f3a0c562bc..40d7242a07 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c | |||
| @@ -27,22 +27,30 @@ | |||
| 27 | 27 | ||
| 28 | static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf) | 28 | static ssize_t state_show(struct device * dev, struct device_attribute *attr, char * buf) |
| 29 | { | 29 | { |
| 30 | return sprintf(buf, "%u\n", dev->power.power_state.event); | 30 | if (dev->power.power_state.event) |
| 31 | return sprintf(buf, "2\n"); | ||
| 32 | else | ||
| 33 | return sprintf(buf, "0\n"); | ||
| 31 | } | 34 | } |
| 32 | 35 | ||
| 33 | static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n) | 36 | static ssize_t state_store(struct device * dev, struct device_attribute *attr, const char * buf, size_t n) |
| 34 | { | 37 | { |
| 35 | pm_message_t state; | 38 | pm_message_t state; |
| 36 | char * rest; | 39 | int error = -EINVAL; |
| 37 | int error = 0; | ||
| 38 | 40 | ||
| 39 | state.event = simple_strtoul(buf, &rest, 10); | 41 | state.event = PM_EVENT_SUSPEND; |
| 40 | if (*rest) | 42 | /* Older apps expected to write "3" here - confused with PCI D3 */ |
| 41 | return -EINVAL; | 43 | if ((n == 1) && !strcmp(buf, "3")) |
| 42 | if (state.event) | ||
| 43 | error = dpm_runtime_suspend(dev, state); | 44 | error = dpm_runtime_suspend(dev, state); |
| 44 | else | 45 | |
| 46 | if ((n == 1) && !strcmp(buf, "2")) | ||
| 47 | error = dpm_runtime_suspend(dev, state); | ||
| 48 | |||
| 49 | if ((n == 1) && !strcmp(buf, "0")) { | ||
| 45 | dpm_runtime_resume(dev); | 50 | dpm_runtime_resume(dev); |
| 51 | error = 0; | ||
| 52 | } | ||
| 53 | |||
| 46 | return error ? error : n; | 54 | return error ? error : n; |
| 47 | } | 55 | } |
| 48 | 56 | ||
