[LTP] [PATCH v6 5/6] syscalls/statx10: Add basic test for STATX_DIOALIGN on regular file

Yang Xu (Fujitsu) xuyang2018.jy@fujitsu.com
Fri May 19 08:45:06 CEST 2023



on 2023/05/19 14:24, Yang, Xiao/杨 晓 wrote:
> On 2023/5/15 15:11, Yang Xu wrote:
>> STATX_DIOALIGN is used to get stx_dio_mem_align and stx_dio_offset_align
>> for files on fs that support direct io. We just check whether these
>> value are nonzero on ext4 and xfs.
>>
>> On ext4, files that use certain filesystem features (data journalling,
>> encryption, and verity) fall back to buffered I/O. But ltp creates own
>> filesystem by enabling mount_device in tst_test struct. If we set block
>> device to LTP_DEV environment, we use this block device to mount by using
>> default mount option. Otherwise, use loop device to simuate it. So it can
>> avoid these above situations and don't fall back to buffered I/O.
>>
>> For struct statx member check, we only check stx_dio_mem_align because
>> these two member is introduced together in separate commit in kernel, so it
>> is safe.
>>
>> Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
>> ---
>>    configure.ac                               |  2 +-
>>    runtest/syscalls                           |  1 +
>>    testcases/kernel/syscalls/statx/.gitignore |  1 +
>>    testcases/kernel/syscalls/statx/statx10.c  | 93 ++++++++++++++++++++++
>>    4 files changed, 96 insertions(+), 1 deletion(-)
>>    create mode 100644 testcases/kernel/syscalls/statx/statx10.c
>>
>> diff --git a/configure.ac b/configure.ac
>> index 4c8763376..548288310 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -158,7 +158,7 @@ AC_CHECK_FUNCS(mkdtemp,[],AC_MSG_ERROR(mkdtemp() not found!))
>>    AC_CHECK_MEMBERS([struct fanotify_event_info_fid.fsid.__val],,,[#include <sys/fanotify.h>])
>>    AC_CHECK_MEMBERS([struct perf_event_mmap_page.aux_head],,,[#include <linux/perf_event.h>])
>>    AC_CHECK_MEMBERS([struct sigaction.sa_sigaction],[],[],[#include <signal.h>])
>> -AC_CHECK_MEMBERS([struct statx.stx_mnt_id],,,[
>> +AC_CHECK_MEMBERS([struct statx.stx_mnt_id, struct statx.stx_dio_mem_align],,,[
>>    #define _GNU_SOURCE
>>    #include <sys/stat.h>
>>    ])
>> diff --git a/runtest/syscalls b/runtest/syscalls
>> index 9c23a4248..e2548dae5 100644
>> --- a/runtest/syscalls
>> +++ b/runtest/syscalls
>> @@ -1765,6 +1765,7 @@ statx06 statx06
>>    statx07 statx07
>>    statx08 statx08
>>    statx09 statx09
>> +statx10 statx10
>>    
>>    membarrier01 membarrier01
>>    
>> diff --git a/testcases/kernel/syscalls/statx/.gitignore b/testcases/kernel/syscalls/statx/.gitignore
>> index 1cea43c0d..67341ff2d 100644
>> --- a/testcases/kernel/syscalls/statx/.gitignore
>> +++ b/testcases/kernel/syscalls/statx/.gitignore
>> @@ -7,3 +7,4 @@
>>    /statx07
>>    /statx08
>>    /statx09
>> +/statx10
>> diff --git a/testcases/kernel/syscalls/statx/statx10.c b/testcases/kernel/syscalls/statx/statx10.c
>> new file mode 100644
>> index 000000000..513a8c262
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/statx/statx10.c
>> @@ -0,0 +1,93 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +/*
>> + * Copyright (c) 2023 FUJITSU LIMITED. All rights reserved.
>> + * Author: Yang Xu <xuyang2018.jy@fujitsu.com>
>> + */
>> +
>> +/*\
>> + * [Description]
>> + *
>> + * It is a basic test for STATX_DIOALIGN mask on ext4 and xfs filesystem.
>> + *
>> + * - STATX_DIOALIGN   Want stx_dio_mem_align and stx_dio_offset_align value
>> + *
>> + * Check these two values are nonzero under dio situation when STATX_DIOALIGN
>> + * in the request mask.
>> + *
>> + * On ext4, files that use certain filesystem features (data journaling,
>> + * encryption, and verity) fall back to buffered I/O. But ltp creates own
>> + * filesystem by enabling mount_device in tst_test struct. If we set block
>> + * device to LTP_DEV environment, we use this block device to mount by using
>> + * default mount option. Otherwise, use loop device to simuate it. So it can
>> + * avoid these above situations and don't fall back to buffered I/O.
>> + *
>> + * Minimum Linux version required is v6.1.
>> + */
>> +
>> +#define _GNU_SOURCE
>> +#include <sys/types.h>
>> +#include <unistd.h>
>> +#include <stdlib.h>
>> +#include <stdbool.h>
>> +#include "tst_test.h"
>> +#include "lapi/stat.h"
>> +#include "lapi/fcntl.h"
>> +
>> +#define MNTPOINT "mnt_point"
>> +#define TESTFILE "testfile"
> Hi Xu,
> 
> I think you should use #define TESTFILE MNTPOINT"/testfile" instead.

Yes, good catch.
> 
>> +
>> +static void verify_statx(void)
>> +{
>> +	struct statx buf;
>> +
>> +	TST_EXP_PASS_SILENT(statx(AT_FDCWD, TESTFILE, 0, STATX_DIOALIGN, &buf),
>> +		"statx(AT_FDCWD, %s, 0, STATX_DIOALIGN, &buf)", TESTFILE);
>> +
>> +	if (!(buf.stx_mask & STATX_DIOALIGN)) {
>> +		tst_res(TCONF, "Filesystem does not support STATX_DIOALIGN");
>> +		return;
>> +	}
>> +
>> +#ifdef HAVE_STRUCT_STATX_STX_DIO_MEM_ALIGN
>> +	if (buf.stx_dio_mem_align != 0)
>> +		tst_res(TPASS, "stx_dio_mem_align:%u", buf.stx_dio_mem_align);
>> +	else
>> +		tst_res(TFAIL, "stx_dio_mem_align was 0, but DIO should be supported");
>> +
>> +	if (buf.stx_dio_offset_align != 0)
>> +		tst_res(TPASS, "stx_dio_offset_align:%u", buf.stx_dio_offset_align);
>> +	else
>> +		tst_res(TFAIL, "stx_dio_offset_align was 0, but DIO should be supported");
>> +#else
>> +	tst_res(TCONF, "glibc statx struct miss stx_dio_mem_align field");
>> +#endif
>> +}
>> +
>> +static void setup(void)
>> +{
>> +	int fd = -1;
>> +
>> +	if (strcmp(tst_device->fs_type, "xfs") && strcmp(tst_device->fs_type, "ext4"))
>> +		tst_brk(TCONF, "This test only supports ext4 and xfs");
>> +
>> +	SAFE_FILE_PRINTF(TESTFILE, "AAAA");
>> +	fd = open(TESTFILE, O_RDWR | O_DIRECT);
>> +	if (fd == -1) {
>> +		if (errno == EINVAL)
>> +			tst_brk(TCONF,
>> +				"The regular file is not on a filesystem that support DIO");
>> +		else
>> +			tst_brk(TBROK | TERRNO,
>> +				"The regular file is open with O_RDWR | O_DIRECT failed");
>> +	}
>> +	SAFE_CLOSE(fd);
>> +}
>> +
>> +static struct tst_test test = {
>> +	.test_all = verify_statx,
>> +	.setup = setup,
>> +	.needs_root = 1,
>> +	.mntpoint = MNTPOINT,
>> +	.mount_device = 1,
>> +	.all_filesystems = 1,
>> +};
> Is it necessary to use all_filesystems? because this test can be run on
> only ext4 and xfs filesystem. It's OK for me if we don't have any better
> way.

AFAIK, we only have a blacklist for skip_filesystem and maybe I can 
introduce a whitelist for this situation.

Best Regards
Yang Xu
> 
> Other than that looks good to me.
> Reviewed-by: Xiao Yang <yangx.jy@fujitsu.com>
> 
> Best Regards,
> Xiao Yang


More information about the ltp mailing list