@@ -1634,17 +1634,24 @@ static int relatime_need_update(const struct path *path, struct inode *inode,
int generic_update_time(struct inode *inode, struct timespec *time, int flags)
{
int iflags = I_DIRTY_TIME;
+ bool dirty = false;
- if (flags & S_ATIME)
+ if (flags & S_ATIME) {
inode->i_atime = *time;
+ dirty |= !(inode->i_sb->s_flags & SB_LAZYTIME);
+ }
if (flags & S_VERSION)
- inode_inc_iversion(inode);
- if (flags & S_CTIME)
+ dirty |= inode_maybe_inc_iversion(inode, dirty);
+ if (flags & S_CTIME) {
inode->i_ctime = *time;
- if (flags & S_MTIME)
+ dirty = true;
+ }
+ if (flags & S_MTIME) {
inode->i_mtime = *time;
+ dirty = true;
+ }
- if (!(inode->i_sb->s_flags & SB_LAZYTIME) || (flags & S_VERSION))
+ if (dirty)
iflags |= I_DIRTY_SYNC;
__mark_inode_dirty(inode, iflags);
return 0;
@@ -1863,7 +1870,7 @@ int file_update_time(struct file *file)
if (!timespec_equal(&inode->i_ctime, &now))
sync_it |= S_CTIME;
- if (IS_I_VERSION(inode))
+ if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode))
sync_it |= S_VERSION;
if (!sync_it)