]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/power/disk.c
freezer: do not sync filesystems from freeze_processes
[linux-2.6-omap-h63xx.git] / kernel / power / disk.c
index 324ac0188ce1cb89608f729f1321813f4bf2339d..555c0f0b2f7eaa20110b57064cb5f701b4e764df 100644 (file)
@@ -45,17 +45,18 @@ enum {
 
 static int hibernation_mode = HIBERNATION_SHUTDOWN;
 
-static struct hibernation_ops *hibernation_ops;
+static struct platform_hibernation_ops *hibernation_ops;
 
 /**
  * hibernation_set_ops - set the global hibernate operations
  * @ops: the hibernation operations to use in subsequent hibernation transitions
  */
 
-void hibernation_set_ops(struct hibernation_ops *ops)
+void hibernation_set_ops(struct platform_hibernation_ops *ops)
 {
-       if (ops && !(ops->prepare && ops->enter && ops->finish
-           && ops->pre_restore && ops->restore_cleanup)) {
+       if (ops && !(ops->start && ops->pre_snapshot && ops->finish
+           && ops->prepare && ops->enter && ops->pre_restore
+           && ops->restore_cleanup)) {
                WARN_ON(1);
                return;
        }
@@ -69,16 +70,26 @@ void hibernation_set_ops(struct hibernation_ops *ops)
        mutex_unlock(&pm_mutex);
 }
 
+/**
+ *     platform_start - tell the platform driver that we're starting
+ *     hibernation
+ */
+
+static int platform_start(int platform_mode)
+{
+       return (platform_mode && hibernation_ops) ?
+               hibernation_ops->start() : 0;
+}
 
 /**
- *     platform_prepare - prepare the machine for hibernation using the
+ *     platform_pre_snapshot - prepare the machine for hibernation using the
  *     platform driver if so configured and return an error code if it fails
  */
 
-static int platform_prepare(int platform_mode)
+static int platform_pre_snapshot(int platform_mode)
 {
        return (platform_mode && hibernation_ops) ?
-               hibernation_ops->prepare() : 0;
+               hibernation_ops->pre_snapshot() : 0;
 }
 
 /**
@@ -135,12 +146,16 @@ int hibernation_snapshot(int platform_mode)
        if (error)
                return error;
 
+       error = platform_start(platform_mode);
+       if (error)
+               return error;
+
        suspend_console();
        error = device_suspend(PMSG_FREEZE);
        if (error)
                goto Resume_console;
 
-       error = platform_prepare(platform_mode);
+       error = platform_pre_snapshot(platform_mode);
        if (error)
                goto Resume_devices;
 
@@ -216,6 +231,7 @@ int hibernation_platform_enter(void)
                 * sleep state after all
                 */
                error = hibernation_ops->prepare();
+               sysdev_shutdown();
                if (!error)
                        error = hibernation_ops->enter();
        } else {
@@ -297,6 +313,10 @@ int hibernate(void)
        if (error)
                goto Exit;
 
+       printk("Syncing filesystems ... ");
+       sys_sync();
+       printk("done.\n");
+
        error = prepare_processes();
        if (error)
                goto Finish;