diff options
Diffstat (limited to 'kernel/power/user.c')
| -rw-r--r-- | kernel/power/user.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/kernel/power/user.c b/kernel/power/user.c index 3f1539fbe48a..72825c853cd7 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/swapops.h> | 19 | #include <linux/swapops.h> |
| 20 | #include <linux/pm.h> | 20 | #include <linux/pm.h> |
| 21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
| 22 | #include <linux/cpu.h> | ||
| 22 | 23 | ||
| 23 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
| 24 | 25 | ||
| @@ -139,12 +140,15 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
| 139 | if (data->frozen) | 140 | if (data->frozen) |
| 140 | break; | 141 | break; |
| 141 | down(&pm_sem); | 142 | down(&pm_sem); |
| 142 | disable_nonboot_cpus(); | 143 | error = disable_nonboot_cpus(); |
| 143 | if (freeze_processes()) { | 144 | if (!error) { |
| 144 | thaw_processes(); | 145 | error = freeze_processes(); |
| 145 | enable_nonboot_cpus(); | 146 | if (error) { |
| 146 | error = -EBUSY; | 147 | thaw_processes(); |
| 148 | error = -EBUSY; | ||
| 149 | } | ||
| 147 | } | 150 | } |
| 151 | enable_nonboot_cpus(); | ||
| 148 | up(&pm_sem); | 152 | up(&pm_sem); |
| 149 | if (!error) | 153 | if (!error) |
| 150 | data->frozen = 1; | 154 | data->frozen = 1; |
| @@ -189,9 +193,10 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
| 189 | error = -EPERM; | 193 | error = -EPERM; |
| 190 | break; | 194 | break; |
| 191 | } | 195 | } |
| 196 | snapshot_free_unused_memory(&data->handle); | ||
| 192 | down(&pm_sem); | 197 | down(&pm_sem); |
| 193 | pm_prepare_console(); | 198 | pm_prepare_console(); |
| 194 | error = device_suspend(PMSG_FREEZE); | 199 | error = device_suspend(PMSG_PRETHAW); |
| 195 | if (!error) { | 200 | if (!error) { |
| 196 | error = swsusp_resume(); | 201 | error = swsusp_resume(); |
| 197 | device_resume(); | 202 | device_resume(); |
