]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: implement ->sync_lazytime
authorChristoph Hellwig <hch@lst.de>
Thu, 8 Jan 2026 14:19:10 +0000 (15:19 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 13:01:33 +0000 (14:01 +0100)
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 <hch@lst.de>
Link: https://patch.msgid.link/20260108141934.2052404-11-hch@lst.de
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_iops.c
fs/xfs/xfs_super.c

index aef5b05c1b769d5cea45fbd9a3d4860a7ccc292b..338f3113f674683ea91ed6b7057c9decaae5cc29 100644 (file)
@@ -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,
 };
index bc71aa9dcee8d6afbf641b0606895da49fe00dbf..094f257eff156313978e41f72f929ead43bd884a 100644 (file)
@@ -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,