[LTP] [PATCH v4] ioctl_loop06: update loopback block size validation
Avinesh Kumar
akumar@suse.de
Fri Apr 11 10:38:18 CEST 2025
On Friday, March 14, 2025 12:58:48 PM CEST Li Wang wrote:
> The kernel commit 47dd6753 ("block/bdev: lift block size restrictions to 64k")
> now supports block sizes larger than PAGE_SIZE, with a new upper limit of
> BLK_MAX_BLOCK_SIZE (64K). But ioctl_loop06 still assumes that PAGE_SIZE is the
> maximum allowed block size, causing failures on newer kernels(>= 6.14):
>
> ioctl_loop06.c:74: TINFO: Using LOOP_SET_BLOCK_SIZE with arg > PAGE_SIZE
> ioctl_loop06.c:57: TFAIL: Set block size succeed unexpectedly
> ...
> ioctl_loop06.c:74: TINFO: Using LOOP_CONFIGURE with block_size > PAGE_SIZE
> ioctl_loop06.c:57: TFAIL: Set block size succeed unexpectedly
>
> This patch updates ioctl_loop06 to use BLK_MAX_BLOCK_SIZE instead of PAGE_SIZE
> for block size validation.
>
> And, dynamically sets bs based on BLK_MAX_BLOCK_SIZE, using 1024 bytes if it's
> below 1MB or scaling it otherwise. Ensures tst_fill_file() writes efficiently
> while maintaining compatibility across different kernel versions.
>
> Signed-off-by: Li Wang <liwang@redhat.com>
> Cc: Luis Chamberlain <mcgrof@kernel.org>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: Hannes Reinecke <hare@suse.de>
Tested-by: Avinesh Kumar <akumar@suse.de>
tst_tmpdir.c:316: TINFO: Using /tmp/LTP_iocxHZLn0 as tmpdir (tmpfs filesystem)
tst_test.c:1905: TINFO: LTP version: 20250130
tst_test.c:1909: TINFO: Tested kernel: 6.15.0-rc1-1.ge4c97fd-default #1 SMP PREEMPT_DYNAMIC Mon Apr 7 21:58:09 UTC 2025 (e4c97fd) x86_64
tst_kconfig.c:88: TINFO: Parsing kernel config '/proc/config.gz'
tst_kconfig.c:676: TINFO: CONFIG_FAULT_INJECTION kernel option detected which might slow the execution
tst_test.c:1722: TINFO: Overall timeout per run is 0h 02m 00s
tst_device.c:98: TINFO: Found free device 1 '/dev/loop1'
ioctl_loop06_new.c:76: TINFO: Using LOOP_SET_BLOCK_SIZE with arg < 512
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
ioctl_loop06_new.c:76: TINFO: Using LOOP_SET_BLOCK_SIZE with arg > BLK_MAX_BLOCK_SIZE
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
ioctl_loop06_new.c:76: TINFO: Using LOOP_SET_BLOCK_SIZE with arg != power_of_2
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
ioctl_loop06_new.c:76: TINFO: Using LOOP_CONFIGURE with block_size < 512
tst_device.c:255: TINFO: ioctl return: 0: ECHILD (10)
tst_device.c:255: TINFO: ioctl return: 0: ECHILD (10)
tst_device.c:255: TINFO: ioctl return: -1: ENXIO (6)
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
ioctl_loop06_new.c:76: TINFO: Using LOOP_CONFIGURE with block_size > BLK_MAX_BLOCK_SIZE
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
ioctl_loop06_new.c:76: TINFO: Using LOOP_CONFIGURE with block_size != power_of_2
ioctl_loop06_new.c:67: TPASS: Set block size failed as expected: EINVAL (22)
Summary:
passed 6
failed 0
broken 0
skipped 0
warnings 0
> ---
> configure.ac | 1 +
> include/lapi/blkdev.h | 19 +++++++++++++++++++
> .../kernel/syscalls/ioctl/ioctl_loop06.c | 12 ++++++++----
> 3 files changed, 28 insertions(+), 4 deletions(-)
> create mode 100644 include/lapi/blkdev.h
>
> diff --git a/configure.ac b/configure.ac
> index 0f2b6f332..5538d88d5 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -52,6 +52,7 @@ AC_CHECK_HEADERS_ONCE([ \
> emmintrin.h \
> ifaddrs.h \
> keyutils.h \
> + linux/blkdev.h \
> linux/can.h \
> linux/cgroupstats.h \
> linux/cryptouser.h \
> diff --git a/include/lapi/blkdev.h b/include/lapi/blkdev.h
> new file mode 100644
> index 000000000..3ee058ce0
> --- /dev/null
> +++ b/include/lapi/blkdev.h
> @@ -0,0 +1,19 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2025 Linux Test Project
> + * Li Wang <liwang@redhat.com>
> + */
> +
> +#ifndef LAPI_BLKDEV_H__
> +#define LAPI_BLKDEV_H__
> +
> +#ifdef HAVE_LINUX_BLKDEV_H
> +#include <linux/blkdev.h>
> +#endif
> +
> +/* Define BLK_MAX_BLOCK_SIZE for older kernels */
> +#ifndef BLK_MAX_BLOCK_SIZE
> +#define BLK_MAX_BLOCK_SIZE 0x00010000 /* 64K */
> +#endif
> +
> +#endif /* LAPI_BLKDEV_H */
> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_loop06.c b/testcases/kernel/syscalls/ioctl/ioctl_loop06.c
> index 573871bc1..35e9e79e9 100644
> --- a/testcases/kernel/syscalls/ioctl/ioctl_loop06.c
> +++ b/testcases/kernel/syscalls/ioctl/ioctl_loop06.c
> @@ -14,7 +14,9 @@
> #include <unistd.h>
> #include <sys/types.h>
> #include <stdlib.h>
> +#include "lapi/blkdev.h"
> #include "lapi/loop.h"
> +#include "tst_fs.h"
> #include "tst_test.h"
>
> static char dev_path[1024];
> @@ -31,7 +33,7 @@ static struct tcase {
> "Using LOOP_SET_BLOCK_SIZE with arg < 512"},
>
> {&invalid_value, LOOP_SET_BLOCK_SIZE,
> - "Using LOOP_SET_BLOCK_SIZE with arg > PAGE_SIZE"},
> + "Using LOOP_SET_BLOCK_SIZE with arg > BLK_MAX_BLOCK_SIZE"},
>
> {&unalign_value, LOOP_SET_BLOCK_SIZE,
> "Using LOOP_SET_BLOCK_SIZE with arg != power_of_2"},
> @@ -40,7 +42,7 @@ static struct tcase {
> "Using LOOP_CONFIGURE with block_size < 512"},
>
> {&invalid_value, LOOP_CONFIGURE,
> - "Using LOOP_CONFIGURE with block_size > PAGE_SIZE"},
> + "Using LOOP_CONFIGURE with block_size > BLK_MAX_BLOCK_SIZE"},
>
> {&unalign_value, LOOP_CONFIGURE,
> "Using LOOP_CONFIGURE with block_size != power_of_2"},
> @@ -103,10 +105,12 @@ static void setup(void)
> if (dev_num < 0)
> tst_brk(TBROK, "Failed to find free loop device");
>
> - tst_fill_file("test.img", 0, 1024, 1024);
> + size_t bs = (BLK_MAX_BLOCK_SIZE < TST_MB) ? 1024 : 4 * BLK_MAX_BLOCK_SIZE / 1024;
> + tst_fill_file("test.img", 0, bs, 1024);
> +
> half_value = 256;
> pg_size = getpagesize();
> - invalid_value = pg_size * 2 ;
> + invalid_value = BLK_MAX_BLOCK_SIZE * 2;
> unalign_value = pg_size - 1;
>
> dev_fd = SAFE_OPEN(dev_path, O_RDWR);
>
More information about the ltp
mailing list