diff options
author | Jan Kara <jack@suse.cz> | 2016-12-14 18:07:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-14 19:04:09 -0500 |
commit | 38b8cb7fbb892503fe9fcf748ebbed8c9fde7bf8 (patch) | |
tree | 2b728c22ac01628efe9c8cf120bf34d057ad96d5 /mm/memory.c | |
parent | 97ba0c2b4b0994044e404b7a96fc92a2e0424534 (diff) |
mm: pass vm_fault structure into do_page_mkwrite()
We will need more information in the ->page_mkwrite() helper for DAX to
be able to fully finish faults there. Pass vm_fault structure to
do_page_mkwrite() and use it there so that information propagates
properly from upper layers.
Link: http://lkml.kernel.org/r/1479460644-25076-13-git-send-email-jack@suse.cz
Signed-off-by: Jan Kara <jack@suse.cz>
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/mm/memory.c b/mm/memory.c index 6fd827804bf5..e8a527885e8b 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2034,20 +2034,17 @@ static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma) | |||
2034 | * | 2034 | * |
2035 | * We do this without the lock held, so that it can sleep if it needs to. | 2035 | * We do this without the lock held, so that it can sleep if it needs to. |
2036 | */ | 2036 | */ |
2037 | static int do_page_mkwrite(struct vm_area_struct *vma, struct page *page, | 2037 | static int do_page_mkwrite(struct vm_fault *vmf) |
2038 | unsigned long address) | ||
2039 | { | 2038 | { |
2040 | struct vm_fault vmf; | ||
2041 | int ret; | 2039 | int ret; |
2040 | struct page *page = vmf->page; | ||
2041 | unsigned int old_flags = vmf->flags; | ||
2042 | 2042 | ||
2043 | vmf.address = address & PAGE_MASK; | 2043 | vmf->flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE; |
2044 | vmf.pgoff = page->index; | ||
2045 | vmf.flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE; | ||
2046 | vmf.gfp_mask = __get_fault_gfp_mask(vma); | ||
2047 | vmf.page = page; | ||
2048 | vmf.cow_page = NULL; | ||
2049 | 2044 | ||
2050 | ret = vma->vm_ops->page_mkwrite(vma, &vmf); | 2045 | ret = vmf->vma->vm_ops->page_mkwrite(vmf->vma, vmf); |
2046 | /* Restore original flags so that caller is not surprised */ | ||
2047 | vmf->flags = old_flags; | ||
2051 | if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) | 2048 | if (unlikely(ret & (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) |
2052 | return ret; | 2049 | return ret; |
2053 | if (unlikely(!(ret & VM_FAULT_LOCKED))) { | 2050 | if (unlikely(!(ret & VM_FAULT_LOCKED))) { |
@@ -2323,7 +2320,8 @@ static int wp_page_shared(struct vm_fault *vmf, struct page *old_page) | |||
2323 | int tmp; | 2320 | int tmp; |
2324 | 2321 | ||
2325 | pte_unmap_unlock(vmf->pte, vmf->ptl); | 2322 | pte_unmap_unlock(vmf->pte, vmf->ptl); |
2326 | tmp = do_page_mkwrite(vma, old_page, vmf->address); | 2323 | vmf->page = old_page; |
2324 | tmp = do_page_mkwrite(vmf); | ||
2327 | if (unlikely(!tmp || (tmp & | 2325 | if (unlikely(!tmp || (tmp & |
2328 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { | 2326 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { |
2329 | put_page(old_page); | 2327 | put_page(old_page); |
@@ -3324,7 +3322,7 @@ static int do_shared_fault(struct vm_fault *vmf) | |||
3324 | */ | 3322 | */ |
3325 | if (vma->vm_ops->page_mkwrite) { | 3323 | if (vma->vm_ops->page_mkwrite) { |
3326 | unlock_page(vmf->page); | 3324 | unlock_page(vmf->page); |
3327 | tmp = do_page_mkwrite(vma, vmf->page, vmf->address); | 3325 | tmp = do_page_mkwrite(vmf); |
3328 | if (unlikely(!tmp || | 3326 | if (unlikely(!tmp || |
3329 | (tmp & (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { | 3327 | (tmp & (VM_FAULT_ERROR | VM_FAULT_NOPAGE)))) { |
3330 | put_page(vmf->page); | 3328 | put_page(vmf->page); |