| From 94fb823fcb4892614f57e59601bb9d4920f24711 Mon Sep 17 00:00:00 2001 |
| From: Imre Deak <imre.deak@intel.com> |
| Date: Fri, 24 Oct 2014 20:29:10 +0300 |
| Subject: PM / Sleep: fix recovery during resuming from hibernation |
| |
| From: Imre Deak <imre.deak@intel.com> |
| |
| commit 94fb823fcb4892614f57e59601bb9d4920f24711 upstream. |
| |
| If a device's dev_pm_ops::freeze callback fails during the QUIESCE |
| phase, we don't rollback things correctly calling the thaw and complete |
| callbacks. This could leave some devices in a suspended state in case of |
| an error during resuming from hibernation. |
| |
| Signed-off-by: Imre Deak <imre.deak@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/power/hibernate.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/power/hibernate.c |
| +++ b/kernel/power/hibernate.c |
| @@ -502,8 +502,14 @@ int hibernation_restore(int platform_mod |
| error = dpm_suspend_start(PMSG_QUIESCE); |
| if (!error) { |
| error = resume_target_kernel(platform_mode); |
| - dpm_resume_end(PMSG_RECOVER); |
| + /* |
| + * The above should either succeed and jump to the new kernel, |
| + * or return with an error. Otherwise things are just |
| + * undefined, so let's be paranoid. |
| + */ |
| + BUG_ON(!error); |
| } |
| + dpm_resume_end(PMSG_RECOVER); |
| pm_restore_gfp_mask(); |
| resume_console(); |
| pm_restore_console(); |