diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 10:16:31 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 10:16:31 -0400 |
commit | 2ee73cc2d507df7b28050fba5d08bd33dd34848c (patch) | |
tree | af5f33b265318e0f4b61f788691fe4f780ec402c /kernel/power/swsusp.c | |
parent | c1d9728ecc5b560465df3c0c0d3b3825c2710b40 (diff) | |
parent | ed39f731ab2e77e58122232f6e27333331d7793d (diff) |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'kernel/power/swsusp.c')
-rw-r--r-- | kernel/power/swsusp.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c index 1cc9ff25e479..acf79ac1cb6d 100644 --- a/kernel/power/swsusp.c +++ b/kernel/power/swsusp.c @@ -402,15 +402,14 @@ static int write_page(unsigned long addr, swp_entry_t * loc) static void data_free(void) { swp_entry_t entry; - int i; + struct pbe * p; - for (i = 0; i < nr_copy_pages; i++) { - entry = (pagedir_nosave + i)->swap_address; + for_each_pbe(p, pagedir_nosave) { + entry = p->swap_address; if (entry.val) swap_free(entry); else break; - (pagedir_nosave + i)->swap_address = (swp_entry_t){0}; } } @@ -932,6 +931,10 @@ static int swsusp_alloc(void) if (!enough_swap()) return -ENOSPC; + if (MAX_PBES < nr_copy_pages / PBES_PER_PAGE + + !!(nr_copy_pages % PBES_PER_PAGE)) + return -ENOSPC; + if (!(pagedir_save = alloc_pagedir(nr_copy_pages))) { printk(KERN_ERR "suspend: Allocating pagedir failed.\n"); return -ENOMEM; @@ -1438,9 +1441,9 @@ static int read_pagedir(struct pbe *pblist) } if (error) - free_page((unsigned long)pblist); - - BUG_ON(i != swsusp_info.pagedir_pages); + free_pagedir(pblist); + else + BUG_ON(i != swsusp_info.pagedir_pages); return error; } |