]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: factor out a sync_lazytime helper
authorChristoph Hellwig <hch@lst.de>
Thu, 8 Jan 2026 14:19:06 +0000 (15:19 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 13:01:33 +0000 (14:01 +0100)
Centralize how we synchronize a lazytime update into the actual on-disk
timestamp into a single helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260108141934.2052404-7-hch@lst.de
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fs-writeback.c
fs/inode.c
fs/internal.h
fs/sync.c
include/trace/events/writeback.h

index 6800886c4d1047b28c5c07613a1a1b256e982a95..3d68b757136c82020397b89a0378e363591b6782 100644 (file)
@@ -1711,6 +1711,16 @@ static void requeue_inode(struct inode *inode, struct bdi_writeback *wb,
        }
 }
 
+bool sync_lazytime(struct inode *inode)
+{
+       if (!(inode_state_read_once(inode) & I_DIRTY_TIME))
+               return false;
+
+       trace_writeback_lazytime(inode);
+       mark_inode_dirty_sync(inode);
+       return true;
+}
+
 /*
  * Write out an inode and its dirty pages (or some of its dirty pages, depending
  * on @wbc->nr_to_write), and clear the relevant dirty flags from i_state.
@@ -1750,17 +1760,15 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
        }
 
        /*
-        * If the inode has dirty timestamps and we need to write them, call
-        * mark_inode_dirty_sync() to notify the filesystem about it and to
-        * change I_DIRTY_TIME into I_DIRTY_SYNC.
+        * For data integrity writeback, or when the dirty interval expired,
+        * ask the file system to propagata lazy timestamp updates into real
+        * dirty state.
         */
        if ((inode_state_read_once(inode) & I_DIRTY_TIME) &&
            (wbc->sync_mode == WB_SYNC_ALL ||
             time_after(jiffies, inode->dirtied_time_when +
-                       dirtytime_expire_interval * HZ))) {
-               trace_writeback_lazytime(inode);
-               mark_inode_dirty_sync(inode);
-       }
+                       dirtytime_expire_interval * HZ)))
+               sync_lazytime(inode);
 
        /*
         * Get and clear the dirty flags from i_state.  This needs to be done
index a0dd11a05473fec1f445be9ee99c35b23e479bbe..0cafe74bff2d4a75304178bcfb6a9b7565f1a689 100644 (file)
@@ -1979,11 +1979,8 @@ retry:
        if (atomic_add_unless(&inode->i_count, -1, 1))
                return;
 
-       if ((inode_state_read_once(inode) & I_DIRTY_TIME) && inode->i_nlink) {
-               trace_writeback_lazytime_iput(inode);
-               mark_inode_dirty_sync(inode);
+       if (inode->i_nlink && sync_lazytime(inode))
                goto retry;
-       }
 
        spin_lock(&inode->i_lock);
        if (unlikely((inode_state_read(inode) & I_DIRTY_TIME) && inode->i_nlink)) {
index ab638d41ab81db8de33a895defd6e3538a170223..18a062c1b5b02fe5b762967fdfbfddf7bc666eee 100644 (file)
@@ -214,7 +214,8 @@ bool in_group_or_capable(struct mnt_idmap *idmap,
 /*
  * fs-writeback.c
  */
-extern long get_nr_dirty_inodes(void);
+long get_nr_dirty_inodes(void);
+bool sync_lazytime(struct inode *inode);
 
 /*
  * dcache.c
index 431fc5f5be067cc7e02ad41255bf4479c8de6629..4283af7119d10c7c927d1240c60443b7a55112ef 100644 (file)
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -183,8 +183,8 @@ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
 
        if (!file->f_op->fsync)
                return -EINVAL;
-       if (!datasync && (inode_state_read_once(inode) & I_DIRTY_TIME))
-               mark_inode_dirty_sync(inode);
+       if (!datasync)
+               sync_lazytime(inode);
        return file->f_op->fsync(file, start, end, datasync);
 }
 EXPORT_SYMBOL(vfs_fsync_range);
index 311a341e6fe428baab4e0094d8e9131e215eea9e..7162d03e69a5e17e5c150159b47c162fafaca537 100644 (file)
@@ -856,12 +856,6 @@ DEFINE_EVENT(writeback_inode_template, writeback_lazytime,
        TP_ARGS(inode)
 );
 
-DEFINE_EVENT(writeback_inode_template, writeback_lazytime_iput,
-       TP_PROTO(struct inode *inode),
-
-       TP_ARGS(inode)
-);
-
 DEFINE_EVENT(writeback_inode_template, writeback_dirty_inode_enqueue,
 
        TP_PROTO(struct inode *inode),