aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugh Dickins <hugh@veritas.com>2005-11-29 11:55:48 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-29 17:09:17 -0500
commit325f04dbca60a4cfe4ac25e7cf246edd07eb4c5f (patch)
treeeb9e9fb10b1897fae3130c55c4821b829748767b
parente5bbe4dfc8dbfc50ef89f8641e020616d4d1e69e (diff)
[PATCH] pfnmap: do_no_page BUG_ON again
Use copy_user_highpage directly instead of cow_user_page in do_no_page: in the immediately following page_cache_release, and elsewhere, it is assuming that new_page is normal. If any VM_PFNMAP driver can get to do_no_page, it's just a BUG (but not in the case of do_anonymous_page). Signed-off-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--mm/memory.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/mm/memory.c b/mm/memory.c
index ae259b6e5a21..5bfa52a98630 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2009,6 +2009,8 @@ static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma,
2009 int anon = 0; 2009 int anon = 0;
2010 2010
2011 pte_unmap(page_table); 2011 pte_unmap(page_table);
2012 BUG_ON(vma->vm_flags & VM_PFNMAP);
2013
2012 if (vma->vm_file) { 2014 if (vma->vm_file) {
2013 mapping = vma->vm_file->f_mapping; 2015 mapping = vma->vm_file->f_mapping;
2014 sequence = mapping->truncate_count; 2016 sequence = mapping->truncate_count;
@@ -2041,7 +2043,7 @@ retry:
2041 page = alloc_page_vma(GFP_HIGHUSER, vma, address); 2043 page = alloc_page_vma(GFP_HIGHUSER, vma, address);
2042 if (!page) 2044 if (!page)
2043 goto oom; 2045 goto oom;
2044 cow_user_page(page, new_page, address); 2046 copy_user_highpage(page, new_page, address);
2045 page_cache_release(new_page); 2047 page_cache_release(new_page);
2046 new_page = page; 2048 new_page = page;
2047 anon = 1; 2049 anon = 1;