aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/power/disk.c15
-rw-r--r--kernel/power/power.h1
-rw-r--r--kernel/power/swap.c15
3 files changed, 26 insertions, 5 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index b1fb7866b0b3..d79feeb45459 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -27,6 +27,7 @@
27static int noresume = 0; 27static int noresume = 0;
28char resume_file[256] = CONFIG_PM_STD_PARTITION; 28char resume_file[256] = CONFIG_PM_STD_PARTITION;
29dev_t swsusp_resume_device; 29dev_t swsusp_resume_device;
30sector_t swsusp_resume_block;
30 31
31/** 32/**
32 * power_down - Shut machine down for hibernate. 33 * power_down - Shut machine down for hibernate.
@@ -423,6 +424,19 @@ static int __init resume_setup(char *str)
423 return 1; 424 return 1;
424} 425}
425 426
427static int __init resume_offset_setup(char *str)
428{
429 unsigned long long offset;
430
431 if (noresume)
432 return 1;
433
434 if (sscanf(str, "%llu", &offset) == 1)
435 swsusp_resume_block = offset;
436
437 return 1;
438}
439
426static int __init noresume_setup(char *str) 440static int __init noresume_setup(char *str)
427{ 441{
428 noresume = 1; 442 noresume = 1;
@@ -430,4 +444,5 @@ static int __init noresume_setup(char *str)
430} 444}
431 445
432__setup("noresume", noresume_setup); 446__setup("noresume", noresume_setup);
447__setup("resume_offset=", resume_offset_setup);
433__setup("resume=", resume_setup); 448__setup("resume=", resume_setup);
diff --git a/kernel/power/power.h b/kernel/power/power.h
index 210ebba26020..adaf7d4fbdaf 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -42,6 +42,7 @@ extern const void __nosave_begin, __nosave_end;
42extern unsigned long image_size; 42extern unsigned long image_size;
43extern int in_suspend; 43extern int in_suspend;
44extern dev_t swsusp_resume_device; 44extern dev_t swsusp_resume_device;
45extern sector_t swsusp_resume_block;
45 46
46extern asmlinkage int swsusp_arch_suspend(void); 47extern asmlinkage int swsusp_arch_suspend(void);
47extern asmlinkage int swsusp_arch_resume(void); 48extern asmlinkage int swsusp_arch_resume(void);
diff --git a/kernel/power/swap.c b/kernel/power/swap.c
index 1b08f46bbb7e..aa5a9bff01f1 100644
--- a/kernel/power/swap.c
+++ b/kernel/power/swap.c
@@ -161,13 +161,14 @@ static int mark_swapfiles(sector_t start)
161{ 161{
162 int error; 162 int error;
163 163
164 bio_read_page(0, &swsusp_header, NULL); 164 bio_read_page(swsusp_resume_block, &swsusp_header, NULL);
165 if (!memcmp("SWAP-SPACE",swsusp_header.sig, 10) || 165 if (!memcmp("SWAP-SPACE",swsusp_header.sig, 10) ||
166 !memcmp("SWAPSPACE2",swsusp_header.sig, 10)) { 166 !memcmp("SWAPSPACE2",swsusp_header.sig, 10)) {
167 memcpy(swsusp_header.orig_sig,swsusp_header.sig, 10); 167 memcpy(swsusp_header.orig_sig,swsusp_header.sig, 10);
168 memcpy(swsusp_header.sig,SWSUSP_SIG, 10); 168 memcpy(swsusp_header.sig,SWSUSP_SIG, 10);
169 swsusp_header.image = start; 169 swsusp_header.image = start;
170 error = bio_write_page(0, &swsusp_header, NULL); 170 error = bio_write_page(swsusp_resume_block,
171 &swsusp_header, NULL);
171 } else { 172 } else {
172 printk(KERN_ERR "swsusp: Swap header not found!\n"); 173 printk(KERN_ERR "swsusp: Swap header not found!\n");
173 error = -ENODEV; 174 error = -ENODEV;
@@ -184,7 +185,7 @@ static int swsusp_swap_check(void) /* This is called before saving image */
184{ 185{
185 int res; 186 int res;
186 187
187 res = swap_type_of(swsusp_resume_device, 0); 188 res = swap_type_of(swsusp_resume_device, swsusp_resume_block);
188 if (res < 0) 189 if (res < 0)
189 return res; 190 return res;
190 191
@@ -610,12 +611,16 @@ int swsusp_check(void)
610 if (!IS_ERR(resume_bdev)) { 611 if (!IS_ERR(resume_bdev)) {
611 set_blocksize(resume_bdev, PAGE_SIZE); 612 set_blocksize(resume_bdev, PAGE_SIZE);
612 memset(&swsusp_header, 0, sizeof(swsusp_header)); 613 memset(&swsusp_header, 0, sizeof(swsusp_header));
613 if ((error = bio_read_page(0, &swsusp_header, NULL))) 614 error = bio_read_page(swsusp_resume_block,
615 &swsusp_header, NULL);
616 if (error)
614 return error; 617 return error;
618
615 if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) { 619 if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) {
616 memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10); 620 memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10);
617 /* Reset swap signature now */ 621 /* Reset swap signature now */
618 error = bio_write_page(0, &swsusp_header, NULL); 622 error = bio_write_page(swsusp_resume_block,
623 &swsusp_header, NULL);
619 } else { 624 } else {
620 return -EINVAL; 625 return -EINVAL;
621 } 626 }