]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs: clear I_DIRTY_TIME in sync_lazytime
authorChristoph Hellwig <hch@lst.de>
Tue, 17 Mar 2026 13:44:04 +0000 (14:44 +0100)
committerChristian Brauner <brauner@kernel.org>
Tue, 17 Mar 2026 14:12:15 +0000 (15:12 +0100)
For file systems implementing ->sync_lazytime, I_DIRTY_TIME fails to get
cleared in sync_lazytime, and might cause additional calls to
sync_lazytime during inode deactivation.  Use the same pattern as in
__mark_inode_dirty to clear the flag under the inode lock.

Fixes: 5cf06ea56ee6 ("fs: add a ->sync_lazytime method")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260317134409.1691317-1-hch@lst.de
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fs-writeback.c

index 7c75ed7e897994a421b74f94f3ea1b7df651d9c3..d8dac1931595bf9e19dbc2a2f1bb5461e4bd703a 100644 (file)
@@ -1711,6 +1711,19 @@ static void requeue_inode(struct inode *inode, struct bdi_writeback *wb,
        }
 }
 
+static bool __sync_lazytime(struct inode *inode)
+{
+       spin_lock(&inode->i_lock);
+       if (!(inode_state_read(inode) & I_DIRTY_TIME)) {
+               spin_unlock(&inode->i_lock);
+               return false;
+       }
+       inode_state_clear(inode, I_DIRTY_TIME);
+       spin_unlock(&inode->i_lock);
+       inode->i_op->sync_lazytime(inode);
+       return true;
+}
+
 bool sync_lazytime(struct inode *inode)
 {
        if (!(inode_state_read_once(inode) & I_DIRTY_TIME))
@@ -1718,9 +1731,8 @@ bool sync_lazytime(struct inode *inode)
 
        trace_writeback_lazytime(inode);
        if (inode->i_op->sync_lazytime)
-               inode->i_op->sync_lazytime(inode);
-       else
-               mark_inode_dirty_sync(inode);
+               return __sync_lazytime(inode);
+       mark_inode_dirty_sync(inode);
        return true;
 }