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

Richard Palethorpe rpalethorpe@suse.de
Wed Sep 30 13:33:11 CEST 2020


Hi,

Cyril Hrubis <chrubis@suse.cz> writes:

> 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.

Oh, I didn't think ext2 supported these timestamps, but the test works
so OK!

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


-- 
Thank you,
Richard.


More information about the ltp mailing list