diff -ruNpax '*.orig' linux-2.6.17-2.2.6.2/drivers/base/power/suspend.c linux-2.6.17-2.2.6.3/drivers/base/power/suspend.c
--- linux-2.6.17-2.2.6.2/drivers/base/power/suspend.c	2006-06-18 09:49:35.000000000 +0800
+++ linux-2.6.17-2.2.6.3/drivers/base/power/suspend.c	2006-07-02 11:37:07.000000000 +0800
@@ -96,6 +96,12 @@ int device_suspend(pm_message_t state)
 
 		error = suspend_device(dev, state);
 
+		if (!irqs_disabled()) {
+			printk("Irqs enabled after calling suspend_device(%s, %d).\n",
+				kobject_name(&dev->kobj),
+				state.event);
+		}
+
 		down(&dpm_list_sem);
 
 		/* Check if the device got removed */
diff -ruNpax '*.orig' linux-2.6.17-2.2.6.2/kernel/power/atomic_copy.c linux-2.6.17-2.2.6.3/kernel/power/atomic_copy.c
--- linux-2.6.17-2.2.6.2/kernel/power/atomic_copy.c	2006-07-01 19:49:57.000000000 +0800
+++ linux-2.6.17-2.2.6.3/kernel/power/atomic_copy.c	2006-07-02 11:37:06.000000000 +0800
@@ -70,8 +70,8 @@ static void suspend_init_nosave_zone_tab
 			zone_nosave[num_zones].end_pfn = zone->zone_start_pfn +
 				zone->spanned_pages - 1;
 			zone_nosave[num_zones].is_highmem = is_highmem(zone);
+			num_zones++;
 		}
-		num_zones++;
 	}
 }
 
@@ -95,13 +95,6 @@ static unsigned long __suspend_get_next_
 
 	if (counter == -1) {
 		*zone_num = 0;
-
-		/* 
-		 * Test the end because the start can validly
-		 * be zero.
-		 */
-		while (!zone_nosave[*zone_num].end_pfn)
-			(*zone_num)++;
 		counter = zone_nosave[*zone_num].start_pfn - 1;
 	}
 
@@ -109,9 +102,6 @@ static unsigned long __suspend_get_next_
 		counter++;
 		if (counter > zone_nosave[*zone_num].end_pfn) {
 			(*zone_num)++;
-			while (!zone_nosave[*zone_num].end_pfn &&
-					*zone_num < num_zones)
-				(*zone_num)++;
 			
 			if (*zone_num == num_zones)
 				return -1;
diff -ruNpax '*.orig' linux-2.6.17-2.2.6.2/kernel/power/version.h linux-2.6.17-2.2.6.3/kernel/power/version.h
--- linux-2.6.17-2.2.6.2/kernel/power/version.h	2006-07-01 19:49:57.000000000 +0800
+++ linux-2.6.17-2.2.6.3/kernel/power/version.h	2006-07-02 11:37:06.000000000 +0800
@@ -6,5 +6,5 @@
  * Distributed under GPLv2.
  */
 
-#define SUSPEND_CORE_VERSION "2.2.6.2"
+#define SUSPEND_CORE_VERSION "2.2.6.3"
 #define name_suspend "Suspend2 " SUSPEND_CORE_VERSION ": "
diff -ruNpax '*.orig' linux-2.6.17-2.2.6.2/lib/dyn_pageflags.c linux-2.6.17-2.2.6.3/lib/dyn_pageflags.c
--- linux-2.6.17-2.2.6.2/lib/dyn_pageflags.c	2006-07-01 19:49:56.000000000 +0800
+++ linux-2.6.17-2.2.6.3/lib/dyn_pageflags.c	2006-07-02 11:37:06.000000000 +0800
@@ -266,7 +266,8 @@ int get_next_bit_on(dyn_pageflags_t bitm
 				zone = next_zone(zone);
 				if (!zone)
 					return -1;
-				zone_num++;
+				if (zone->spanned_pages)
+					zone_num++;
 			} while(!zone->spanned_pages);
 
 			zone_offset = 0;

