diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 16 | 
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)  |