]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: ublk: add selftest for UBLK_F_NO_AUTO_PART_SCAN
authorMing Lei <ming.lei@redhat.com>
Thu, 29 Jan 2026 16:19:53 +0000 (00:19 +0800)
committerJens Axboe <axboe@kernel.dk>
Sat, 31 Jan 2026 13:36:41 +0000 (06:36 -0700)
Add test_part_01.sh to test the UBLK_F_NO_AUTO_PART_SCAN feature
flag which allows suppressing automatic partition scanning during
device startup while still allowing manual partition probing.

The test verifies:
- Normal behavior: partitions are auto-detected without the flag
- With flag: partitions are not auto-detected during START_DEV
- Manual scan: blockdev --rereadpt works with the flag

Also update kublk tool to support --no_auto_part_scan option and
recognize the feature flag.

Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
tools/testing/selftests/ublk/Makefile
tools/testing/selftests/ublk/kublk.c
tools/testing/selftests/ublk/kublk.h
tools/testing/selftests/ublk/test_part_01.sh [new file with mode: 0755]

index e39a6f871fccca7f88777dc4d63b89dc34d968e6..bc5bd7d1381d13e372053f993afdace5d34329ce 100644 (file)
@@ -48,6 +48,8 @@ TEST_PROGS += test_stripe_04.sh
 TEST_PROGS += test_stripe_05.sh
 TEST_PROGS += test_stripe_06.sh
 
+TEST_PROGS += test_part_01.sh
+
 TEST_PROGS += test_stress_01.sh
 TEST_PROGS += test_stress_02.sh
 TEST_PROGS += test_stress_03.sh
index 2da37557e1a910b8722117fc1c2162a611beb411..e8279c4acc40d7eb4865390011bfab38942937e7 100644 (file)
@@ -1615,6 +1615,7 @@ static int cmd_dev_get_features(void)
                FEAT_NAME(UBLK_F_INTEGRITY),
                FEAT_NAME(UBLK_F_SAFE_STOP_DEV),
                FEAT_NAME(UBLK_F_BATCH_IO),
+               FEAT_NAME(UBLK_F_NO_AUTO_PART_SCAN),
        };
        struct ublk_dev *dev;
        __u64 features = 0;
@@ -1712,7 +1713,7 @@ static void __cmd_create_help(char *exe, bool recovery)
        printf("\t[--nthreads threads] [--per_io_tasks]\n");
        printf("\t[--integrity_capable] [--integrity_reftag] [--metadata_size SIZE] "
                 "[--pi_offset OFFSET] [--csum_type ip|t10dif|nvme] [--tag_size SIZE]\n");
-       printf("\t[--batch|-b]\n");
+       printf("\t[--batch|-b] [--no_auto_part_scan]\n");
        printf("\t[target options] [backfile1] [backfile2] ...\n");
        printf("\tdefault: nr_queues=2(max 32), depth=128(max 1024), dev_id=-1(auto allocation)\n");
        printf("\tdefault: nthreads=nr_queues");
@@ -1786,6 +1787,7 @@ int main(int argc, char *argv[])
                { "tag_size",           1,      NULL,  0 },
                { "safe",               0,      NULL,  0 },
                { "batch",              0,      NULL, 'b'},
+               { "no_auto_part_scan",  0,      NULL,  0 },
                { 0, 0, 0, 0 }
        };
        const struct ublk_tgt_ops *ops = NULL;
@@ -1898,6 +1900,8 @@ int main(int argc, char *argv[])
                                ctx.tag_size = strtoul(optarg, NULL, 0);
                        if (!strcmp(longopts[option_idx].name, "safe"))
                                ctx.safe_stop = 1;
