aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2011-07-08 14:53:36 -0400
committerRafael J. Wysocki <rjw@sisk.pl>2011-07-15 17:58:20 -0400
commitf0c077a8b7f9dce590c760a7b2f3c417dffa52d1 (patch)
treeef6d08aa3ca1d79000db7d7479d98bda04a11c78
parent1d8047a6f7973470bb1de4606a6e00c0bbee3cc6 (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.c2
-rw-r--r--drivers/s390/char/vmwatchdog.c4
-rw-r--r--drivers/s390/cio/css.c8
-rw-r--r--kernel/power/main.c5
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
38int pm_notifier_call_chain(unsigned long val) 38int 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. */