Re: [PATCH 8/8] selftests: ublk: add user copy test cases

Ming Lei
2025-12-11T09:17:55Z

On Wed, Dec 10, 2025 at 10:16:03PM -0700, Caleb Sander Mateos wrote:
> The ublk selftests cover every data copy mode except user copy. Add
> tests for user copy based on the existing test suite:
> - generic_14 ("basic recover function verification (user copy)") based
> on generic_04 and generic_05
> - null_03 ("basic IO test with user copy") based on null_01 and null_02
> - loop_06 ("write and verify over user copy") based on loop_01 and
> loop_03
> - loop_07 ("mkfs & mount & umount with user copy") based on loop_02 and
> loop_04
> - stripe_05 ("write and verify test on user copy") based on stripe_03
> - stripe_06 ("mkfs & mount & umount on user copy") based on stripe_02
> and stripe_04
> - Added test cases to stress_05 ("run IO and remove device with recovery
> enabled") for user copy
> - stress_06 ("run IO and remove device (user copy)") based on stress_01
> and stress_03
> - stress_07 ("run IO and kill ublk server (user copy)") based on
> stress_02 and stress_04
>
> Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> ---
> tools/testing/selftests/ublk/Makefile | 8 ++++
> .../testing/selftests/ublk/test_generic_14.sh | 40 +++++++++++++++++++
> tools/testing/selftests/ublk/test_loop_06.sh | 25 ++++++++++++
> tools/testing/selftests/ublk/test_loop_07.sh | 21 ++++++++++
> tools/testing/selftests/ublk/test_null_03.sh | 24 +++++++++++
> .../testing/selftests/ublk/test_stress_05.sh | 7 ++++
> .../testing/selftests/ublk/test_stress_06.sh | 39 ++++++++++++++++++
> .../testing/selftests/ublk/test_stress_07.sh | 39 ++++++++++++++++++
> .../testing/selftests/ublk/test_stripe_05.sh | 26 ++++++++++++
> .../testing/selftests/ublk/test_stripe_06.sh | 21 ++++++++++
> 10 files changed, 250 insertions(+)
> create mode 100755 tools/testing/selftests/ublk/test_generic_14.sh
> create mode 100755 tools/testing/selftests/ublk/test_loop_06.sh
> create mode 100755 tools/testing/selftests/ublk/test_loop_07.sh
> create mode 100755 tools/testing/selftests/ublk/test_null_03.sh
> create mode 100755 tools/testing/selftests/ublk/test_stress_06.sh
> create mode 100755 tools/testing/selftests/ublk/test_stress_07.sh
> create mode 100755 tools/testing/selftests/ublk/test_stripe_05.sh
> create mode 100755 tools/testing/selftests/ublk/test_stripe_06.sh
>
> diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> index 770269efe42a..837977b62417 100644
> --- a/tools/testing/selftests/ublk/Makefile
> +++ b/tools/testing/selftests/ublk/Makefile
> @@ -19,28 +19,36 @@ TEST_PROGS += test_generic_08.sh
> TEST_PROGS += test_generic_09.sh
> TEST_PROGS += test_generic_10.sh
> TEST_PROGS += test_generic_11.sh
> TEST_PROGS += test_generic_12.sh
> TEST_PROGS += test_generic_13.sh
> +TEST_PROGS += test_generic_14.sh
>
> TEST_PROGS += test_null_01.sh
> TEST_PROGS += test_null_02.sh
> +TEST_PROGS += test_null_03.sh
> TEST_PROGS += test_loop_01.sh
> TEST_PROGS += test_loop_02.sh
> TEST_PROGS += test_loop_03.sh
> TEST_PROGS += test_loop_04.sh
> TEST_PROGS += test_loop_05.sh
> +TEST_PROGS += test_loop_06.sh
> +TEST_PROGS += test_loop_07.sh
> TEST_PROGS += test_stripe_01.sh
> TEST_PROGS += test_stripe_02.sh
> TEST_PROGS += test_stripe_03.sh
> TEST_PROGS += test_stripe_04.sh
> +TEST_PROGS += test_stripe_05.sh
> +TEST_PROGS += test_stripe_06.sh
>
> TEST_PROGS += test_stress_01.sh
> TEST_PROGS += test_stress_02.sh
> TEST_PROGS += test_stress_03.sh
> TEST_PROGS += test_stress_04.sh
> TEST_PROGS += test_stress_05.sh
> +TEST_PROGS += test_stress_06.sh
> +TEST_PROGS += test_stress_07.sh
>
> TEST_GEN_PROGS_EXTENDED = kublk
>
> include ../lib.mk
>
> diff --git a/tools/testing/selftests/ublk/test_generic_14.sh b/tools/testing/selftests/ublk/test_generic_14.sh
> new file mode 100755
> index 000000000000..cd9b44b97c24
> --- /dev/null
> +++ b/tools/testing/selftests/ublk/test_generic_14.sh
> @@ -0,0 +1,40 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> +
> +TID="generic_14"
> +ERR_CODE=0
> +
> +ublk_run_recover_test()
> +{
> + run_io_and_recover 256M "kill_daemon" "$@"
> + ERR_CODE=$?
> + if [ ${ERR_CODE} -ne 0 ]; then
> + echo "$TID failure: $*"
> + _show_result $TID $ERR_CODE
> + fi
> +}
> +
> +if ! _have_program fio; then
> + exit "$UBLK_SKIP_CODE"
> +fi
> +
> +_prep_test "recover" "basic recover function verification (user copy)"
> +
> +_create_backfile 0 256M
> +_create_backfile 1 128M
> +_create_backfile 2 128M
> +
> +ublk_run_recover_test -t null -q 2 -r 1 -u &
> +ublk_run_recover_test -t loop -q 2 -r 1 -u "${UBLK_BACKFILES[0]}" &
> +ublk_run_recover_test -t stripe -q 2 -r 1 -u "${UBLK_BACKFILES[1]}" "${UBLK_BACKFILES[2]}" &
> +wait
> +
> +ublk_run_recover_test -t null -q 2 -r 1 -u -i 1 &
> +ublk_run_recover_test -t loop -q 2 -r 1 -u -i 1 "${UBLK_BACKFILES[0]}" &
> +ublk_run_recover_test -t stripe -q 2 -r 1 -u -i 1 "${UBLK_BACKFILES[1]}" "${UBLK_BACKFILES[2]}" &
> +wait
> +
> +_cleanup_test "recover"
> +_show_result $TID $ERR_CODE
> diff --git a/tools/testing/selftests/ublk/test_loop_06.sh b/tools/testing/selftests/ublk/test_loop_06.sh
> new file mode 100755
> index 000000000000..1d1a8a725502
> --- /dev/null
> +++ b/tools/testing/selftests/ublk/test_loop_06.sh
> @@ -0,0 +1,25 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> +
> +TID="loop_06"
> +ERR_CODE=0
> +
> +if ! _have_program fio; then
> + exit "$UBLK_SKIP_CODE"
> +fi
> +
> +_prep_test "loop" "write and verify over user copy"
> +
> +_create_backfile 0 256M
> +dev_id=$(_add_ublk_dev -t loop -u "${UBLK_BACKFILES[0]}")
> +_check_add_dev $TID $?
> +
> +# run fio over the ublk disk
> +_run_fio_verify_io --filename=/dev/ublkb"${dev_id}" --size=256M
> +ERR_CODE=$?
> +
> +_cleanup_test "loop"
> +
> +_show_result $TID $ERR_CODE
> diff --git a/tools/testing/selftests/ublk/test_loop_07.sh b/tools/testing/selftests/ublk/test_loop_07.sh
> new file mode 100755
> index 000000000000..493f3fb611a5
> --- /dev/null
> +++ b/tools/testing/selftests/ublk/test_loop_07.sh
> @@ -0,0 +1,21 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> +
> +TID="loop_07"
> +ERR_CODE=0
> +
> +_prep_test "loop" "mkfs & mount & umount with user copy"
> +
> +_create_backfile 0 256M
> +
> +dev_id=$(_add_ublk_dev -t loop -u "${UBLK_BACKFILES[0]}")
> +_check_add_dev $TID $?
> +
> +_mkfs_mount_test /dev/ublkb"${dev_id}"
> +ERR_CODE=$?
> +
> +_cleanup_test "loop"
> +
> +_show_result $TID $ERR_CODE
> diff --git a/tools/testing/selftests/ublk/test_null_03.sh b/tools/testing/selftests/ublk/test_null_03.sh
> new file mode 100755
> index 000000000000..0051067b4686
> --- /dev/null
> +++ b/tools/testing/selftests/ublk/test_null_03.sh
> @@ -0,0 +1,24 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> +
> +TID="null_03"
> +ERR_CODE=0
> +
> +if ! _have_program fio; then
> + exit "$UBLK_SKIP_CODE"
> +fi
> +
> +_prep_test "null" "basic IO test with user copy"
> +
> +dev_id=$(_add_ublk_dev -t null -u)
> +_check_add_dev $TID $?
> +
> +# run fio over the two disks
> +fio --name=job1 --filename=/dev/ublkb"${dev_id}" --ioengine=libaio --rw=readwrite --iodepth=32 --size=256M > /dev/null 2>&1
> +ERR_CODE=$?
> +
> +_cleanup_test "null"
> +
> +_show_result $TID $ERR_CODE
> diff --git a/tools/testing/selftests/ublk/test_stress_05.sh b/tools/testing/selftests/ublk/test_stress_05.sh
> index 09b94c36f2ba..cb8203957d1d 100755
> --- a/tools/testing/selftests/ublk/test_stress_05.sh
> +++ b/tools/testing/selftests/ublk/test_stress_05.sh
> @@ -78,7 +78,14 @@ if _have_feature "PER_IO_DAEMON"; then
> ublk_io_and_remove 256M -t loop -q 4 --nthreads 8 --per_io_tasks -r 1 -i "$reissue" "${UBLK_BACKFILES[0]}" &
> ublk_io_and_remove 8G -t null -q 4 --nthreads 8 --per_io_tasks -r 1 -i "$reissue" &
> fi
> wait
>
> +for reissue in $(seq 0 1); do
> + ublk_io_and_remove 8G -t null -q 4 -u -r 1 -i "$reissue" &
> + ublk_io_and_remove 256M -t loop -q 4 -u -r 1 -i "$reissue" "${UBLK_BACKFILES[1]}" &
> + ublk_io_and_remove 8G -t null -q 4 -u -r 1 -i "$reissue" &
> + wait
> +done

I'd suggest to not add new test coverage in old stress tests until default
timeout is overrided, now it is close to default 45 seconds timeout.

Thanks,
Ming