summaryrefslogtreecommitdiff
path: root/mm/memory.c
diff options
context:
space:
mode:
authorAlex Elder <aelder@sgi.com>2010-08-02 10:24:57 -0500
committerAlex Elder <aelder@sgi.com>2010-08-02 10:24:57 -0500
commit6b0a2996a0c023d84bc27ec7528a6e54cb5ea264 (patch)
tree9fa9a85d5d871b3cb3c28daf57d8ef8f05becd66 /mm/memory.c
parent209fb87a259ead17e966627b7f053d16a96898da (diff)
parent9fe6206f400646a2322096b56c59891d530e8d51 (diff)
Merge branch 'v2.6.35'
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 119b7ccdf39..bde42c6d363 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1394,10 +1394,20 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
return i ? : -EFAULT;
}
if (pages) {
- struct page *page = vm_normal_page(gate_vma, start, *pte);
+ struct page *page;
+
+ page = vm_normal_page(gate_vma, start, *pte);
+ if (!page) {
+ if (!(gup_flags & FOLL_DUMP) &&
+ is_zero_pfn(pte_pfn(*pte)))
+ page = pte_page(*pte);
+ else {
+ pte_unmap(pte);
+ return i ? : -EFAULT;
+ }
+ }
pages[i] = page;
- if (page)
- get_page(page);
+ get_page(page);
}
pte_unmap(pte);
if (vmas)