[PATCHv4 02/13] nvmet: implement active command set ns list

Matias Bjørling m at bjorling.me
Fri Nov 8 04:10:50 PST 2024


On 07-11-2024 20:38, Keith Busch wrote:
> From: Keith Busch <kbusch at kernel.org>
> 
> This is required for nvme 2.1 for targets that support multiple command
> sets. We support NVM and ZNS, so are required to support this
> identification.
> 
> Reviewed-by: Chaitanya Kulkarni <kch at nvidia.com>
> Reviewed-by: Christoph Hellwig <hch at lst.de>
> Signed-off-by: Keith Busch <kbusch at kernel.org>
> ---
>   drivers/nvme/target/admin-cmd.c | 9 +++++++--
>   include/linux/nvme.h            | 1 +
>   2 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
> index 8d06dba42bcb3..a13242e791c0f 100644
> --- a/drivers/nvme/target/admin-cmd.c
> +++ b/drivers/nvme/target/admin-cmd.c
> @@ -576,7 +576,7 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req)
>   	nvmet_req_complete(req, status);
>   }
>   
> -static void nvmet_execute_identify_nslist(struct nvmet_req *req)
> +static void nvmet_execute_identify_nslist(struct nvmet_req *req, bool match_css)
>   {
>   	static const int buf_size = NVME_IDENTIFY_DATA_SIZE;
>   	struct nvmet_ctrl *ctrl = req->sq->ctrl;
> @@ -606,6 +606,8 @@ static void nvmet_execute_identify_nslist(struct nvmet_req *req)
>   	xa_for_each(&ctrl->subsys->namespaces, idx, ns) {
>   		if (ns->nsid <= min_nsid)
>   			continue;
> +		if (match_css && req->ns->csi != req->cmd->identify.csi)
> +			continue;
>   		list[i++] = cpu_to_le32(ns->nsid);
>   		if (i == buf_size / sizeof(__le32))
>   			break;
> @@ -712,7 +714,7 @@ static void nvmet_execute_identify(struct nvmet_req *req)
>   		nvmet_execute_identify_ctrl(req);
>   		return;
>   	case NVME_ID_CNS_NS_ACTIVE_LIST:
> -		nvmet_execute_identify_nslist(req);
> +		nvmet_execute_identify_nslist(req, false);
>   		return;
>   	case NVME_ID_CNS_NS_DESC_LIST:
>   		nvmet_execute_identify_desclist(req);
> @@ -743,6 +745,9 @@ static void nvmet_execute_identify(struct nvmet_req *req)
>   			break;
>   		}
>   		break;
> +	case NVME_ID_CNS_NS_ACTIVE_LIST_CS:
> +		nvmet_execute_identify_nslist(req, true);
> +		return;
>   	}
>   
>   	pr_debug("unhandled identify cns %d on qid %d\n",
> diff --git a/include/linux/nvme.h b/include/linux/nvme.h
> index b58d9405d65e0..0f263c7e63192 100644
> --- a/include/linux/nvme.h
> +++ b/include/linux/nvme.h
> @@ -522,6 +522,7 @@ enum {
>   	NVME_ID_CNS_NS_DESC_LIST	= 0x03,
>   	NVME_ID_CNS_CS_NS		= 0x05,
>   	NVME_ID_CNS_CS_CTRL		= 0x06,
> +	NVME_ID_CNS_NS_ACTIVE_LIST_CS	= 0x07,
>   	NVME_ID_CNS_NS_CS_INDEP		= 0x08,
>   	NVME_ID_CNS_NS_PRESENT_LIST	= 0x10,
>   	NVME_ID_CNS_NS_PRESENT		= 0x11,

Looks good.

Reviewed-by: Matias Bjørling <matias.bjorling at wdc.com>



More information about the Linux-nvme mailing list