| #!/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 |