X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=kernel%2Fpower%2Fuser.c;h=d991d3b0e5a4e326ea29b6b7fc50c4a926dd5e3e;hb=2dc20a51dc1e2da6eae1182cfe4c4835fca26017;hp=3f1539fbe48a8be9c9f5ecf86f13042b3fed523d;hpb=9b238205ba5d79a8a242d7a5ddb82b89e4dc4e48;p=linux-2.6 diff --git a/kernel/power/user.c b/kernel/power/user.c index 3f1539fbe4..d991d3b0e5 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include @@ -139,11 +141,14 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, if (data->frozen) break; down(&pm_sem); - disable_nonboot_cpus(); - if (freeze_processes()) { - thaw_processes(); - enable_nonboot_cpus(); - error = -EBUSY; + error = disable_nonboot_cpus(); + if (!error) { + error = freeze_processes(); + if (error) { + thaw_processes(); + enable_nonboot_cpus(); + error = -EBUSY; + } } up(&pm_sem); if (!error) @@ -169,12 +174,14 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, /* Free memory before shutting down devices. */ error = swsusp_shrink_memory(); if (!error) { + suspend_console(); error = device_suspend(PMSG_FREEZE); if (!error) { in_suspend = 1; error = swsusp_suspend(); device_resume(); } + resume_console(); } up(&pm_sem); if (!error) @@ -189,13 +196,16 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, error = -EPERM; break; } + snapshot_free_unused_memory(&data->handle); down(&pm_sem); pm_prepare_console(); - error = device_suspend(PMSG_FREEZE); + suspend_console(); + error = device_suspend(PMSG_PRETHAW); if (!error) { error = swsusp_resume(); device_resume(); } + resume_console(); pm_restore_console(); up(&pm_sem); break; @@ -284,6 +294,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, } /* Put devices to sleep */ + suspend_console(); error = device_suspend(PMSG_SUSPEND); if (error) { printk(KERN_ERR "Failed to suspend some devices.\n"); @@ -294,7 +305,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, /* Wake up devices */ device_resume(); } - + resume_console(); if (pm_ops->finish) pm_ops->finish(PM_SUSPEND_MEM);