diff options
| -rw-r--r-- | kernel/power/swap.c | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 1b1ab6fcf386..63e80628a326 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -29,6 +29,40 @@ | |||
| 29 | 29 | ||
| 30 | #define SWSUSP_SIG "S1SUSPEND" | 30 | #define SWSUSP_SIG "S1SUSPEND" |
| 31 | 31 | ||
| 32 | /* | ||
| 33 | * The swap map is a data structure used for keeping track of each page | ||
| 34 | * written to a swap partition. It consists of many swap_map_page | ||
| 35 | * structures that contain each an array of MAP_PAGE_SIZE swap entries. | ||
| 36 | * These structures are stored on the swap and linked together with the | ||
| 37 | * help of the .next_swap member. | ||
| 38 | * | ||
| 39 | * The swap map is created during suspend. The swap map pages are | ||
| 40 | * allocated and populated one at a time, so we only need one memory | ||
| 41 | * page to set up the entire structure. | ||
| 42 | * | ||
| 43 | * During resume we also only need to use one swap_map_page structure | ||
| 44 | * at a time. | ||
| 45 | */ | ||
| 46 | |||
| 47 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) | ||
| 48 | |||
| 49 | struct swap_map_page { | ||
| 50 | sector_t entries[MAP_PAGE_ENTRIES]; | ||
| 51 | sector_t next_swap; | ||
| 52 | }; | ||
| 53 | |||
| 54 | /** | ||
| 55 | * The swap_map_handle structure is used for handling swap in | ||
| 56 | * a file-alike way | ||
| 57 | */ | ||
| 58 | |||
| 59 | struct swap_map_handle { | ||
| 60 | struct swap_map_page *cur; | ||
| 61 | sector_t cur_swap; | ||
| 62 | sector_t first_sector; | ||
| 63 | unsigned int k; | ||
| 64 | }; | ||
| 65 | |||
| 32 | struct swsusp_header { | 66 | struct swsusp_header { |
| 33 | char reserved[PAGE_SIZE - 20 - sizeof(sector_t) - sizeof(int)]; | 67 | char reserved[PAGE_SIZE - 20 - sizeof(sector_t) - sizeof(int)]; |
| 34 | sector_t image; | 68 | sector_t image; |
| @@ -151,7 +185,7 @@ struct block_device *hib_resume_bdev; | |||
| 151 | * Saving part | 185 | * Saving part |
| 152 | */ | 186 | */ |
| 153 | 187 | ||
| 154 | static int mark_swapfiles(sector_t start, unsigned int flags) | 188 | static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags) |
| 155 | { | 189 | { |
| 156 | int error; | 190 | int error; |
| 157 | 191 | ||
| @@ -160,7 +194,7 @@ static int mark_swapfiles(sector_t start, unsigned int flags) | |||
| 160 | !memcmp("SWAPSPACE2",swsusp_header->sig, 10)) { | 194 | !memcmp("SWAPSPACE2",swsusp_header->sig, 10)) { |
| 161 | memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10); | 195 | memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10); |
| 162 | memcpy(swsusp_header->sig,SWSUSP_SIG, 10); | 196 | memcpy(swsusp_header->sig,SWSUSP_SIG, 10); |
| 163 | swsusp_header->image = start; | 197 | swsusp_header->image = handle->first_sector; |
| 164 | swsusp_header->flags = flags; | 198 | swsusp_header->flags = flags; |
| 165 | error = hib_bio_write_page(swsusp_resume_block, | 199 | error = hib_bio_write_page(swsusp_resume_block, |
| 166 | swsusp_header, NULL); | 200 | swsusp_header, NULL); |
| @@ -226,39 +260,6 @@ static int write_page(void *buf, sector_t offset, struct bio **bio_chain) | |||
| 226 | return hib_bio_write_page(offset, src, bio_chain); | 260 | return hib_bio_write_page(offset, src, bio_chain); |
| 227 | } | 261 | } |
| 228 | 262 | ||
| 229 | /* | ||
| 230 | * The swap map is a data structure used for keeping track of each page | ||
| 231 | * written to a swap partition. It consists of many swap_map_page | ||
| 232 | * structures that contain each an array of MAP_PAGE_SIZE swap entries. | ||
| 233 | * These structures are stored on the swap and linked together with the | ||
| 234 | * help of the .next_swap member. | ||
| 235 | * | ||
| 236 | * The swap map is created during suspend. The swap map pages are | ||
| 237 | * allocated and populated one at a time, so we only need one memory | ||
| 238 | * page to set up the entire structure. | ||
| 239 | * | ||
| 240 | * During resume we also only need to use one swap_map_page structure | ||
| 241 | * at a time. | ||
| 242 | */ | ||
| 243 | |||
| 244 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) | ||
| 245 | |||
| 246 | struct swap_map_page { | ||
| 247 | sector_t entries[MAP_PAGE_ENTRIES]; | ||
| 248 | sector_t next_swap; | ||
| 249 | }; | ||
| 250 | |||
| 251 | /** | ||
| 252 | * The swap_map_handle structure is used for handling swap in | ||
| 253 | * a file-alike way | ||
| 254 | */ | ||
| 255 | |||
| 256 | struct swap_map_handle { | ||
| 257 | struct swap_map_page *cur; | ||
| 258 | sector_t cur_swap; | ||
| 259 | unsigned int k; | ||
| 260 | }; | ||
| 261 | |||
| 262 | static void release_swap_writer(struct swap_map_handle *handle) | 263 | static void release_swap_writer(struct swap_map_handle *handle) |
| 263 | { | 264 | { |
| 264 | if (handle->cur) | 265 | if (handle->cur) |
| @@ -277,6 +278,7 @@ static int get_swap_writer(struct swap_map_handle *handle) | |||
| 277 | return -ENOSPC; | 278 | return -ENOSPC; |
| 278 | } | 279 | } |
| 279 | handle->k = 0; | 280 | handle->k = 0; |
| 281 | handle->first_sector = handle->cur_swap; | ||
| 280 | return 0; | 282 | return 0; |
| 281 | } | 283 | } |
| 282 | 284 | ||
| @@ -421,8 +423,6 @@ int swsusp_write(unsigned int flags) | |||
| 421 | } | 423 | } |
| 422 | error = get_swap_writer(&handle); | 424 | error = get_swap_writer(&handle); |
| 423 | if (!error) { | 425 | if (!error) { |
| 424 | sector_t start = handle.cur_swap; | ||
| 425 | |||
| 426 | error = swap_write_page(&handle, header, NULL); | 426 | error = swap_write_page(&handle, header, NULL); |
| 427 | if (!error) | 427 | if (!error) |
| 428 | error = save_image(&handle, &snapshot, | 428 | error = save_image(&handle, &snapshot, |
| @@ -431,7 +431,7 @@ int swsusp_write(unsigned int flags) | |||
| 431 | if (!error) { | 431 | if (!error) { |
| 432 | flush_swap_writer(&handle); | 432 | flush_swap_writer(&handle); |
| 433 | printk(KERN_INFO "PM: S"); | 433 | printk(KERN_INFO "PM: S"); |
| 434 | error = mark_swapfiles(start, flags); | 434 | error = mark_swapfiles(&handle, flags); |
| 435 | printk("|\n"); | 435 | printk("|\n"); |
| 436 | } | 436 | } |
| 437 | } | 437 | } |
