We leak a page in do_no_page() if pte_chain_alloc fails.


---

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

diff -puN mm/memory.c~do_no_page-leak-fix mm/memory.c
--- 25/mm/memory.c~do_no_page-leak-fix	2004-01-08 09:50:55.000000000 -0800
+++ 25-akpm/mm/memory.c	2004-01-08 09:51:40.000000000 -0800
@@ -1448,10 +1448,8 @@ retry:
 	 */
 	if (write_access && !(vma->vm_flags & VM_SHARED)) {
 		struct page * page = alloc_page(GFP_HIGHUSER);
-		if (!page) {
-			page_cache_release(new_page);
+		if (!page)
 			goto oom;
-		}
 		copy_user_highpage(page, new_page, address);
 		page_cache_release(new_page);
 		lru_cache_add_active(page);
@@ -1508,6 +1506,7 @@ retry:
 	spin_unlock(&mm->page_table_lock);
 	goto out;
 oom:
+	page_cache_release(new_page);
 	ret = VM_FAULT_OOM;
 out:
 	pte_chain_free(pte_chain);

_