Commit 5b0e370b authored by Changpeng Liu's avatar Changpeng Liu Committed by Jim Harris
Browse files

nvme: broke up nvme_ns_construct() with IDENTIFY functions



Change-Id: I78f0a5ada3a0ec5e20d6e80f7442bac0c6461fce
Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/425703


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent a077b477
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -787,6 +787,8 @@ int nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair,
				  struct nvme_request *req);

int	nvme_ctrlr_identify_active_ns(struct spdk_nvme_ctrlr *ctrlr);
int	nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns);
int	nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns);
int	nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
			  struct spdk_nvme_ctrlr *ctrlr);
void	nvme_ns_destruct(struct spdk_nvme_ns *ns);
+63 −34
Original line number Diff line number Diff line
@@ -39,28 +39,12 @@ _nvme_ns_get_data(struct spdk_nvme_ns *ns)
	return &ns->ctrlr->nsdata[ns->id - 1];
}

static
int nvme_ns_identify_update(struct spdk_nvme_ns *ns)
static void
nvme_ns_set_identify_data(struct spdk_nvme_ns *ns)
{
	struct nvme_completion_poll_status	status;
	struct spdk_nvme_ns_data	*nsdata;
	int					rc;

	nsdata = _nvme_ns_get_data(ns);
	rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id,
				     nsdata, sizeof(*nsdata),
				     nvme_completion_poll_cb, &status);
	if (rc != 0) {
		return rc;
	}

	if (spdk_nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, &status,
			&ns->ctrlr->ctrlr_lock)) {
		/* This can occur if the namespace is not active. Simply zero the
		 * namespace data and continue. */
		nvme_ns_destruct(ns);
		return 0;
	}

	ns->flags = 0x0000;

@@ -110,25 +94,63 @@ int nvme_ns_identify_update(struct spdk_nvme_ns *ns)
		ns->flags |= SPDK_NVME_NS_DPS_PI_SUPPORTED;
		ns->pi_type = nsdata->dps.pit;
	}
}

int
nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns)
{
	struct nvme_completion_poll_status	status;
	struct spdk_nvme_ns_data		*nsdata;
	int					rc;

	nsdata = _nvme_ns_get_data(ns);
	rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id,
				     nsdata, sizeof(*nsdata),
				     nvme_completion_poll_cb, &status);
	if (rc != 0) {
		return rc;
	}

	if (spdk_nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, &status,
			&ns->ctrlr->ctrlr_lock)) {
		/* This can occur if the namespace is not active. Simply zero the
		 * namespace data and continue. */
		nvme_ns_destruct(ns);
		return 0;
	}

	nvme_ns_set_identify_data(ns);

	return 0;
}

int
nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
{
	struct nvme_completion_poll_status      status;
	int                                     rc;

	memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
	if (ns->ctrlr->vs.raw >= SPDK_NVME_VERSION(1, 3, 0) &&
	    !(ns->ctrlr->quirks & NVME_QUIRK_IDENTIFY_CNS)) {

	if (ns->ctrlr->vs.raw < SPDK_NVME_VERSION(1, 3, 0) ||
	    (ns->ctrlr->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
		SPDK_DEBUGLOG(SPDK_LOG_NVME, "Version < 1.3; not attempting to retrieve NS ID Descriptor List\n");
		return 0;
	}

	SPDK_DEBUGLOG(SPDK_LOG_NVME, "Attempting to retrieve NS ID Descriptor List\n");
	rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST, 0, ns->id,
				     ns->id_desc_list, sizeof(ns->id_desc_list),
				     nvme_completion_poll_cb, &status);
		if (rc == 0) {
			rc = spdk_nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, &status, &ns->ctrlr->ctrlr_lock);
	if (rc < 0) {
		return rc;
	}

		if (rc != 0 || spdk_nvme_cpl_is_error(&status.cpl)) {
	rc = spdk_nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, &status, &ns->ctrlr->ctrlr_lock);
	if (rc != 0) {
		SPDK_WARNLOG("Failed to retrieve NS ID Descriptor List\n");
		memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
	}
	} else {
		SPDK_DEBUGLOG(SPDK_LOG_NVME, "Version < 1.3; not attempting to retrieve NS ID Descriptor List\n");
	}

	return rc;
}
@@ -297,12 +319,19 @@ spdk_nvme_ns_get_uuid(const struct spdk_nvme_ns *ns)
int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
		      struct spdk_nvme_ctrlr *ctrlr)
{
	int	rc;

	assert(id > 0);

	ns->ctrlr = ctrlr;
	ns->id = id;

	return nvme_ns_identify_update(ns);
	rc = nvme_ctrlr_identify_ns(ns);
	if (rc != 0) {
		return rc;
	}

	return nvme_ctrlr_identify_id_desc(ns);
}

void nvme_ns_destruct(struct spdk_nvme_ns *ns)