[LTP] [PATCH v2] utimensat01: Use common FS (ext4) with timestamps and attributes

Cyril Hrubis chrubis@suse.cz
Wed Sep 30 13:19:30 CEST 2020


Hi!
> If tmpdir is mounted on tmpfs then the test will fail with ENOTTY as
> this FS apparently does not support file attributes (inode
> flags). Instead we can test on ext4 where setting attributes and high
> precision timestamps is known to work.
> 
> We can not set all_filesystems because utimensat will fail to reset
> the timestamp to zero on at least exFAT and NTFS (FUSE and kernel
> versions). It is not clear yet what the expected behavior is or how
> the test could fail gracefully and requires investigation.
> 
> Also if we now get ENOTTY then it is assumed the file system does not
> support attributes and the test fails with TCONF. However the
> underlying FS could return some other errno (e.g. EINVAL on FUSE
> NTFS), but it is not clear what to expect, if anything and also
> requires further investigation.
> 
> Signed-off-by: Richard Palethorpe <rpalethorpe@suse.com>
> ---
> 
> V2: Instead of trying to use all filesystems, just use one we know
>     works and is on most distros.
> 
> Obviously this is not ideal as this also expected to work on BTRFS,
> XFS etc. However the library doesn't allow us to specify this and
> modifying it would be quite intrusive. After the release this needs to
> be looked into.
> 
>  .../kernel/syscalls/utimensat/utimensat01.c   | 22 ++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/utimensat/utimensat01.c b/testcases/kernel/syscalls/utimensat/utimensat01.c
> index fe490f441..42299eda8 100644
> --- a/testcases/kernel/syscalls/utimensat/utimensat01.c
> +++ b/testcases/kernel/syscalls/utimensat/utimensat01.c
> @@ -21,8 +21,9 @@
>  #include "time64_variants.h"
>  #include "tst_timer.h"
>  
> -#define TEST_FILE	"test_file"
> -#define TEST_DIR	"test_dir"
> +#define MNTPOINT 	"mntpoint"
> +#define TEST_FILE	MNTPOINT"/test_file"
> +#define TEST_DIR	MNTPOINT"/test_dir"
>  
>  static void *bad_addr;
>  
> @@ -182,7 +183,12 @@ static void change_attr(struct test_case *tc, int fd, int set)
>  	if (!tc->attr)
>  		return;
>  
> -	SAFE_IOCTL(fd, FS_IOC_GETFLAGS, &attr);
> +	if (ioctl(fd, FS_IOC_GETFLAGS, &attr)) {
> +		if (errno == ENOTTY)
> +			tst_brk(TCONF | TERRNO, "Attributes not supported by FS");
> +		else
> +			tst_brk(TBROK | TERRNO, "ioctl(fd, FS_IOC_GETFLAGS, &attr) failed");
> +	}
>  
>  	if (set)
>  		attr |= tc->attr;
> @@ -198,7 +204,11 @@ static void reset_time(char *pathname, int dfd, int flags, int i)
>  	struct stat sb;
>  
>  	memset(&ts, 0, sizeof(ts));
> -	tv->utimensat(dfd, pathname, &ts, flags);
> +	TEST(tv->utimensat(dfd, pathname, &ts, flags));
> +	if (TST_RET) {
> +		tst_res(TINFO | TTERRNO, "%2d: utimensat(%d, %s, {0, 0}, %d) failed",
> +			i, dfd, pathname, flags);
> +	}
>  
>  	TEST(stat(pathname, &sb));
>  	if (TST_RET) {
> @@ -305,5 +315,7 @@ static struct tst_test test = {
>  	.test_variants = ARRAY_SIZE(variants),
>  	.setup = setup,
>  	.needs_root = 1,
> -	.needs_tmpdir = 1,
> +	.mount_device = 1,
> +	.mntpoint = MNTPOINT,
> +	.dev_fs_type = "ext4",

Do we have to specify ext4 here? Shouldn't that work with a default FS
for loop devices i.e. ext2?

I do worry that this would disable the test on small embedded devices
without ext4 driver, not sure if there are still some around.

But I think that defaulting to whatever have been choosen as a default
filesystem (may be passed in LTP_DEV_FS_TYPE env variable) would be
better band aid for now.

>  };
> -- 
> 2.28.0
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list