xfs: Implement xfs_filemap_pfn_mkwrite() using __xfs_filemap_fault()
authorJan Kara <jack@suse.cz>
Wed, 1 Nov 2017 15:36:46 +0000 (16:36 +0100)
committerDan Williams <dan.j.williams@intel.com>
Fri, 3 Nov 2017 13:26:26 +0000 (06:26 -0700)
xfs_filemap_pfn_mkwrite() duplicates a lot of __xfs_filemap_fault().
It will also need to handle flushing for synchronous page faults. So
just make that function use __xfs_filemap_fault().

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
fs/xfs/xfs_file.c
fs/xfs/xfs_trace.h

index 7c6b8def6eed7c504f6fe162639fc258246ededf..4496b45678de124aaf86efc88bcd78893a571e3c 100644 (file)
@@ -1085,37 +1085,16 @@ xfs_filemap_page_mkwrite(
 }
 
 /*
- * pfn_mkwrite was originally inteneded to ensure we capture time stamp
- * updates on write faults. In reality, it's need to serialise against
- * truncate similar to page_mkwrite. Hence we cycle the XFS_MMAPLOCK_SHARED
- * to ensure we serialise the fault barrier in place.
+ * pfn_mkwrite was originally intended to ensure we capture time stamp updates
+ * on write faults. In reality, it needs to serialise against truncate and
+ * prepare memory for writing so handle is as standard write fault.
  */
 static int
 xfs_filemap_pfn_mkwrite(
        struct vm_fault         *vmf)
 {
 
-       struct inode            *inode = file_inode(vmf->vma->vm_file);
-       struct xfs_inode        *ip = XFS_I(inode);
-       int                     ret = VM_FAULT_NOPAGE;
-       loff_t                  size;
-
-       trace_xfs_filemap_pfn_mkwrite(ip);
-
-       sb_start_pagefault(inode->i_sb);
-       file_update_time(vmf->vma->vm_file);
-
-       /* check if the faulting page hasn't raced with truncate */
-       xfs_ilock(ip, XFS_MMAPLOCK_SHARED);
-       size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       if (vmf->pgoff >= size)
-               ret = VM_FAULT_SIGBUS;
-       else if (IS_DAX(inode))
-               ret = dax_iomap_fault(vmf, PE_SIZE_PTE, NULL, &xfs_iomap_ops);
-       xfs_iunlock(ip, XFS_MMAPLOCK_SHARED);
-       sb_end_pagefault(inode->i_sb);
-       return ret;
-
+       return __xfs_filemap_fault(vmf, PE_SIZE_PTE, true);
 }
 
 static const struct vm_operations_struct xfs_file_vm_ops = {
index bb5514688d470b046e0f125b2832ba2d30b3d34d..6333ad09e0f349a54e037342781d3476a9f0c7a8 100644 (file)
@@ -688,8 +688,6 @@ DEFINE_INODE_EVENT(xfs_inode_set_cowblocks_tag);
 DEFINE_INODE_EVENT(xfs_inode_clear_cowblocks_tag);
 DEFINE_INODE_EVENT(xfs_inode_free_cowblocks_invalid);
 
-DEFINE_INODE_EVENT(xfs_filemap_pfn_mkwrite);
-
 TRACE_EVENT(xfs_filemap_fault,
        TP_PROTO(struct xfs_inode *ip, enum page_entry_size pe_size,
                 bool write_fault),