Ping for review? thanks -- PMM
On Fri, 10 Oct 2025 at 13:14, Peter Maydell <[email protected]> wrote: > > The linux-test test includes an attempt to check the utime and stat > syscalls by setting the atime and mtime of a file to specific values, > and then calling stat() to check that the values read back correctly. > > Unfortunately this is flaky, as it will fail if some other process > (for instance a virus scanner, backup program, etc) gets in and reads > the file between the utime() and stat() call, resulting in a host > syscall sequence like this: > > utimensat(AT_FDCWD, "file2", > [{tv_sec=1001, tv_nsec=0} /* 1970-01-01T01:16:41+0100 */, > {tv_sec=1000, tv_nsec=0} /* 1970-01-01T01:16:40+0100 */], 0) = 0 > # successfully set atime to 1001 and mtime to 1000 > statx(AT_FDCWD, "file2", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, > STATX_BASIC_STATS, > {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, > stx_blksize=4096, stx_attributes=0, stx_nlink=1, stx_uid=32808, > stx_gid=32808, stx_mode=S_IFREG|0600, stx_ino=21659016, > stx_size=100, stx_blocks=8, > stx_attributes_mask=STATX_ATTR_COMPRESSED|STATX_ATTR_IMMUTABLE| > STATX_ATTR_APPEND|STATX_ATTR_NODUMP|STATX_ATTR_ENCRYPTED| > STATX_ATTR_AUTOMOUNT|STATX_ATTR_MOUNT_ROOT|STATX_ATTR_VERITY| > STATX_ATTR_DAX, > stx_atime={tv_sec=1760091862, tv_nsec=63509009} /* > 2025-10-10T11:24:22.063509009+0100 */, > stx_ctime={tv_sec=1760091862, tv_nsec=63509009} /* > 2025-10-10T11:24:22.063509009+0100 */, > stx_mtime={tv_sec=1000, tv_nsec=0} /* 1970-01-01T01:16:40+0100 */, > stx_rdev_major=0, stx_rdev_minor=0, stx_dev_major=252, > stx_dev_minor=0, stx_mnt_id=0x1f}) = 0 > # but when we statx the file, we get back an mtime of 1000 > # but an atime corresponding to when the other process read it > > and which will cause the test program to fail with the error > message "stat time". > > In theory we could defend against this by e.g. operating on files in > a dummy loopback mount filesystem which we mounted as 'noatime', but > this isn't worth the hassle. Just drop the check on atime. > > Cc: [email protected] > Signed-off-by: Peter Maydell <[email protected]> > --- > The failure happens to me occasionally on my local system. > --- > tests/tcg/multiarch/linux/linux-test.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/tests/tcg/multiarch/linux/linux-test.c > b/tests/tcg/multiarch/linux/linux-test.c > index 64f57cb287e..bf6e0fda262 100644 > --- a/tests/tcg/multiarch/linux/linux-test.c > +++ b/tests/tcg/multiarch/linux/linux-test.c > @@ -155,9 +155,14 @@ static void test_file(void) > error("stat mode"); > if ((st.st_mode & 0777) != 0600) > error("stat mode2"); > - if (st.st_atime != 1001 || > - st.st_mtime != 1000) > + /* > + * Only check mtime, not atime: other processes such as > + * virus scanners might race with this test program and get > + * in and update the atime, causing random failures. > + */ > + if (st.st_mtime != 1000) { > error("stat time"); > + } > > chk_error(stat(tmpdir, &st)); > if (!S_ISDIR(st.st_mode)) > -- > 2.43.0
