]> git.baikalelectronics.ru Git - kernel.git/commitdiff
xfs: force the log after remapping a synchronous-writes file
authorChandan Babu R <chandan.babu@oracle.com>
Mon, 31 Oct 2022 04:53:54 +0000 (10:23 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Nov 2022 14:56:54 +0000 (23:56 +0900)
From: "Darrick J. Wong" <darrick.wong@oracle.com>

commit cc42af7f9fccb684adb14177bbc7ee5c1f37b96c upstream.

Commit 9700dd3e35d4 tried to make it so that a remap operation would
force the log out to disk if the filesystem is mounted with mandatory
synchronous writes.  Unfortunately, that commit failed to handle the
case where the inode or the file descriptor require mandatory
synchronous writes.

Refactor the check into into a helper that will look for all three
conditions, and now we can treat reflink just like any other synchronous
write.

Fixes: 9700dd3e35d4 ("xfs: reflink should force the log out if mounted with wsync")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_file.c

index cbca91b4b5b8475220943af92f8ab3549fdc5383..c67fab2c37c5890e82a35719ac8843743d245b5e 100644 (file)
@@ -990,6 +990,21 @@ xfs_file_fadvise(
        return ret;
 }
 
+/* Does this file, inode, or mount want synchronous writes? */
+static inline bool xfs_file_sync_writes(struct file *filp)
+{
+       struct xfs_inode        *ip = XFS_I(file_inode(filp));
+
+       if (ip->i_mount->m_flags & XFS_MOUNT_WSYNC)
+               return true;
+       if (filp->f_flags & (__O_SYNC | O_DSYNC))
+               return true;
+       if (IS_SYNC(file_inode(filp)))
+               return true;
+
+       return false;
+}
+
 STATIC loff_t
 xfs_file_remap_range(
        struct file             *file_in,
@@ -1047,7 +1062,7 @@ xfs_file_remap_range(
        if (ret)
                goto out_unlock;
 
-       if (mp->m_flags & XFS_MOUNT_WSYNC)
+       if (xfs_file_sync_writes(file_in) || xfs_file_sync_writes(file_out))
                xfs_log_force_inode(dest);
 out_unlock:
        xfs_reflink_remap_unlock(file_in, file_out);