Re: [PATCH 07/13] libmultipath: Add delayed removal support
From: John Garry
Date: Thu Apr 09 2026 - 09:02:18 EST
On 09/04/2026 07:37, Nilay Shroff wrote:
Yes, I'd add a blktest for 'queue_if_no_path' feature. But as we know we have
You mean a common blktests testcase, right?
For NVMe, that test would:
a. try to remove NVMe ko when we have the delayed removal active
b. ensure that we can queue for no path
I suppose that a common testcase could be possible (with dm mpath), but doesn't dm have its own testsuite?
separate test suite for dm under blktests, I'd first target nvme testcase and
then later add another testcase for dm-multipath.
Testing a. is a challenge to be effective, as we would typically not be able to remove the nvme modules anyway due to many other references.
For b, how about something like the following:
set_conditions() {
_set_nvme_trtype "$@"
}
_delayed_nvme_reconnect_ctrl() {
sleep 2
_nvme_connect_subsys
}
test() {
echo "Running ${TEST_NAME}"
_setup_nvmet
local nvmedev
local ns
local bytes_written
_nvmet_target_setup
_nvme_connect_subsys
# Part a: Ensure writes fail when no path returns
nvmedev=$(_find_nvme_dev "${def_subsysnqn}")
ns=$(_find_nvme_ns "${def_subsys_uuid}")
echo 10 > "/sys/block/"$ns"/delayed_removal_secs"
bytes_written=$(run_xfs_io_pwritev2 /dev/"$ns" 4096)
if [ "$bytes_written" != 4096 ]; then
echo "could not write successfully initially"
fi
sleep 1
_nvme_disconnect_ctrl "${nvmedev}"
sleep 1
ns=$(_find_nvme_ns "${def_subsys_uuid}")
if [[ "${ns}" = "" ]]; then
echo "could not find ns after disconnect"
fi
bytes_written=$(run_xfs_io_pwritev2 /dev/"$ns" 4096)
if [ "$bytes_written" == 4096 ]; then
echo "wrote successfully after disconnect"
fi
sleep 10
ns=$(_find_nvme_ns "${def_subsys_uuid}")
if [[ !"${ns}" = "" ]]; then
echo "found ns after delayed removal"
fi
#echo "now part 2"
# Part b: Ensure writes work for intermittent disconnect
_nvme_connect_subsys
nvmedev=$(_find_nvme_dev "${def_subsysnqn}")
ns=$(_find_nvme_ns "${def_subsys_uuid}")
echo 10 > "/sys/block/"$ns"/delayed_removal_secs"
bytes_written=$(run_xfs_io_pwritev2 /dev/"$ns" 4096)
if [ "$bytes_written" != 4096 ]; then
echo "could not write successfully initially"
fi
sleep 1
_nvme_disconnect_ctrl "${nvmedev}"
sleep 1
ns=$(_find_nvme_ns "${def_subsys_uuid}")
if [[ "${ns}" = "" ]]; then
echo "could not find ns after disconnect"
fi
_delayed_nvme_reconnect_ctrl &
sleep 1
bytes_written=$(run_xfs_io_pwritev2 /dev/"$ns" 4096)
if [ "$bytes_written" != 4096 ]; then
echo "could not write successfully with reconnect"
fi
sleep 10
ns=$(_find_nvme_ns "${def_subsys_uuid}")
if [[ "${ns}" = "" ]]; then
echo "could not find ns after delayed reconnect"
fi
# Final tidy-up
echo 0 > /sys/block/"$ns"/delayed_removal_secs
nvmedev=$(_find_nvme_dev "${def_subsysnqn}")
_nvme_disconnect_ctrl "${nvmedev}"
_nvmet_target_cleanup
echo "Test complete"
}
#
#