blob: 3ef367836ac5a73c5ea8d71757f14336f720e56c [file] [log] [blame] [edit]
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
ERR_CODE=0
_prep_test "null" "stop --safe command"
# Check if SAFE_STOP_DEV feature is supported
if ! _have_feature "SAFE_STOP_DEV"; then
_cleanup_test "null"
exit "$UBLK_SKIP_CODE"
fi
# Test 1: stop --safe on idle device should succeed
dev_id=$(_add_ublk_dev -t null -q 2 -d 32)
_check_add_dev $TID $?
# Device is idle (no openers), stop --safe should succeed
if ! ${UBLK_PROG} stop -n "${dev_id}" --safe; then
echo "stop --safe on idle device failed unexpectedly!"
ERR_CODE=255
fi
# Clean up device
_ublk_del_dev "${dev_id}" > /dev/null 2>&1
udevadm settle
# Test 2: stop --safe on device with active opener should fail
dev_id=$(_add_ublk_dev -t null -q 2 -d 32)
_check_add_dev $TID $?
# Open device in background (dd reads indefinitely)
dd if=/dev/ublkb${dev_id} of=/dev/null bs=4k iflag=direct > /dev/null 2>&1 &
dd_pid=$!
# Give dd time to start
sleep 0.2
# Device has active opener, stop --safe should fail with -EBUSY
if ${UBLK_PROG} stop -n "${dev_id}" --safe 2>/dev/null; then
echo "stop --safe on busy device succeeded unexpectedly!"
ERR_CODE=255
fi
# Kill dd and clean up
kill $dd_pid 2>/dev/null
wait $dd_pid 2>/dev/null
# Now device should be idle, regular delete should work
_ublk_del_dev "${dev_id}"
udevadm settle
_cleanup_test "null"
_show_result $TID $ERR_CODE