[LTP] [PATCH v6 6/6] syscalls/statx11: Add basic test for STATX_DIOALIGN on block device

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


Hi Yang


I have modified this patch set as you suggested and merged.

Thanks for your review.

Best Regards
Yang Xu
> Hi Xu
> 
> LGTM.
> Reviewed-by: Xiao Yang <yangx.jy@fujitsu.com>
> 
> Best Regards,
> Xiao Yang
> 
> On 2023/5/15 15:11, Yang Xu wrote:
>> Since STATX_DIOLAIGN is only supported on regular file and block device,
>> so this case is used to test the latter.
>>
>> This test is tightly coupled to the kernel's current DIO restrictions on block
>> devices.  These changed in v6.0, and they are subject to further change in the
>> future.
>>
>> It is fine for now because STATX_DIOALIGN is only in v6.1 and later
>> anyway.
>>
>> Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
>> ---
>>    runtest/syscalls                           |  1 +
>>    testcases/kernel/syscalls/statx/.gitignore |  1 +
>>    testcases/kernel/syscalls/statx/statx11.c  | 89 ++++++++++++++++++++++
>>    3 files changed, 91 insertions(+)
>>    create mode 100644 testcases/kernel/syscalls/statx/statx11.c
>>
>> diff --git a/runtest/syscalls b/runtest/syscalls
>> index e2548dae5..e5ad2c2f9 100644
>> --- a/runtest/syscalls
>> +++ b/runtest/syscalls
>> @@ -1766,6 +1766,7 @@ statx07 statx07
>>    statx08 statx08
>>    statx09 statx09
>>    statx10 statx10
>> +statx11 statx11
>>    
>>    membarrier01 membarrier01
>>    
>> diff --git a/testcases/kernel/syscalls/statx/.gitignore b/testcases/kernel/syscalls/statx/.gitignore
>> index 67341ff2d..48ac4078b 100644
>> --- a/testcases/kernel/syscalls/statx/.gitignore
>> +++ b/testcases/kernel/syscalls/statx/.gitignore
>> @@ -8,3 +8,4 @@
>>    /statx08
>>    /statx09
>>    /statx10
>> +/statx11
>> diff --git a/testcases/kernel/syscalls/statx/statx11.c b/testcases/kernel/syscalls/statx/statx11.c
>> new file mode 100644
>> index 000000000..653050855
>> --- /dev/null
>> +++ b/testcases/kernel/syscalls/statx/statx11.c
>> @@ -0,0 +1,89 @@
>> +// 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 block device.
>> + *
>> + * - STATX_DIOALIGN   Want stx_dio_mem_align and stx_dio_offset_align value
>> + *
>> + * These two values are tightly coupled to the kernel's current DIO
>> + * restrictions on block devices.
>> + *
>> + * Minimum Linux version required is v6.1.
>> + */
>> +
>> +#define _GNU_SOURCE
>> +#include <sys/types.h>
>> +#include <sys/mount.h>
>> +#include <unistd.h>
>> +#include <stdlib.h>
>> +#include <stdbool.h>
>> +#include <stdio.h>
>> +#include "tst_test.h"
>> +#include "lapi/stat.h"
>> +
>> +static char sys_bdev_dma_path[1024], sys_bdev_logical_path[1024];
>> +
>> +static void verify_statx(void)
>> +{
>> +	struct statx buf;
>> +
>> +	TST_EXP_PASS_SILENT(statx(AT_FDCWD, tst_device->dev, 0, STATX_DIOALIGN, &buf),
>> +		"statx(AT_FDCWD, %s, 0, STATX_DIOALIGN, &buf)", tst_device->dev);
>> +
>> +	if (!(buf.stx_mask & STATX_DIOALIGN)) {
>> +		tst_res(TCONF, "Filesystem does not support STATX_DIOALIGN");
>> +		return;
>> +	}
>> +
>> +#ifdef HAVE_STRUCT_STATX_STX_DIO_MEM_ALIGN
>> +	/*
>> +	 * This test is tightly coupled to the kernel's current DIO restrictions
>> +	 * on block devices. The general rule of DIO needing to be aligned to the
>> +	 * block device's logical block size was relaxed to allow user buffers
>> +	 * (but not file offsets) aligned to the DMA alignment instead. See v6.0
>> +	 * commit bf8d08532bc1 ("iomap: add support for dma aligned direct-io") and
>> +	 * they are subject to further change in the future.
>> +	 * Also can see commit 2d985f8c6b9 ("vfs: support STATX_DIOALIGN on block devices).
>> +	 */
>> +	TST_ASSERT_ULONG(sys_bdev_dma_path, buf.stx_dio_mem_align - 1);
>> +	TST_ASSERT_ULONG(sys_bdev_logical_path, buf.stx_dio_offset_align);
>> +#else
>> +	tst_res(TCONF, "glibc statx struct miss stx_dio_mem_align field");
>> +#endif
>> +}
>> +
>> +static void setup(void)
>> +{
>> +	char full_name[256];
>> +	char *dev_name;
>> +
>> +	strcpy(full_name, tst_device->dev);
>> +	dev_name = SAFE_BASENAME(full_name);
>> +	sprintf(sys_bdev_logical_path, "/sys/block/%s/queue/logical_block_size", dev_name);
>> +
>> +	/*
>> +	 * Since /sys/block/%s/queue doesn't exist for partition, we need to
>> +	 * use a while to search block device instead of partition.
>> +	 */
>> +	while (access(sys_bdev_logical_path, F_OK) != 0) {
>> +		dev_name[strlen(dev_name)-1] = '\0';
>> +		sprintf(sys_bdev_logical_path, "/sys/block/%s/queue/logical_block_size", dev_name);
>> +	}
>> +
>> +	sprintf(sys_bdev_dma_path, "/sys/block/%s/queue/dma_alignment", dev_name);
>> +	if (access(sys_bdev_dma_path, F_OK) != 0)
>> +		tst_brk(TCONF, "dma_alignment sysfs file doesn't exist");
>> +}
>> +
>> +static struct tst_test test = {
>> +	.test_all = verify_statx,
>> +	.setup = setup,
>> +	.needs_device = 1,
>> +	.needs_root = 1,
>> +};


More information about the ltp mailing list