X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fpower%2Fdisk.c;fp=kernel%2Fpower%2Fdisk.c;h=0b43847dc9801950608f0943d3d6b7ea45776e54;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=7c7b9b65e365058935a5d5b77ac807b2d669df59;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 7c7b9b65e..0b43847dc 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c @@ -18,11 +18,21 @@ #include #include #include -#include #include "power.h" +extern suspend_disk_method_t pm_disk_mode; + +extern int swsusp_shrink_memory(void); +extern int swsusp_suspend(void); +extern int swsusp_write(struct pbe *pblist, unsigned int nr_pages); +extern int swsusp_check(void); +extern int swsusp_read(struct pbe **pblist_ptr); +extern void swsusp_close(void); +extern int swsusp_resume(void); + + static int noresume = 0; char resume_file[256] = CONFIG_PM_STD_PARTITION; dev_t swsusp_resume_device; @@ -60,6 +70,10 @@ static void power_down(suspend_disk_method_t mode) while(1); } + +static int in_suspend __nosavedata = 0; + + static inline void platform_finish(void) { if (pm_disk_mode == PM_DISK_PLATFORM) { @@ -73,10 +87,8 @@ static int prepare_processes(void) int error; pm_prepare_console(); - - error = disable_nonboot_cpus(); - if (error) - goto enable_cpus; + sys_sync(); + disable_nonboot_cpus(); if (freeze_processes()) { error = -EBUSY; @@ -88,7 +100,6 @@ static int prepare_processes(void) return 0; thaw: thaw_processes(); -enable_cpus: enable_nonboot_cpus(); pm_restore_console(); return error; @@ -134,7 +145,7 @@ int pm_suspend_disk(void) if (in_suspend) { device_resume(); pr_debug("PM: writing image.\n"); - error = swsusp_write(); + error = swsusp_write(pagedir_nosave, nr_copy_pages); if (!error) power_down(pm_disk_mode); else { @@ -205,7 +216,7 @@ static int software_resume(void) pr_debug("PM: Reading swsusp image.\n"); - if ((error = swsusp_read())) { + if ((error = swsusp_read(&pagedir_nosave))) { swsusp_free(); goto Thaw; } @@ -236,7 +247,7 @@ static int software_resume(void) late_initcall(software_resume); -static const char * const pm_disk_modes[] = { +static char * pm_disk_modes[] = { [PM_DISK_FIRMWARE] = "firmware", [PM_DISK_PLATFORM] = "platform", [PM_DISK_SHUTDOWN] = "shutdown",