Merge tag 'xfs-5.9-merge-7' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-2.6-microblaze.git] / fs / xfs / xfs_file.c
index d538411..c31cd3b 100644 (file)
@@ -94,6 +94,7 @@ xfs_file_fsync(
 {
        struct inode            *inode = file->f_mapping->host;
        struct xfs_inode        *ip = XFS_I(inode);
+       struct xfs_inode_log_item *iip = ip->i_itemp;
        struct xfs_mount        *mp = ip->i_mount;
        int                     error = 0;
        int                     log_flushed = 0;
@@ -137,13 +138,15 @@ xfs_file_fsync(
        xfs_ilock(ip, XFS_ILOCK_SHARED);
        if (xfs_ipincount(ip)) {
                if (!datasync ||
-                   (ip->i_itemp->ili_fsync_fields & ~XFS_ILOG_TIMESTAMP))
-                       lsn = ip->i_itemp->ili_last_lsn;
+                   (iip->ili_fsync_fields & ~XFS_ILOG_TIMESTAMP))
+                       lsn = iip->ili_last_lsn;
        }
 
        if (lsn) {
                error = xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, &log_flushed);
-               ip->i_itemp->ili_fsync_fields = 0;
+               spin_lock(&iip->ili_lock);
+               iip->ili_fsync_fields = 0;
+               spin_unlock(&iip->ili_lock);
        }
        xfs_iunlock(ip, XFS_ILOCK_SHARED);
 
@@ -1035,7 +1038,7 @@ xfs_file_remap_range(
        /* Prepare and then clone file data. */
        ret = xfs_reflink_remap_prep(file_in, pos_in, file_out, pos_out,
                        &len, remap_flags);
-       if (ret < 0 || len == 0)
+       if (ret || len == 0)
                return ret;
 
        trace_xfs_reflink_remap_range(src, pos_in, len, dest, pos_out);
@@ -1065,7 +1068,7 @@ xfs_file_remap_range(
        if (mp->m_flags & XFS_MOUNT_WSYNC)
                xfs_log_force_inode(dest);
 out_unlock:
-       xfs_reflink_remap_unlock(file_in, file_out);
+       xfs_iunlock2_io_mmap(src, dest);
        if (ret)
                trace_xfs_reflink_remap_range_error(dest, ret, _RET_IP_);
        return remapped > 0 ? remapped : ret;
@@ -1263,10 +1266,23 @@ xfs_filemap_pfn_mkwrite(
        return __xfs_filemap_fault(vmf, PE_SIZE_PTE, true);
 }
 
+static void
+xfs_filemap_map_pages(
+       struct vm_fault         *vmf,
+       pgoff_t                 start_pgoff,
+       pgoff_t                 end_pgoff)
+{
+       struct inode            *inode = file_inode(vmf->vma->vm_file);
+
+       xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
+       filemap_map_pages(vmf, start_pgoff, end_pgoff);
+       xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
+}
+
 static const struct vm_operations_struct xfs_file_vm_ops = {
        .fault          = xfs_filemap_fault,
        .huge_fault     = xfs_filemap_huge_fault,
-       .map_pages      = filemap_map_pages,
+       .map_pages      = xfs_filemap_map_pages,
        .page_mkwrite   = xfs_filemap_page_mkwrite,
        .pfn_mkwrite    = xfs_filemap_pfn_mkwrite,
 };