diff options
Diffstat (limited to 'kernel/power/snapshot.c')
| -rw-r--r-- | kernel/power/snapshot.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index c5863d02c89e..3eeedbb13b78 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -240,14 +240,15 @@ static void copy_data_pages(struct pbe *pblist) | |||
| 240 | * free_pagedir - free pages allocated with alloc_pagedir() | 240 | * free_pagedir - free pages allocated with alloc_pagedir() |
| 241 | */ | 241 | */ |
| 242 | 242 | ||
| 243 | static void free_pagedir(struct pbe *pblist) | 243 | static void free_pagedir(struct pbe *pblist, int clear_nosave_free) |
| 244 | { | 244 | { |
| 245 | struct pbe *pbe; | 245 | struct pbe *pbe; |
| 246 | 246 | ||
| 247 | while (pblist) { | 247 | while (pblist) { |
| 248 | pbe = (pblist + PB_PAGE_SKIP)->next; | 248 | pbe = (pblist + PB_PAGE_SKIP)->next; |
| 249 | ClearPageNosave(virt_to_page(pblist)); | 249 | ClearPageNosave(virt_to_page(pblist)); |
| 250 | ClearPageNosaveFree(virt_to_page(pblist)); | 250 | if (clear_nosave_free) |
| 251 | ClearPageNosaveFree(virt_to_page(pblist)); | ||
| 251 | free_page((unsigned long)pblist); | 252 | free_page((unsigned long)pblist); |
| 252 | pblist = pbe; | 253 | pblist = pbe; |
| 253 | } | 254 | } |
| @@ -389,7 +390,7 @@ struct pbe *alloc_pagedir(unsigned int nr_pages, gfp_t gfp_mask, int safe_needed | |||
| 389 | pbe->next = alloc_image_page(gfp_mask, safe_needed); | 390 | pbe->next = alloc_image_page(gfp_mask, safe_needed); |
| 390 | } | 391 | } |
| 391 | if (!pbe) { /* get_zeroed_page() failed */ | 392 | if (!pbe) { /* get_zeroed_page() failed */ |
| 392 | free_pagedir(pblist); | 393 | free_pagedir(pblist, 1); |
| 393 | pblist = NULL; | 394 | pblist = NULL; |
| 394 | } else | 395 | } else |
| 395 | create_pbe_list(pblist, nr_pages); | 396 | create_pbe_list(pblist, nr_pages); |
| @@ -736,7 +737,7 @@ static int create_image(struct snapshot_handle *handle) | |||
| 736 | pblist = alloc_pagedir(nr_copy_pages, GFP_ATOMIC, 1); | 737 | pblist = alloc_pagedir(nr_copy_pages, GFP_ATOMIC, 1); |
| 737 | if (pblist) | 738 | if (pblist) |
| 738 | copy_page_backup_list(pblist, p); | 739 | copy_page_backup_list(pblist, p); |
| 739 | free_pagedir(p); | 740 | free_pagedir(p, 0); |
| 740 | if (!pblist) | 741 | if (!pblist) |
| 741 | error = -ENOMEM; | 742 | error = -ENOMEM; |
| 742 | } | 743 | } |
