}
 
        if (initrd_node == -1) {
-               printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond "
+               printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond "
                       "physical memory - disabling initrd\n",
-                      phys_initrd_start, end);
+                      phys_initrd_start, phys_initrd_size);
                phys_initrd_start = phys_initrd_size = 0;
        }
 #endif
        reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
                             boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
 
+       /*
+        * Reserve any special node zero regions.
+        */
+       if (node == 0)
+               reserve_node_zero(pgdat);
+
 #ifdef CONFIG_BLK_DEV_INITRD
        /*
         * If the initrd is in this node, reserve its memory.
         */
        if (node == initrd_node) {
-               reserve_bootmem_node(pgdat, phys_initrd_start,
-                                    phys_initrd_size, BOOTMEM_DEFAULT);
-               initrd_start = __phys_to_virt(phys_initrd_start);
-               initrd_end = initrd_start + phys_initrd_size;
+               int res = reserve_bootmem_node(pgdat, phys_initrd_start,
+                                    phys_initrd_size, BOOTMEM_EXCLUSIVE);
+
+               if (res == 0) {
+                       initrd_start = __phys_to_virt(phys_initrd_start);
+                       initrd_end = initrd_start + phys_initrd_size;
+               } else {
+                       printk(KERN_ERR
+                               "INITRD: 0x%08lx+0x%08lx overlaps in-use "
+                               "memory region - disabling initrd\n",
+                               phys_initrd_start, phys_initrd_size);
+               }
        }
 #endif
 
-       /*
-        * Finally, reserve any node zero regions.
-        */
-       if (node == 0)
-               reserve_node_zero(pgdat);
-
        /*
         * initialise the zones within this node.
         */