aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power/user.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/power/user.c')
-rw-r--r--kernel/power/user.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/kernel/power/user.c b/kernel/power/user.c
index 72dbfd01408e..ad4e10208cde 100644
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -33,7 +33,6 @@
33static struct snapshot_data { 33static struct snapshot_data {
34 struct snapshot_handle handle; 34 struct snapshot_handle handle;
35 int swap; 35 int swap;
36 struct bitmap_page *bitmap;
37 int mode; 36 int mode;
38 char frozen; 37 char frozen;
39 char ready; 38 char ready;
@@ -69,7 +68,6 @@ static int snapshot_open(struct inode *inode, struct file *filp)
69 data->swap = -1; 68 data->swap = -1;
70 data->mode = O_WRONLY; 69 data->mode = O_WRONLY;
71 } 70 }
72 data->bitmap = NULL;
73 data->frozen = 0; 71 data->frozen = 0;
74 data->ready = 0; 72 data->ready = 0;
75 data->platform_suspend = 0; 73 data->platform_suspend = 0;
@@ -84,8 +82,7 @@ static int snapshot_release(struct inode *inode, struct file *filp)
84 swsusp_free(); 82 swsusp_free();
85 free_basic_memory_bitmaps(); 83 free_basic_memory_bitmaps();
86 data = filp->private_data; 84 data = filp->private_data;
87 free_all_swap_pages(data->swap, data->bitmap); 85 free_all_swap_pages(data->swap);
88 free_bitmap(data->bitmap);
89 if (data->frozen) { 86 if (data->frozen) {
90 mutex_lock(&pm_mutex); 87 mutex_lock(&pm_mutex);
91 thaw_processes(); 88 thaw_processes();
@@ -300,14 +297,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
300 error = -ENODEV; 297 error = -ENODEV;
301 break; 298 break;
302 } 299 }
303 if (!data->bitmap) { 300 offset = alloc_swapdev_block(data->swap);
304 data->bitmap = alloc_bitmap(count_swap_pages(data->swap, 0));
305 if (!data->bitmap) {
306 error = -ENOMEM;
307 break;
308 }
309 }
310 offset = alloc_swapdev_block(data->swap, data->bitmap);
311 if (offset) { 301 if (offset) {
312 offset <<= PAGE_SHIFT; 302 offset <<= PAGE_SHIFT;
313 error = put_user(offset, (sector_t __user *)arg); 303 error = put_user(offset, (sector_t __user *)arg);
@@ -321,13 +311,11 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
321 error = -ENODEV; 311 error = -ENODEV;
322 break; 312 break;
323 } 313 }
324 free_all_swap_pages(data->swap, data->bitmap); 314 free_all_swap_pages(data->swap);
325 free_bitmap(data->bitmap);
326 data->bitmap = NULL;
327 break; 315 break;
328 316
329 case SNAPSHOT_SET_SWAP_FILE: 317 case SNAPSHOT_SET_SWAP_FILE:
330 if (!data->bitmap) { 318 if (!swsusp_swap_in_use()) {
331 /* 319 /*
332 * User space encodes device types as two-byte values, 320 * User space encodes device types as two-byte values,
333 * so we need to recode them 321 * so we need to recode them
@@ -426,7 +414,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
426 break; 414 break;
427 415
428 case SNAPSHOT_SET_SWAP_AREA: 416 case SNAPSHOT_SET_SWAP_AREA:
429 if (data->bitmap) { 417 if (swsusp_swap_in_use()) {
430 error = -EPERM; 418 error = -EPERM;
431 } else { 419 } else {
432 struct resume_swap_area swap_area; 420 struct resume_swap_area swap_area;