[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