+                       if (!strcmp(longopts[option_idx].name, "no_auto_part_scan"))
+                               ctx.flags |= UBLK_F_NO_AUTO_PART_SCAN;
                        break;
                case '?':
                        /*
index ca97deb5e208250f1c0844a84539550627b4215c..1faeccaaecae4bffa89ed0936d994cd9fe4527d0 100644 (file)
@@ -78,12 +78,13 @@ struct dev_ctx {
        unsigned int    auto_zc_fallback:1;
        unsigned int    per_io_tasks:1;
        unsigned int    no_ublk_fixed_fd:1;
+       unsigned int    safe_stop:1;
+       unsigned int    no_auto_part_scan:1;
        __u32 integrity_flags;
        __u8 metadata_size;
        __u8 pi_offset;
        __u8 csum_type;
        __u8 tag_size;
-       unsigned int    safe_stop:1;
 
        int _evtfd;
        int _shmid;
diff --git a/tools/testing/selftests/ublk/test_part_01.sh b/tools/testing/selftests/ublk/test_part_01.sh
new file mode 100755 (executable)
index 0000000..8028f6e
--- /dev/null
@@ -0,0 +1,104 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
+
+ERR_CODE=0
+
+format_backing_file()
+{
+       local backing_file=$1
+
+       # Create ublk device to write partition table
+       local tmp_dev=$(_add_ublk_dev -t loop "${backing_file}")
+       [ $? -ne 0 ] && return 1
+
+       # Write partition table with sfdisk
+       sfdisk /dev/ublkb"${tmp_dev}" > /dev/null 2>&1 <<EOF
+label: dos
+start=2048, size=100MiB, type=83
+start=206848, size=100MiB, type=83
+EOF
+       local ret=$?
+
+       "${UBLK_PROG}" del -n "${tmp_dev}"
+
+       return $ret
+}
+
+test_auto_part_scan()
+{
+       local backing_file=$1
+
+       # Create device WITHOUT --no_auto_part_scan
+       local dev_id=$(_add_ublk_dev -t loop "${backing_file}")
+       [ $? -ne 0 ] && return 1
+
+       udevadm settle
+
+       # Partitions should be auto-detected
+       if [ ! -e /dev/ublkb"${dev_id}"p1 ] || [ ! -e /dev/ublkb"${dev_id}"p2 ]; then
+               "${UBLK_PROG}" del -n "${dev_id}"
+               return 1
+       fi
+
+       "${UBLK_PROG}" del -n "${dev_id}"
+       return 0
+}
+
+test_no_auto_part_scan()
+{
+       local backing_file=$1
+
+       # Create device WITH --no_auto_part_scan
+       local dev_id=$(_add_ublk_dev -t loop --no_auto_part_scan "${backing_file}")
+       [ $? -ne 0 ] && return 1
+
+       udevadm settle
+
+       # Partitions should NOT be auto-detected
+       if [ -e /dev/ublkb"${dev_id}"p1 ]; then
+               "${UBLK_PROG}" del -n "${dev_id}"
+               return 1
+       fi
+
+       # Manual scan should work
+       blockdev --rereadpt /dev/ublkb"${dev_id}" > /dev/null 2>&1
+       udevadm settle
+
+       if [ ! -e /dev/ublkb"${dev_id}"p1 ] || [ ! -e /dev/ublkb"${dev_id}"p2 ]; then
+               "${UBLK_PROG}" del -n "${dev_id}"
+               return 1
+       fi
+
+       "${UBLK_PROG}" del -n "${dev_id}"
+       return 0
+}
+
+if ! _have_program sfdisk || ! _have_program blockdev; then
+       exit "$UBLK_SKIP_CODE"
+fi
+
+_prep_test "generic" "test UBLK_F_NO_AUTO_PART_SCAN"
+
+if ! _have_feature "UBLK_F_NO_AUTO_PART_SCAN"; then
+       _cleanup_test "generic"
+       exit "$UBLK_SKIP_CODE"
+fi
+
+
+# Create and format backing file with partition table
+_create_backfile 0 256M
+format_backing_file "${UBLK_BACKFILES[0]}"
+[ $? -ne 0 ] && ERR_CODE=255
+
+# Test normal auto partition scan
+[ "$ERR_CODE" -eq 0 ] && test_auto_part_scan "${UBLK_BACKFILES[0]}"
+[ $? -ne 0 ] && ERR_CODE=255
+
+# Test no auto partition scan with manual scan
+[ "$ERR_CODE" -eq 0 ] && test_no_auto_part_scan "${UBLK_BACKFILES[0]}"
+[ $? -ne 0 ] && ERR_CODE=255
+
+_cleanup_test "generic"
+_show_result $TID $ERR_CODE