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. */ diff --git a/include/linux/fs.h b/include/linux/fs.h index ec2f78db0977..d1d57149aa93 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2011,6 +2011,7 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, int); + void (*sync_lazytime)(struct inode *inode); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode); -- 2.47.3[PATCH 07/11] fs: add a ->sync_lazytime methodChristoph Hellwig undefinedChristian Brauner undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefinedƒQ„Ø