diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/mm/memory.c b/mm/memory.c index 22e037e3364e..1fc358bec6d5 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2231,15 +2231,24 @@ static int wp_page_shared(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2231 | * read-only shared pages can get COWed by | 2231 | * read-only shared pages can get COWed by |
2232 | * get_user_pages(.write=1, .force=1). | 2232 | * get_user_pages(.write=1, .force=1). |
2233 | */ | 2233 | */ |
2234 | if (vma->vm_ops && vma->vm_ops->page_mkwrite) { | 2234 | // if (vma->vm_ops && vma->vm_ops->page_mkwrite) { |
2235 | { | ||
2235 | int tmp; | 2236 | int tmp; |
2236 | 2237 | ||
2237 | pte_unmap_unlock(page_table, ptl); | 2238 | pte_unmap_unlock(page_table, ptl); |
2238 | tmp = do_page_mkwrite(vma, old_page, address); | 2239 | |
2239 | if (unlikely(!tmp || (tmp & | 2240 | if (page_write_fault_retry(old_page)) { |
2240 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { | ||
2241 | page_cache_release(old_page); | 2241 | page_cache_release(old_page); |
2242 | return tmp; | 2242 | return 0; |
2243 | } | ||
2244 | |||
2245 | if (vma->vm_ops && vma->vm_ops->page_mkwrite) { | ||
2246 | tmp = do_page_mkwrite(vma, old_page, address); | ||
2247 | if (unlikely(!tmp || (tmp & | ||
2248 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { | ||
2249 | page_cache_release(old_page); | ||
2250 | return tmp; | ||
2251 | } | ||
2243 | } | 2252 | } |
2244 | /* | 2253 | /* |
2245 | * Since we dropped the lock we need to revalidate | 2254 | * Since we dropped the lock we need to revalidate |