xfs: factor out a new xfs_log_force_inode helper
authorChristoph Hellwig <hch@lst.de>
Fri, 3 Apr 2020 18:45:37 +0000 (11:45 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 6 Apr 2020 15:44:35 +0000 (08:44 -0700)
Create a new helper to force the log up to the last LSN touching an
inode.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_export.c
fs/xfs/xfs_file.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h

index f1372f9046e389313afa3101a9072d0344e31818..5a4b0119143a86f8393042aa4a40d159ea891206 100644 (file)
@@ -15,7 +15,6 @@
 #include "xfs_trans.h"
 #include "xfs_inode_item.h"
 #include "xfs_icache.h"
-#include "xfs_log.h"
 #include "xfs_pnfs.h"
 
 /*
@@ -221,18 +220,7 @@ STATIC int
 xfs_fs_nfs_commit_metadata(
        struct inode            *inode)
 {
-       struct xfs_inode        *ip = XFS_I(inode);
-       struct xfs_mount        *mp = ip->i_mount;
-       xfs_lsn_t               lsn = 0;
-
-       xfs_ilock(ip, XFS_ILOCK_SHARED);
-       if (xfs_ipincount(ip))
-               lsn = ip->i_itemp->ili_last_lsn;
-       xfs_iunlock(ip, XFS_ILOCK_SHARED);
-
-       if (!lsn)
-               return 0;
-       return xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL);
+       return xfs_log_force_inode(XFS_I(inode));
 }
 
 const struct export_operations xfs_export_operations = {
index b8a4a3f29b367dd35a46351991e5dd7c010f35a9..68e1cbb3cfcc826fc97fbfd7dd8159110222d926 100644 (file)
@@ -80,19 +80,9 @@ xfs_dir_fsync(
        int                     datasync)
 {
        struct xfs_inode        *ip = XFS_I(file->f_mapping->host);
-       struct xfs_mount        *mp = ip->i_mount;
-       xfs_lsn_t               lsn = 0;
 
        trace_xfs_dir_fsync(ip);
-
-       xfs_ilock(ip, XFS_ILOCK_SHARED);
-       if (xfs_ipincount(ip))
-               lsn = ip->i_itemp->ili_last_lsn;
-       xfs_iunlock(ip, XFS_ILOCK_SHARED);
-
-       if (!lsn)
-               return 0;
-       return xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL);
+       return xfs_log_force_inode(ip);
 }
 
 STATIC int
index ae86c870da92d8751ab3842f614638e59fa1957e..d1772786af29deb5401372e2472175b8e9d9bcc7 100644 (file)
@@ -3945,3 +3945,22 @@ xfs_irele(
        trace_xfs_irele(ip, _RET_IP_);
        iput(VFS_I(ip));
 }
+
+/*
+ * Ensure all commited transactions touching the inode are written to the log.
+ */
+int
+xfs_log_force_inode(
+       struct xfs_inode        *ip)
+{
+       xfs_lsn_t               lsn = 0;
+
+       xfs_ilock(ip, XFS_ILOCK_SHARED);
+       if (xfs_ipincount(ip))
+               lsn = ip->i_itemp->ili_last_lsn;
+       xfs_iunlock(ip, XFS_ILOCK_SHARED);
+
+       if (!lsn)
+               return 0;
+       return xfs_log_force_lsn(ip->i_mount, lsn, XFS_LOG_SYNC, NULL);
+}
index 492e53992fa94b470ad6314cf98412c607eab244..c6a63f6764a67bead76c69592e603f0010bafc59 100644 (file)
@@ -426,6 +426,7 @@ int         xfs_itruncate_extents_flags(struct xfs_trans **,
                                struct xfs_inode *, int, xfs_fsize_t, int);
 void           xfs_iext_realloc(xfs_inode_t *, int, int);
 
+int            xfs_log_force_inode(struct xfs_inode *ip);
 void           xfs_iunpin_wait(xfs_inode_t *);
 #define xfs_ipincount(ip)      ((unsigned int) atomic_read(&ip->i_pincount))