
Make sure to check validity of addresses

Originally by: Mike Kravetz <kravetz@us.ibm.com>
More BUG_ONs added by: Dave Hansen <haveblue@us.ibm.com>

Signed-off-by: Mike Kravetz <kravetz@us.ibm.com>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 memhotplug-dave/include/linux/nonlinear.h |    4 ++++
 memhotplug-dave/mm/nonlinear.c            |    7 ++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff -puN mm/nonlinear.c~C5-nonlinear-fix-pfn_to_page mm/nonlinear.c
--- memhotplug/mm/nonlinear.c~C5-nonlinear-fix-pfn_to_page	2004-12-10 13:52:34.000000000 -0800
+++ memhotplug-dave/mm/nonlinear.c	2004-12-10 13:52:34.000000000 -0800
@@ -73,6 +73,7 @@ alloc_memmap(struct page *mem_map, unsig
 	section_nr = pfn_to_section(start_pfn);
 	limit = section_nr + size;
 	for (; section_nr < limit; section_nr++, mem_map += PAGES_PER_SECTION) {
+		BUG_ON(mem_section[section_nr].mem_map);
 		mem_section[section_nr].mem_map = mem_map;
 		for (page_idx = 0; page_idx < PAGES_PER_SECTION; page_idx++)
 			mem_map[page_idx].section = section_nr;
@@ -111,7 +112,11 @@ memmap_init(unsigned long num_pages, int
 struct page *
 pfn_to_page(unsigned long pfn)
 {
-	return &mem_section[phys_section[pfn_to_section(pfn)]].mem_map[section_offset_pfn(pfn)];
+	struct page *page;
+
+	BUG_ON(!mem_section[phys_section[pfn_to_section(pfn)]].mem_map);
+	page = &mem_section[phys_section[pfn_to_section(pfn)]].mem_map[section_offset_pfn(pfn)];
+	return page;
 }
 
 unsigned long
diff -puN include/linux/nonlinear.h~C5-nonlinear-fix-pfn_to_page include/linux/nonlinear.h
--- memhotplug/include/linux/nonlinear.h~C5-nonlinear-fix-pfn_to_page	2004-12-10 13:52:34.000000000 -0800
+++ memhotplug-dave/include/linux/nonlinear.h	2004-12-10 13:52:34.000000000 -0800
@@ -3,6 +3,8 @@
 
 struct page;
 
+#include <asm/bug.h>
+
 #ifndef CONFIG_NONLINEAR
 
 /*
@@ -87,6 +89,7 @@ static inline unsigned long
 __pa(void *ptr_addr)
 {
 	unsigned long addr = (unsigned long)ptr_addr;
+	BUG_ON(mem_section[addr_to_section(addr-PAGE_OFFSET)].phys_section == INVALID_SECTION);
 	return section_to_addr(mem_section[addr_to_section(addr-PAGE_OFFSET)].phys_section) |
 		section_offset(addr);
 }
@@ -94,6 +97,7 @@ __pa(void *ptr_addr)
 static inline void *
 __va(unsigned long addr)
 {
+	BUG_ON(phys_section[addr_to_section(addr)] == INVALID_PHYS_SECTION);
 	return (void *)(section_to_addr(phys_section[addr_to_section(addr)]) |
 		section_offset(addr)) + PAGE_OFFSET;
 }
_
