diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2011-07-08 14:53:36 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-07-15 17:58:20 -0400 |
commit | f0c077a8b7f9dce590c760a7b2f3c417dffa52d1 (patch) | |
tree | ef6d08aa3ca1d79000db7d7479d98bda04a11c78 | |
parent | 1d8047a6f7973470bb1de4606a6e00c0bbee3cc6 (diff) |
PM: Improve error code of pm_notifier_call_chain()
This enables pm_notifier_call_chain() to get the actual error code
in the callback rather than always assume -EINVAL by converting all
PM notifier calls to return encapsulate error code with
notifier_from_errno().
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
-rw-r--r-- | drivers/char/apm-emulation.c | 2 | ||||
-rw-r--r-- | drivers/s390/char/vmwatchdog.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 8 | ||||
-rw-r--r-- | kernel/power/main.c | 5 |
4 files changed, 10 insertions, 9 deletions
diff --git a/drivers/char/apm-emulation.c b/drivers/char/apm-emulation.c index 548708c4b2b8..a7346ab97a3c 100644 --- a/drivers/char/apm-emulation.c +++ b/drivers/char/apm-emulation.c | |||
@@ -606,7 +606,7 @@ static int apm_suspend_notifier(struct notifier_block *nb, | |||
606 | return NOTIFY_OK; | 606 | return NOTIFY_OK; |
607 | 607 | ||
608 | /* interrupted by signal */ | 608 | /* interrupted by signal */ |
609 | return NOTIFY_BAD; | 609 | return notifier_from_errno(err); |
610 | 610 | ||
611 | case PM_POST_SUSPEND: | 611 | case PM_POST_SUSPEND: |
612 | /* | 612 | /* |
diff --git a/drivers/s390/char/vmwatchdog.c b/drivers/s390/char/vmwatchdog.c index 12ef9121d4f0..11312f401c70 100644 --- a/drivers/s390/char/vmwatchdog.c +++ b/drivers/s390/char/vmwatchdog.c | |||
@@ -258,13 +258,13 @@ static int vmwdt_suspend(void) | |||
258 | if (test_and_set_bit(VMWDT_OPEN, &vmwdt_is_open)) { | 258 | if (test_and_set_bit(VMWDT_OPEN, &vmwdt_is_open)) { |
259 | pr_err("The system cannot be suspended while the watchdog" | 259 | pr_err("The system cannot be suspended while the watchdog" |
260 | " is in use\n"); | 260 | " is in use\n"); |
261 | return NOTIFY_BAD; | 261 | return notifier_from_errno(-EBUSY); |
262 | } | 262 | } |
263 | if (test_bit(VMWDT_RUNNING, &vmwdt_is_open)) { | 263 | if (test_bit(VMWDT_RUNNING, &vmwdt_is_open)) { |
264 | clear_bit(VMWDT_OPEN, &vmwdt_is_open); | 264 | clear_bit(VMWDT_OPEN, &vmwdt_is_open); |
265 | pr_err("The system cannot be suspended while the watchdog" | 265 | pr_err("The system cannot be suspended while the watchdog" |
266 | " is running\n"); | 266 | " is running\n"); |
267 | return NOTIFY_BAD; | 267 | return notifier_from_errno(-EBUSY); |
268 | } | 268 | } |
269 | return NOTIFY_DONE; | 269 | return NOTIFY_DONE; |
270 | } | 270 | } |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index c47b25fd3f43..92d7324acb1c 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -814,8 +814,8 @@ static int css_power_event(struct notifier_block *this, unsigned long event, | |||
814 | mutex_unlock(&css->mutex); | 814 | mutex_unlock(&css->mutex); |
815 | continue; | 815 | continue; |
816 | } | 816 | } |
817 | if (__chsc_do_secm(css, 0)) | 817 | ret = __chsc_do_secm(css, 0); |
818 | ret = NOTIFY_BAD; | 818 | ret = notifier_from_errno(ret); |
819 | mutex_unlock(&css->mutex); | 819 | mutex_unlock(&css->mutex); |
820 | } | 820 | } |
821 | break; | 821 | break; |
@@ -831,8 +831,8 @@ static int css_power_event(struct notifier_block *this, unsigned long event, | |||
831 | mutex_unlock(&css->mutex); | 831 | mutex_unlock(&css->mutex); |
832 | continue; | 832 | continue; |
833 | } | 833 | } |
834 | if (__chsc_do_secm(css, 1)) | 834 | ret = __chsc_do_secm(css, 1); |
835 | ret = NOTIFY_BAD; | 835 | ret = notifier_from_errno(ret); |
836 | mutex_unlock(&css->mutex); | 836 | mutex_unlock(&css->mutex); |
837 | } | 837 | } |
838 | /* search for subchannels, which appeared during hibernation */ | 838 | /* search for subchannels, which appeared during hibernation */ |
diff --git a/kernel/power/main.c b/kernel/power/main.c index 2981af4ce7cb..6c601f871964 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -37,8 +37,9 @@ EXPORT_SYMBOL_GPL(unregister_pm_notifier); | |||
37 | 37 | ||
38 | int pm_notifier_call_chain(unsigned long val) | 38 | int pm_notifier_call_chain(unsigned long val) |
39 | { | 39 | { |
40 | return (blocking_notifier_call_chain(&pm_chain_head, val, NULL) | 40 | int ret = blocking_notifier_call_chain(&pm_chain_head, val, NULL); |
41 | == NOTIFY_BAD) ? -EINVAL : 0; | 41 | |
42 | return notifier_to_errno(ret); | ||
42 | } | 43 | } |
43 | 44 | ||
44 | /* If set, devices may be suspended and resumed asynchronously. */ | 45 | /* If set, devices may be suspended and resumed asynchronously. */ |