diff options
| author | Christoph Hellwig <hch@lst.de> | 2026-01-08 15:19:07 +0100 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-01-12 14:01:33 +0100 |
| commit | 5cf06ea56ee67209d4e9a0b381641fb062ecd2c3 (patch) | |
| tree | 14e081b4f62107425f38b354b343872b10999e3b /fs/fs-writeback.c | |
| parent | 188344c8ac0b740ee2e5deebda2004b39ccbee74 (diff) | |
fs: add a ->sync_lazytime method
Allow the file system to explicitly implement lazytime syncing instead
of pigging back on generic inode dirtying. This allows to simplify
the XFS implementation and prepares for non-blocking lazytime timestamp
updates.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260108141934.2052404-8-hch@lst.de
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 3d68b757136c..62658be2578b 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1717,7 +1717,10 @@ bool sync_lazytime(struct inode *inode) return false; trace_writeback_lazytime(inode); - mark_inode_dirty_sync(inode); + if (inode->i_op->sync_lazytime) + inode->i_op->sync_lazytime(inode); + else + mark_inode_dirty_sync(inode); return true; } @@ -2569,6 +2572,8 @@ void __mark_inode_dirty(struct inode *inode, int flags) trace_writeback_mark_inode_dirty(inode, flags); if (flags & I_DIRTY_INODE) { + bool was_dirty_time = false; + /* * Inode timestamp update will piggback on this dirtying. * We tell ->dirty_inode callback that timestamps need to @@ -2579,6 +2584,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) if (inode_state_read(inode) & I_DIRTY_TIME) { inode_state_clear(inode, I_DIRTY_TIME); flags |= I_DIRTY_TIME; + was_dirty_time = true; } spin_unlock(&inode->i_lock); } @@ -2591,9 +2597,12 @@ void __mark_inode_dirty(struct inode *inode, int flags) * for just I_DIRTY_PAGES or I_DIRTY_TIME. */ trace_writeback_dirty_inode_start(inode, flags); - if (sb->s_op->dirty_inode) + if (sb->s_op->dirty_inode) { sb->s_op->dirty_inode(inode, flags & (I_DIRTY_INODE | I_DIRTY_TIME)); + } else if (was_dirty_time && inode->i_op->sync_lazytime) { + inode->i_op->sync_lazytime(inode); + } trace_writeback_dirty_inode(inode, flags); /* I_DIRTY_INODE supersedes I_DIRTY_TIME. */ |
