X-Git-Url: http://bbs.cooldavid.org/git/?a=blobdiff_plain;f=mm%2Fmemory.c;h=bde42c6d3633f15cfe51b1eae8e3e56833e86955;hb=de51257aa301652876ab6e8f13ea4eadbe4a3846;hp=119b7ccdf39b8ee542d3f4d695bff3c9d5322987;hpb=51c20fcced5badee0e2021c6c89f44aa3cbd72aa;p=net-next-2.6.git 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)