Commit e2758c76 authored by Keith Busch's avatar Keith Busch
Browse files

nvmet: support for csi identify ns



Implements reporting the I/O Command Set Independent Identify Namespace
command.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
parent 5fd075cd
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -912,6 +912,35 @@ static void nvme_execute_identify_ns_nvm(struct nvmet_req *req)
	nvmet_req_complete(req, status);
}

static void nvmet_execute_id_cs_indep(struct nvmet_req *req)
{
	struct nvme_id_ns_cs_indep *id;
	u16 status;

	status = nvmet_req_find_ns(req);
	if (status)
		goto out;

	id = kzalloc(sizeof(*id), GFP_KERNEL);
	if (!id) {
		status = NVME_SC_INTERNAL;
		goto out;
	}

	id->nstat = NVME_NSTAT_NRDY;
	id->anagrpid = cpu_to_le32(req->ns->anagrpid);
	id->nmic = NVME_NS_NMIC_SHARED;
	if (req->ns->readonly)
		id->nsattr |= NVME_NS_ATTR_RO;
	if (req->ns->bdev && !bdev_nonrot(req->ns->bdev))
		id->nsfeat |= NVME_NS_ROTATIONAL;

	status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));
	kfree(id);
out:
	nvmet_req_complete(req, status);
}

static void nvmet_execute_identify(struct nvmet_req *req)
{
	if (!nvmet_check_transfer_len(req, NVME_IDENTIFY_DATA_SIZE))
@@ -959,6 +988,9 @@ static void nvmet_execute_identify(struct nvmet_req *req)
	case NVME_ID_CNS_NS_ACTIVE_LIST_CS:
		nvmet_execute_identify_nslist(req, true);
		return;
	case NVME_ID_CNS_NS_CS_INDEP:
		nvmet_execute_id_cs_indep(req);
		return;
	case NVME_ID_CNS_ENDGRP_LIST:
		nvmet_execute_identify_endgrp_list(req);
		return;
+1 −0
Original line number Diff line number Diff line
@@ -563,6 +563,7 @@ enum {
	NVME_NS_FLBAS_LBA_SHIFT	= 1,
	NVME_NS_FLBAS_META_EXT	= 0x10,
	NVME_NS_NMIC_SHARED	= 1 << 0,
	NVME_NS_ROTATIONAL	= 1 << 4,
	NVME_LBAF_RP_BEST	= 0,
	NVME_LBAF_RP_BETTER	= 1,
	NVME_LBAF_RP_GOOD	= 2,