Re: [PATCH 08/10] fs: add support for non-blocking timestamp updates

From: Christoph Hellwig

Date: Thu Dec 18 2025 - 01:19:15 EST


On Wed, Dec 17, 2025 at 01:42:20PM +0100, Jan Kara wrote:
> > @@ -2110,12 +2110,26 @@ int inode_update_timestamps(struct inode *inode, int *flags)
> > now = inode_set_ctime_current(inode);
> > if (!timespec64_equal(&now, &ctime))
> > updated |= S_CTIME;
> > - if (!timespec64_equal(&now, &mtime)) {
> > - inode_set_mtime_to_ts(inode, now);
> > + if (!timespec64_equal(&now, &mtime))
> > updated |= S_MTIME;
> > +
> > + if (IS_I_VERSION(inode)) {
> > + if (*flags & S_NOWAIT) {
> > + /*
> > + * Error out if we'd need timestamp updates, as
> > + * the generally requires blocking to dirty the
> > + * inode in one form or another.
> > + */
> > + if (updated && inode_iversion_need_inc(inode))
> > + goto bail;
>
> I'm confused here. What the code does is that if S_NOWAIT is set and
> i_version needs increment we bail. However the comment as well as the
> changelog speaks about timestamps needing update and not about i_version.
> And intuitively I agree that if any timestamp is updated, inode needs
> dirtying and thus we should bail regardless of whether i_version is updated
> as well or not. What am I missing?

With lazytime timestamp updates that don't require i_version updates
are performed in-memory only, and we'll only reach this with S_NOWAIT
set for those (later in the series, it can't be reached at all as
of this patch).

But yes, this needs to be documented much better.