diff --git a/tests/nvme/064 b/tests/nvme/064 new file mode 100755 index 00000000..eb6f8afd --- /dev/null +++ b/tests/nvme/064 @@ -0,0 +1,68 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-3.0+ +# Copyright (C) 2025 Yi Zhang +# +# Test NVMe disk namespace management +# + +. tests/nvme/rc + +DESCRIPTION="Test NVMe disk namespace management" +QUICK=1 +CAN_BE_ZONED=1 + +requires() { + _nvme_requires + _have_fio + _have_program jq +} + +device_requires() { + _require_nvme_support_ns_mgt +} + +test_device() { + echo "Running ${TEST_NAME}" + + local ns_dev ctrl_dev nn tnvmcap lbaf lbads cntlid + + ns_dev=${TEST_DEV##*/} + ctrl_dev=${ns_dev%n*} + nn=$(nvme id-ctrl --output-format=json /dev/"$ctrl_dev" | jq '.nn') + tnvmcap=$(nvme id-ctrl --output-format=json /dev/"$ctrl_dev" | jq '.tnvmcap') + flbas=$(nvme id-ns --output-format=json "$TEST_DEV" | jq '.flbas') + ds=$(nvme id-ns --output-format=json "$TEST_DEV" | jq ".lbafs[$flbas].ds") + lbads=$((2**ds)) + cntlid=$(nvme id-ctrl --output-format=json /dev/"$ctrl_dev" | jq '.cntlid') + ns=$((tnvmcap/nn)) + tnsze=$((tnvmcap/lbads)) + nsze=$((ns/lbads)) + nid=1 + + # Delete the namespace + nvme delete-ns "$TEST_DEV" >>"${FULL}" 2>&1 + # Create nn-1 namespaces + while [ "$nid" -lt "$nn" ]; do + nvme create-ns /dev/"$ctrl_dev" --nsze="$nsze" --ncap="$nsze" --flbas="$flbas" >>"${FULL}" 2>&1 + nvme attach-ns /dev/"$ctrl_dev" --namespace-id="$nid" --controllers="$cntlid" >>"${FULL}" 2>&1 + ((nid++)) + done + # Create the $nn namespace + unvmcap=$(nvme id-ctrl --output-format=json /dev/"$ctrl_dev" | jq '.tnvmcap') + nsze=$((unvmcap/lbads)) + nvme create-ns /dev/"$ctrl_dev" --nsze="$nsze" --ncap="$nsze" --flbas="$flbas" >>"${FULL}" 2>&1 + nvme attach-ns /dev/"$ctrl_dev" --namespace-id="$nid" --controllers="$cntlid" >>"${FULL}" 2>&1 + + # Delete all the namespace created + for ns in $(seq 1 "$nn"); do + nvme delete-ns /dev/"$ctrl_dev"n"$ns" >>"${FULL}" 2>&1 + done + + # Create the namespace with all the size + nvme create-ns /dev/"$ctrl_dev" --nsze="$tnsze" --ncap="$tnsze" --flbas="$flbas" >>"${FULL}" 2>&1 + nvme attach-ns /dev/"$ctrl_dev" --namespace-id=1 --controllers="$cntlid" >>"${FULL}" 2>&1 + + udevadm settle + + echo "Test complete" +} diff --git a/tests/nvme/064.out b/tests/nvme/064.out new file mode 100644 index 00000000..5b34d4ec --- /dev/null +++ b/tests/nvme/064.out @@ -0,0 +1,2 @@ +Running nvme/064 +Test complete diff --git a/tests/nvme/rc b/tests/nvme/rc index ac3949a9..be2afb72 100644 --- a/tests/nvme/rc +++ b/tests/nvme/rc @@ -183,6 +183,19 @@ _require_nvme_cli_tls() { return 0 } +_require_nvme_support_ns_mgt() { + nn=$(nvme id-ctrl "$TEST_DEV" | grep ^nn | awk '{ print $3}') + if nvme id-ctrl -H "$TEST_DEV" | grep -q "NS Management and Attachment Not Supported"; then + SKIP_REASONS+=("$TEST_DEV doesn't support NS Management and Attachment") + return 1 + elif [ "$nn" -eq 1 ]; then + SKIP_REASONS+=("$TEST_DEV supports NS Management and Attachmentm but nn=$nn") + return 1 + + fi + return 0 +} + _require_kernel_nvme_fabrics_feature() { local feature="$1"