xref: /linux/tools/testing/selftests/ublk/test_generic_16.sh (revision 0c00ed308d0559fc216be0442a3df124e9e13533)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
5
6ERR_CODE=0
7
8_prep_test "null" "stop --safe command"
9
10# Check if SAFE_STOP_DEV feature is supported
11if ! _have_feature "SAFE_STOP_DEV"; then
12	_cleanup_test "null"
13	exit "$UBLK_SKIP_CODE"
14fi
15
16# Test 1: stop --safe on idle device should succeed
17dev_id=$(_add_ublk_dev -t null -q 2 -d 32)
18_check_add_dev $TID $?
19
20# Device is idle (no openers), stop --safe should succeed
21if ! ${UBLK_PROG} stop -n "${dev_id}" --safe; then
22	echo "stop --safe on idle device failed unexpectedly!"
23	ERR_CODE=255
24fi
25
26# Clean up device
27_ublk_del_dev "${dev_id}" > /dev/null 2>&1
28udevadm settle
29
30# Test 2: stop --safe on device with active opener should fail
31dev_id=$(_add_ublk_dev -t null -q 2 -d 32)
32_check_add_dev $TID $?
33
34# Open device in background (dd reads indefinitely)
35dd if=/dev/ublkb${dev_id} of=/dev/null bs=4k iflag=direct > /dev/null 2>&1 &
36dd_pid=$!
37
38# Give dd time to start
39sleep 0.2
40
41# Device has active opener, stop --safe should fail with -EBUSY
42if ${UBLK_PROG} stop -n "${dev_id}" --safe 2>/dev/null; then
43	echo "stop --safe on busy device succeeded unexpectedly!"
44	ERR_CODE=255
45fi
46
47# Kill dd and clean up
48kill $dd_pid 2>/dev/null
49wait $dd_pid 2>/dev/null
50
51# Now device should be idle, regular delete should work
52_ublk_del_dev "${dev_id}"
53udevadm settle
54
55_cleanup_test "null"
56_show_result $TID $ERR_CODE
57