Index: linux-source-2.6.15-2.6.15/lib/dyn_pageflags.c
===================================================================
--- linux-source-2.6.15-2.6.15.orig/lib/dyn_pageflags.c	2006-07-01 20:00:21.000000000 +0800
+++ linux-source-2.6.15-2.6.15/lib/dyn_pageflags.c	2006-07-01 22:14:04.000000000 +0800
@@ -266,7 +266,8 @@
 				zone = next_zone(zone);
 				if (!zone)
 					return -1;
-				zone_num++;
+				if (zone->spanned_pages)
+					zone_num++;
 			} while(!zone->spanned_pages);
 
 			zone_offset = 0;
Index: linux-source-2.6.15-2.6.15/kernel/power/atomic_copy.c
===================================================================
--- linux-source-2.6.15-2.6.15.orig/kernel/power/atomic_copy.c	2006-07-01 20:00:21.000000000 +0800
+++ linux-source-2.6.15-2.6.15/kernel/power/atomic_copy.c	2006-07-01 23:53:51.000000000 +0800
@@ -70,8 +70,8 @@
 			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 @@
 
 	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 @@
 		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;

