summaryrefslogtreecommitdiff
path: root/mm/memory.c
diff options
context:
space:
mode:
authorHugh Dickins <hugh@veritas.com>2005-11-29 16:55:48 +0000
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-29 14:09:17 -0800
commit325f04dbca60a4cfe4ac25e7cf246edd07eb4c5f (patch)
treeeb9e9fb10b1897fae3130c55c4821b829748767b /mm/memory.c
parente5bbe4dfc8dbfc50ef89f8641e020616d4d1e69e (diff)
downloadlwn-325f04dbca60a4cfe4ac25e7cf246edd07eb4c5f.tar.gz
lwn-325f04dbca60a4cfe4ac25e7cf246edd07eb4c5f.zip
[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>
Diffstat (limited to 'mm/memory.c')
-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,
int anon = 0;
pte_unmap(page_table);
+ BUG_ON(vma->vm_flags & VM_PFNMAP);
+
if (vma->vm_file) {
mapping = vma->vm_file->f_mapping;
sequence = mapping->truncate_count;
@@ -2041,7 +2043,7 @@ retry:
page = alloc_page_vma(GFP_HIGHUSER, vma, address);
if (!page)
goto oom;
- cow_user_page(page, new_page, address);
+ copy_user_highpage(page, new_page, address);
page_cache_release(new_page);
new_page = page;
anon = 1;