]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
PM / Hibernate: Thaw kernel threads in hibernation_snapshot() in error/test path
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Sat, 4 Feb 2012 21:26:38 +0000 (22:26 +0100)
committerRafael J. Wysocki <rjw@sisk.pl>
Thu, 9 Feb 2012 22:55:54 +0000 (23:55 +0100)
In the hibernation call path, the kernel threads are frozen inside
hibernation_snapshot(). If we happen to encounter an error further down
the road or if we are exiting early due to a successful freezer test,
then thaw kernel threads before returning to the caller.

Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
kernel/power/hibernate.c
kernel/power/user.c

index a5d4cf0aa03e3ea908cc800198631bd9924cb096..c6dee739080cb85abd3d23ead0228cc0be8d8941 100644 (file)
@@ -343,13 +343,13 @@ int hibernation_snapshot(int platform_mode)
                 * successful freezer test.
                 */
                freezer_test_done = true;
-               goto Cleanup;
+               goto Thaw;
        }
 
        error = dpm_prepare(PMSG_FREEZE);
        if (error) {
                dpm_complete(PMSG_RECOVER);
-               goto Cleanup;
+               goto Thaw;
        }
 
        suspend_console();
@@ -385,6 +385,8 @@ int hibernation_snapshot(int platform_mode)
        platform_end(platform_mode);
        return error;
 
+ Thaw:
+       thaw_kernel_threads();
  Cleanup:
        swsusp_free();
        goto Close;
index 3e100075b13cb6ab449034af458266e20dcaa369..7bee91f9af51f7281f3e47915eb0ecd0350b8234 100644 (file)
@@ -249,16 +249,12 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
                }
                pm_restore_gfp_mask();
                error = hibernation_snapshot(data->platform_support);
-               if (error) {
-                       thaw_kernel_threads();
-               } else {
+               if (!error) {
                        error = put_user(in_suspend, (int __user *)arg);
                        if (!error && !freezer_test_done)
                                data->ready = 1;
-                       if (freezer_test_done) {
+                       if (freezer_test_done)
                                freezer_test_done = false;
-                               thaw_kernel_threads();
-                       }
                }
                break;