VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / kernel / power / pmdisk.c
index 22855ab..318bfb9 100644 (file)
@@ -732,19 +732,6 @@ int pmdisk_resume(void)
 
 /* More restore stuff */
 
-/* FIXME: Why not memcpy(to, from, 1<<pagedir_order*PAGE_SIZE)? */
-static void __init copy_pagedir(suspend_pagedir_t *to, suspend_pagedir_t *from)
-{
-       int i;
-       char *topointer=(char *)to, *frompointer=(char *)from;
-
-       for(i=0; i < 1 << pagedir_order; i++) {
-               copy_page(topointer, frompointer);
-               topointer += PAGE_SIZE;
-               frompointer += PAGE_SIZE;
-       }
-}
-
 #define does_collide(addr) does_collide_order(pm_pagedir_nosave, addr, 0)
 
 /*
@@ -792,9 +779,10 @@ static int __init relocate_pagedir(void)
         * We have to avoid recursion (not to overflow kernel stack),
         * and that's why code looks pretty cryptic 
         */
-       suspend_pagedir_t *new_pagedir, *old_pagedir = pm_pagedir_nosave;
+       suspend_pagedir_t *old_pagedir = pm_pagedir_nosave;
        void **eaten_memory = NULL;
        void **c = eaten_memory, *m, *f;
+       int err;
 
        pr_debug("pmdisk: Relocating pagedir\n");
 
@@ -803,32 +791,31 @@ static int __init relocate_pagedir(void)
                return 0;
        }
 
-       while ((m = (void *) __get_free_pages(GFP_ATOMIC, pagedir_order))) {
-               memset(m, 0, PAGE_SIZE);
-               if (!does_collide_order(old_pagedir, (unsigned long)m, pagedir_order))
+       err = -ENOMEM;
+       while ((m = (void *) __get_free_pages(GFP_ATOMIC, pagedir_order)) != NULL) {
+               if (!does_collide_order(old_pagedir, (unsigned long)m,
+                                       pagedir_order)) {
+                       pm_pagedir_nosave =
+                               memcpy(m, old_pagedir,
+                                      PAGE_SIZE << pagedir_order);
+                       err = 0;
                        break;
+               }
                eaten_memory = m;
                printk( "." ); 
                *eaten_memory = c;
                c = eaten_memory;
        }
 
-       if (!m)
-               return -ENOMEM;
-
-       pm_pagedir_nosave = new_pagedir = m;
-       copy_pagedir(new_pagedir, old_pagedir);
-
        c = eaten_memory;
        while(c) {
                printk(":");
-               f = *c;
+               f = c;
                c = *c;
-               if (f)
-                       free_pages((unsigned long)f, pagedir_order);
+               free_pages((unsigned long)f, pagedir_order);
        }
        printk("|\n");
-       return 0;
+       return err;
 }
 
 
@@ -966,7 +953,7 @@ static const char * __init sanity_check(void)
                return "machine";
        if(pmdisk_info.cpus != num_online_cpus())
                return "number of cpus";
-       return 0;
+       return NULL;
 }