On Fri, Apr 03, 2020 at 02:55:21PM +0200, Christoph Hellwig wrote: > Create a new helper to force the log up to the last LSN touching an > inode. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_export.c | 14 +------------- > fs/xfs/xfs_file.c | 12 +----------- > fs/xfs/xfs_inode.c | 19 +++++++++++++++++++ > fs/xfs/xfs_inode.h | 1 + > 4 files changed, 22 insertions(+), 24 deletions(-) > > diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c > index f1372f9046e3..5a4b0119143a 100644 > --- a/fs/xfs/xfs_export.c > +++ b/fs/xfs/xfs_export.c > @@ -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 = { > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index b8a4a3f29b36..68e1cbb3cfcc 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -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 > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index c5077e6326c7..e48fc835cb85 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3951,3 +3951,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); > +} > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 492e53992fa9..c6a63f6764a6 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -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)) > > -- > 2.25.1 >