Message ID | 20210105005452.92521-5-ebiggers@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | lazytime fixes and cleanups | expand |
On Mon 04-01-21 16:54:43, Eric Biggers wrote: > From: Eric Biggers <ebiggers@google.com> > > As was done for generic_update_time(), only pass I_DIRTY_TIME to > __mark_inode_dirty() when the inode's timestamps were actually updated > and lazytime is enabled. This avoids a weird edge case where > I_DIRTY_TIME could be set in i_state when lazytime isn't enabled. > > Signed-off-by: Eric Biggers <ebiggers@google.com> ... > + if ((flags & S_VERSION) && inode_maybe_inc_iversion(inode, false)) > + dirty_flags |= I_DIRTY_SYNC; > > - if (dirty) > - iflags |= I_DIRTY_SYNC; > __mark_inode_dirty(inode, iflags); ^^^ dirty_flags here? Otherwise the change looks good to me. Honza
On Thu, Jan 07, 2021 at 02:13:28PM +0100, Jan Kara wrote: > On Mon 04-01-21 16:54:43, Eric Biggers wrote: > > From: Eric Biggers <ebiggers@google.com> > > > > As was done for generic_update_time(), only pass I_DIRTY_TIME to > > __mark_inode_dirty() when the inode's timestamps were actually updated > > and lazytime is enabled. This avoids a weird edge case where > > I_DIRTY_TIME could be set in i_state when lazytime isn't enabled. > > > > Signed-off-by: Eric Biggers <ebiggers@google.com> > > ... > > + if ((flags & S_VERSION) && inode_maybe_inc_iversion(inode, false)) > > + dirty_flags |= I_DIRTY_SYNC; > > > > - if (dirty) > > - iflags |= I_DIRTY_SYNC; > > __mark_inode_dirty(inode, iflags); > ^^^ dirty_flags here? > > Otherwise the change looks good to me. Yeah, I'll fix that. I accidentally didn't have CONFIG_FAT_FS enabled. - Eric
diff --git a/fs/fat/misc.c b/fs/fat/misc.c index f1b2a1fc2a6a4..33e1e0c9fd634 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -329,21 +329,22 @@ EXPORT_SYMBOL_GPL(fat_truncate_time); int fat_update_time(struct inode *inode, struct timespec64 *now, int flags) { - int iflags = I_DIRTY_TIME; - bool dirty = false; + int dirty_flags = 0; if (inode->i_ino == MSDOS_ROOT_INO) return 0; - fat_truncate_time(inode, now, flags); - if (flags & S_VERSION) - dirty = inode_maybe_inc_iversion(inode, false); - if ((flags & (S_ATIME | S_CTIME | S_MTIME)) && - !(inode->i_sb->s_flags & SB_LAZYTIME)) - dirty = true; + if (flags & (S_ATIME | S_CTIME | S_MTIME)) { + fat_truncate_time(inode, now, flags); + if (inode->i_sb->s_flags & SB_LAZYTIME) + dirty_flags |= I_DIRTY_TIME; + else + dirty_flags |= I_DIRTY_SYNC; + } + + if ((flags & S_VERSION) && inode_maybe_inc_iversion(inode, false)) + dirty_flags |= I_DIRTY_SYNC; - if (dirty) - iflags |= I_DIRTY_SYNC; __mark_inode_dirty(inode, iflags); return 0; }