From: Uday Shankar ushankar@purestorage.com
[ Upstream commit a3835a44107fcbf05f183b5e8b60a8e4605b15ea ]
Some ublk selftests have strange behavior when fio is not installed. While most tests behave correctly (run if they don't need fio, or skip if they need fio), the following tests have different behavior:
- test_null_01, test_null_02, test_generic_01, test_generic_02, and test_generic_12 try to run fio without checking if it exists first, and fail on any failure of the fio command (including "fio command not found"). So these tests fail when they should skip. - test_stress_05 runs fio without checking if it exists first, but doesn't fail on fio command failure. This test passes, but that pass is misleading as the test doesn't do anything useful without fio installed. So this test passes when it should skip.
Fix these issues by adding _have_program fio checks to the top of all of these tests.
Signed-off-by: Uday Shankar ushankar@purestorage.com Reviewed-by: Ming Lei ming.lei@redhat.com Signed-off-by: Jens Axboe axboe@kernel.dk Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES
- Fix intent: Corrects kselftest behavior when `fio` is absent so tests skip rather than fail or (worse) falsely pass. Only touches selftests; no kernel/runtime code.
- Scope and change size: Minimal, contained additions of `_have_program fio` guards at the top of six shell tests: - tools/testing/selftests/ublk/test_generic_01.sh:13 - tools/testing/selftests/ublk/test_generic_02.sh:13 - tools/testing/selftests/ublk/test_generic_12.sh:13 - tools/testing/selftests/ublk/test_null_01.sh:9 - tools/testing/selftests/ublk/test_null_02.sh:9 - tools/testing/selftests/ublk/test_stress_05.sh:8
- Behavior fixed, per file: - generic_01, generic_02, generic_12: Previously ran `fio` unconditionally and treated any `fio` failure (including “command not found”) as test failure. Now skip early if `fio` is missing. - Example: tools/testing/selftests/ublk/test_generic_01.sh:13 adds: - `if ! _have_program fio; then` - `exit "$UBLK_SKIP_CODE"` - null_01, null_02: Previously ran `fio` unconditionally and set `ERR_CODE` to `fio`’s exit status, causing failures when `fio` is not installed. Now skip. - Example: tools/testing/selftests/ublk/test_null_01.sh:9 (same guard). - stress_05: Previously ran `fio` without checking for existence but didn’t propagate `fio` failure, so the test could pass without doing IO. Now skip if `fio` is absent. - Example: tools/testing/selftests/ublk/test_stress_05.sh:8 (same guard).
- Correct integration with test framework: - Skip code path uses `UBLK_SKIP_CODE=4` which matches kselftest conventions and test harness handling (tools/testing/selftests/ublk/test_common.sh:4, and `_show_result` prints “[SKIP]” for code 4). - `_have_program` is already defined and used throughout ublk selftests (tools/testing/selftests/ublk/test_common.sh:6).
- Consistency with other ublk tests: - Many existing ublk selftests already guard on `fio` (e.g., tools/testing/selftests/ublk/test_stress_01.sh includes the guard), so this change brings the remaining outliers into line.
- Risk assessment: - No architectural changes, no runtime code touched, only selftests updated. - Behavior when `fio` is present is unchanged; when `fio` is absent, tests now skip instead of failing/passing spuriously. - Extremely low regression risk.
- Stable applicability: - These specific tests exist in stable 6.17.y and currently lack the guards (e.g., remotes/stable/linux- 6.17.y:tools/testing/selftests/ublk/test_generic_01.sh shows no `fio` check at top), so backport provides immediate benefit for accurate test results. - Older stable lines (e.g., 6.6.y, 6.1.y) don’t contain these test files, so the change is not applicable there. - No “Cc: stable” tag, but stable routinely accepts small, low-risk selftest fixes that correct test behavior.
Given the above, this is a textbook stable backport: a small, selftests- only bugfix that improves test correctness with negligible risk.
tools/testing/selftests/ublk/test_generic_01.sh | 4 ++++ tools/testing/selftests/ublk/test_generic_02.sh | 4 ++++ tools/testing/selftests/ublk/test_generic_12.sh | 4 ++++ tools/testing/selftests/ublk/test_null_01.sh | 4 ++++ tools/testing/selftests/ublk/test_null_02.sh | 4 ++++ tools/testing/selftests/ublk/test_stress_05.sh | 4 ++++ 6 files changed, 24 insertions(+)
diff --git a/tools/testing/selftests/ublk/test_generic_01.sh b/tools/testing/selftests/ublk/test_generic_01.sh index 9227a208ba531..21a31cd5491aa 100755 --- a/tools/testing/selftests/ublk/test_generic_01.sh +++ b/tools/testing/selftests/ublk/test_generic_01.sh @@ -10,6 +10,10 @@ if ! _have_program bpftrace; then exit "$UBLK_SKIP_CODE" fi
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + _prep_test "null" "sequential io order"
dev_id=$(_add_ublk_dev -t null) diff --git a/tools/testing/selftests/ublk/test_generic_02.sh b/tools/testing/selftests/ublk/test_generic_02.sh index 3e80121e3bf5e..12920768b1a08 100755 --- a/tools/testing/selftests/ublk/test_generic_02.sh +++ b/tools/testing/selftests/ublk/test_generic_02.sh @@ -10,6 +10,10 @@ if ! _have_program bpftrace; then exit "$UBLK_SKIP_CODE" fi
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + _prep_test "null" "sequential io order for MQ"
dev_id=$(_add_ublk_dev -t null -q 2) diff --git a/tools/testing/selftests/ublk/test_generic_12.sh b/tools/testing/selftests/ublk/test_generic_12.sh index 7abbb00d251df..b4046201b4d99 100755 --- a/tools/testing/selftests/ublk/test_generic_12.sh +++ b/tools/testing/selftests/ublk/test_generic_12.sh @@ -10,6 +10,10 @@ if ! _have_program bpftrace; then exit "$UBLK_SKIP_CODE" fi
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + _prep_test "null" "do imbalanced load, it should be balanced over I/O threads"
NTHREADS=6 diff --git a/tools/testing/selftests/ublk/test_null_01.sh b/tools/testing/selftests/ublk/test_null_01.sh index a34203f726685..c2cb8f7a09fe3 100755 --- a/tools/testing/selftests/ublk/test_null_01.sh +++ b/tools/testing/selftests/ublk/test_null_01.sh @@ -6,6 +6,10 @@ TID="null_01" ERR_CODE=0
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + _prep_test "null" "basic IO test"
dev_id=$(_add_ublk_dev -t null) diff --git a/tools/testing/selftests/ublk/test_null_02.sh b/tools/testing/selftests/ublk/test_null_02.sh index 5633ca8766554..8accd35beb55c 100755 --- a/tools/testing/selftests/ublk/test_null_02.sh +++ b/tools/testing/selftests/ublk/test_null_02.sh @@ -6,6 +6,10 @@ TID="null_02" ERR_CODE=0
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + _prep_test "null" "basic IO test with zero copy"
dev_id=$(_add_ublk_dev -t null -z) diff --git a/tools/testing/selftests/ublk/test_stress_05.sh b/tools/testing/selftests/ublk/test_stress_05.sh index 566cfd90d192c..274295061042e 100755 --- a/tools/testing/selftests/ublk/test_stress_05.sh +++ b/tools/testing/selftests/ublk/test_stress_05.sh @@ -5,6 +5,10 @@ TID="stress_05" ERR_CODE=0
+if ! _have_program fio; then + exit "$UBLK_SKIP_CODE" +fi + run_io_and_remove() { local size=$1