2023-09-19 11:20:51

by Jan Kara

[permalink] [raw]
Subject: Re: [PATCH v7 12/13] ext4: switch to multigrain timestamps

On Tue 19-09-23 15:05:24, Xi Ruoyao wrote:
> On Mon, 2023-08-07 at 15:38 -0400, Jeff Layton wrote:
> > Enable multigrain timestamps, which should ensure that there is an
> > apparent change to the timestamp whenever it has been written after
> > being actively observed via getattr.
> >
> > For ext4, we only need to enable the FS_MGTIME flag.
>
> Hi Jeff,
>
> This patch causes a gnulib test failure:
>
> $ ~/sources/lfs/grep-3.11/gnulib-tests/test-stat-time
> test-stat-time.c:141: assertion 'statinfo[0].st_mtime < statinfo[2].st_mtime || (statinfo[0].st_mtime == statinfo[2].st_mtime && (get_stat_mtime_ns (&statinfo[0]) < get_stat_mtime_ns (&statinfo[2])))' failed
> Aborted (core dumped)
>
> The source code of the test:
> https://git.savannah.gnu.org/cgit/gnulib.git/tree/tests/test-stat-time.c
>
> Is this an expected change?

Kind of yes. The test first tries to estimate filesystem timestamp
granularity in nap() function - due to this patch, the detected granularity
will likely be 1 ns so effectively all the test calls will happen
immediately one after another. But we don't bother setting the timestamps
with more than 1 jiffy (usually 4 ms) precision unless we think someone is
watching. So as a result timestamps of all stamp1 and stamp2 files are
going to be equal which makes the test fail.

The ultimate problem is that a sequence like:

write(f1)
stat(f2)
write(f2)
stat(f2)
write(f1)
stat(f1)

can result in f1 timestamp to be (slightly) lower than the final f2
timestamp because the second write to f1 didn't bother updating the
timestamp. That can indeed be a bit confusing to programs if they compare
timestamps between two files. Jeff?

Honza


> > Acked-by: Theodore Ts'o <[email protected]>
> > Reviewed-by: Jan Kara <[email protected]>
> > Signed-off-by: Jeff Layton <[email protected]>
> > ---
> > ?fs/ext4/super.c | 2 +-
> > ?1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> > index b54c70e1a74e..cb1ff47af156 100644
> > --- a/fs/ext4/super.c
> > +++ b/fs/ext4/super.c
> > @@ -7279,7 +7279,7 @@ static struct file_system_type ext4_fs_type = {
> > ? .init_fs_context = ext4_init_fs_context,
> > ? .parameters = ext4_param_specs,
> > ? .kill_sb = kill_block_super,
> > - .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP,
> > + .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP |
> > FS_MGTIME,
> > ?};
> > ?MODULE_ALIAS_FS("ext4");
> > ?
> >
>
--
Jan Kara <[email protected]>
SUSE Labs, CR