From: Andy Whitcroft <apw@shadowen.org>

It isn't correct to call pfn_to_page when the pfn_valid test fails.  This
can happen when there are holes in physical memory.  SPARSEMEM generates a
bogus VA which isn't accessed and EXTREME SPARSEMEM OOPs.

Signed-off-by: Bob Picco <bob.picco@hp.com>
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 mm/bootmem.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff -puN mm/bootmem.c~sparsemem-memory-model-fix-6 mm/bootmem.c
--- 25/mm/bootmem.c~sparsemem-memory-model-fix-6	2005-06-09 04:34:37.000000000 -0700
+++ 25-akpm/mm/bootmem.c	2005-06-09 04:34:37.000000000 -0700
@@ -277,11 +277,10 @@ static unsigned long __init free_all_boo
 	for (i = 0; i < idx; ) {
 		unsigned long v = ~map[i / BITS_PER_LONG];
 
-		page = pfn_to_page(pfn);
-
 		if (gofast && v == ~0UL) {
 			int j, order;
 
+			page = pfn_to_page(pfn);
 			count += BITS_PER_LONG;
 			__ClearPageReserved(page);
 			order = ffs(BITS_PER_LONG) - 1;
@@ -296,6 +295,8 @@ static unsigned long __init free_all_boo
 			page += BITS_PER_LONG;
 		} else if (v) {
 			unsigned long m;
+
+			page = pfn_to_page(pfn);
 			for (m = 1; m && i < idx; m<<=1, page++, i++) {
 				if (v & m) {
 					count++;
_