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"
}
#
#





Reply via email to