|
@@ -1635,17 +1635,21 @@ 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 generic_update_time(struct inode *inode, struct timespec *time, int flags)
|
|
{
|
|
{
|
|
int iflags = I_DIRTY_TIME;
|
|
int iflags = I_DIRTY_TIME;
|
|
|
|
+ bool dirty = false;
|
|
|
|
|
|
if (flags & S_ATIME)
|
|
if (flags & S_ATIME)
|
|
inode->i_atime = *time;
|
|
inode->i_atime = *time;
|
|
if (flags & S_VERSION)
|
|
if (flags & S_VERSION)
|
|
- inode_inc_iversion(inode);
|
|
|
|
|
|
+ dirty = inode_maybe_inc_iversion(inode, false);
|
|
if (flags & S_CTIME)
|
|
if (flags & S_CTIME)
|
|
inode->i_ctime = *time;
|
|
inode->i_ctime = *time;
|
|
if (flags & S_MTIME)
|
|
if (flags & S_MTIME)
|
|
inode->i_mtime = *time;
|
|
inode->i_mtime = *time;
|
|
|
|
+ if ((flags & (S_ATIME | S_CTIME | S_MTIME)) &&
|
|
|
|
+ !(inode->i_sb->s_flags & SB_LAZYTIME))
|
|
|
|
+ dirty = true;
|
|
|
|
|
|
- if (!(inode->i_sb->s_flags & SB_LAZYTIME) || (flags & S_VERSION))
|
|
|
|
|
|
+ if (dirty)
|
|
iflags |= I_DIRTY_SYNC;
|
|
iflags |= I_DIRTY_SYNC;
|
|
__mark_inode_dirty(inode, iflags);
|
|
__mark_inode_dirty(inode, iflags);
|
|
return 0;
|
|
return 0;
|
|
@@ -1864,7 +1868,7 @@ int file_update_time(struct file *file)
|
|
if (!timespec_equal(&inode->i_ctime, &now))
|
|
if (!timespec_equal(&inode->i_ctime, &now))
|
|
sync_it |= S_CTIME;
|
|
sync_it |= S_CTIME;
|
|
|
|
|
|
- if (IS_I_VERSION(inode))
|
|
|
|
|
|
+ if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode))
|
|
sync_it |= S_VERSION;
|
|
sync_it |= S_VERSION;
|
|
|
|
|
|
if (!sync_it)
|
|
if (!sync_it)
|