aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power/swap.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2006-12-06 23:34:12 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-07 11:39:27 -0500
commit9a154d9d95b7b9845938242f5c62505b3cab5bcd (patch)
treefd3c51434298b139671f5accd42ab112a310555c /kernel/power/swap.c
parent3aef83e0ef1ffb8ea3bea97be46821a45c952173 (diff)
[PATCH] swsusp: add resume_offset command line parameter
Add the kernel command line parameter "resume_offset=" allowing us to specify the offset, in <PAGE_SIZE> units, from the beginning of the partition pointed to by the "resume=" parameter at which the swap header is located. This offset can be determined, for example, by an application using the FIBMAP ioctl to obtain the swap header's block number for given file. [akpm@osdl.org: we don't know what type sector_t is] Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Cc: Pavel Machek <pavel@ucw.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/power/swap.c')
-rw-r--r--kernel/power/swap.c15
1 files changed, 10 insertions, 5 deletions
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 }