[PATCH] swsusp: avoid problems if there are too many pages to save
The following patch makes swsusp avoid problems during resume if there are too many pages to save on suspend. It adds a constant that allows us to verify if we are going to save too many pages and implements the check (this is done as early as we can tell that the check will trigger, which is in swsusp_alloc()). Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Pavel Machek <pavel@suse.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
f65a4d10c8
commit
0f7347c20c
|
@ -9,6 +9,9 @@
|
|||
#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
|
||||
#endif
|
||||
|
||||
#define MAX_PBES ((PAGE_SIZE - sizeof(struct new_utsname) \
|
||||
- 4 - 3*sizeof(unsigned long) - sizeof(int) \
|
||||
- sizeof(void *)) / sizeof(swp_entry_t))
|
||||
|
||||
struct swsusp_info {
|
||||
struct new_utsname uts;
|
||||
|
@ -18,7 +21,7 @@ struct swsusp_info {
|
|||
unsigned long image_pages;
|
||||
unsigned long pagedir_pages;
|
||||
suspend_pagedir_t * suspend_pagedir;
|
||||
swp_entry_t pagedir[768];
|
||||
swp_entry_t pagedir[MAX_PBES];
|
||||
} __attribute__((aligned(PAGE_SIZE)));
|
||||
|
||||
|
||||
|
|
|
@ -931,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;
|
||||
|
|
Loading…
Reference in New Issue