summaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-12-14 18:07:30 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-12-14 19:04:09 -0500
commit38b8cb7fbb892503fe9fcf748ebbed8c9fde7bf8 (patch)
tree2b728c22ac01628efe9c8cf120bf34d057ad96d5 /mm/memory.c
parent97ba0c2b4b0994044e404b7a96fc92a2e0424534 (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.c22
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 */
2037static int do_page_mkwrite(struct vm_area_struct *vma, struct page *page, 2037static 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);