From f92f8eddbbfbf83b7263cbd995fb91256dbd4d71 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 8 Jan 2026 15:19:10 +0100 Subject: [PATCH] xfs: implement ->sync_lazytime Switch to the new explicit lazytime syncing method instead of trying to second guess what could be a lazytime update in ->dirty_inode. Signed-off-by: Christoph Hellwig Link: https://patch.msgid.link/20260108141934.2052404-11-hch@lst.de Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- fs/xfs/xfs_iops.c | 20 ++++++++++++++++++++ fs/xfs/xfs_super.c | 29 ----------------------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index aef5b05c1b769..338f3113f6746 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1221,6 +1221,22 @@ xfs_vn_update_time( return xfs_trans_commit(tp); } +static void +xfs_vn_sync_lazytime( + struct inode *inode) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + + if (xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp)) + return; + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); + xfs_trans_commit(tp); +} + STATIC int xfs_vn_fiemap( struct inode *inode, @@ -1264,6 +1280,7 @@ static const struct inode_operations xfs_inode_operations = { .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, .update_time = xfs_vn_update_time, + .sync_lazytime = xfs_vn_sync_lazytime, .fileattr_get = xfs_fileattr_get, .fileattr_set = xfs_fileattr_set, }; @@ -1290,6 +1307,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .setattr = xfs_vn_setattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .sync_lazytime = xfs_vn_sync_lazytime, .tmpfile = xfs_vn_tmpfile, .fileattr_get = xfs_fileattr_get, .fileattr_set = xfs_fileattr_set, @@ -1317,6 +1335,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .setattr = xfs_vn_setattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .sync_lazytime = xfs_vn_sync_lazytime, .tmpfile = xfs_vn_tmpfile, .fileattr_get = xfs_fileattr_get, .fileattr_set = xfs_fileattr_set, @@ -1328,6 +1347,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .setattr = xfs_vn_setattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .sync_lazytime = xfs_vn_sync_lazytime, .fileattr_get = xfs_fileattr_get, .fileattr_set = xfs_fileattr_set, }; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index bc71aa9dcee8d..094f257eff156 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -712,34 +712,6 @@ xfs_fs_destroy_inode( xfs_inode_mark_reclaimable(ip); } -static void -xfs_fs_dirty_inode( - struct inode *inode, - int flags) -{ - struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; - struct xfs_trans *tp; - - if (!(inode->i_sb->s_flags & SB_LAZYTIME)) - return; - - /* - * Only do the timestamp update if the inode is dirty (I_DIRTY_SYNC) - * and has dirty timestamp (I_DIRTY_TIME). I_DIRTY_TIME can be passed - * in flags possibly together with I_DIRTY_SYNC. - */ - if ((flags & ~I_DIRTY_TIME) != I_DIRTY_SYNC || !(flags & I_DIRTY_TIME)) - return; - - if (xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp)) - return; - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); - xfs_trans_commit(tp); -} - /* * Slab object creation initialisation for the XFS inode. * This covers only the idempotent fields in the XFS inode; @@ -1304,7 +1276,6 @@ xfs_fs_show_stats( static const struct super_operations xfs_super_operations = { .alloc_inode = xfs_fs_alloc_inode, .destroy_inode = xfs_fs_destroy_inode, - .dirty_inode = xfs_fs_dirty_inode, .drop_inode = xfs_fs_drop_inode, .evict_inode = xfs_fs_evict_inode, .put_super = xfs_fs_put_super, -- 2.47.3