[PATCH 07/13] libmultipath: Add delayed removal support

John Garry john.g.garry at oracle.com
Thu Apr 9 06:00:55 PDT 2026


On 09/04/2026 07:37, Nilay Shroff wrote:
>>
>> 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?
>>
> Yes, I'd add a blktest for 'queue_if_no_path' feature. But as we know we 
> have
> 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"
}
#
#







More information about the Linux-nvme mailing list