From: Martin Schwidefsky <schwidefsky@de.ibm.com>

Just found an small bug in pgalloc for s390*.  Comparing notes with other
architectures I found that pte_alloc_one is sick for alpha and sparc64 as
well.


---

 25-akpm/include/asm-alpha/pgalloc.h   |    5 ++++-
 25-akpm/include/asm-s390/pgalloc.h    |    5 ++++-
 25-akpm/include/asm-sparc64/pgalloc.h |   10 +++++++++-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff -puN include/asm-alpha/pgalloc.h~pte_alloc_one-null-pointer-check include/asm-alpha/pgalloc.h
--- 25/include/asm-alpha/pgalloc.h~pte_alloc_one-null-pointer-check	2004-04-03 03:00:07.396107176 -0800
+++ 25-akpm/include/asm-alpha/pgalloc.h	2004-04-03 03:00:07.401106416 -0800
@@ -63,7 +63,10 @@ pte_free_kernel(pte_t *pte)
 static inline struct page *
 pte_alloc_one(struct mm_struct *mm, unsigned long addr)
 {
-	return virt_to_page(pte_alloc_one_kernel(mm, addr));
+	pte_t *pte = pte_alloc_one_kernel(mm, addr);
+	if (pte)
+		return virt_to_page(pte);
+	return 0;
 }
 
 static inline void
diff -puN include/asm-s390/pgalloc.h~pte_alloc_one-null-pointer-check include/asm-s390/pgalloc.h
--- 25/include/asm-s390/pgalloc.h~pte_alloc_one-null-pointer-check	2004-04-03 03:00:07.397107024 -0800
+++ 25-akpm/include/asm-s390/pgalloc.h	2004-04-03 03:00:07.401106416 -0800
@@ -139,7 +139,10 @@ pte_alloc_one_kernel(struct mm_struct *m
 static inline struct page *
 pte_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
 {
-	return virt_to_page(pte_alloc_one_kernel(mm, vmaddr));
+	pte_t *pte = pte_alloc_one_kernel(mm, vmaddr);
+	if (pte)
+		return virt_to_page(pte_alloc_one_kernel(mm, vmaddr));
+	return 0;
 }
 
 static inline void pte_free_kernel(pte_t *pte)
diff -puN include/asm-sparc64/pgalloc.h~pte_alloc_one-null-pointer-check include/asm-sparc64/pgalloc.h
--- 25/include/asm-sparc64/pgalloc.h~pte_alloc_one-null-pointer-check	2004-04-03 03:00:07.398106872 -0800
+++ 25-akpm/include/asm-sparc64/pgalloc.h	2004-04-03 03:00:07.402106264 -0800
@@ -189,7 +189,15 @@ static __inline__ void free_pmd_slow(pmd
 	pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE))
 
 extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address);
-#define pte_alloc_one(MM,ADDR)	virt_to_page(pte_alloc_one_kernel(MM,ADDR))
+
+static inline struct page *
+pte_alloc_one(struct mm_struct *mm, unsigned long addr)
+{
+	pte_t *pte = pte_alloc_one_kernel(mm, addr);
+	if (pte)
+		return virt_to_page(pte);
+	return 0;
+}
 
 static __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
 {

_