]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: enable non-blocking timestamp updates
authorChristoph Hellwig <hch@lst.de>
Thu, 8 Jan 2026 14:19:11 +0000 (15:19 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 13:01:33 +0000 (14:01 +0100)
The lazytime path using the generic helpers can never block in XFS
because there is no ->dirty_inode method that could block.  Allow
non-blocking timestamp updates for this case by replacing
generic_update_time with the open coded version without the S_NOWAIT
check.

Fixes: 66fa3cedf16a ("fs: Add async write file modification handling.")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260108141934.2052404-12-hch@lst.de
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_iops.c

index 338f3113f674683ea91ed6b7057c9decaae5cc29..1cdd8a360510b76e6aa6dce73163d4c099552792 100644 (file)
@@ -1195,16 +1195,22 @@ xfs_vn_update_time(
 
        trace_xfs_update_time(ip);
 
-       if (flags & IOCB_NOWAIT)
-               return -EAGAIN;
-
        if (inode->i_sb->s_flags & SB_LAZYTIME) {
-               if (type == FS_UPD_ATIME ||
-                   !inode_maybe_inc_iversion(inode, false))
-                       return generic_update_time(inode, type, flags);
+               int dirty;
+
+               dirty = inode_update_time(inode, type, flags);
+               if (dirty <= 0)
+                       return dirty;
+               if (dirty == I_DIRTY_TIME) {
+                       __mark_inode_dirty(inode, I_DIRTY_TIME);
+                       return 0;
+               }
 
                /* Capture the iversion update that just occurred */
                log_flags |= XFS_ILOG_CORE;
+       } else {
+               if (flags & IOCB_NOWAIT)
+                       return -EAGAIN;
        }
 
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_fsyncts, 0, 0, 0, &tp);