nvme: broke up nvme_ns_construct() with IDENTIFY functions

Change-Id: I78f0a5ada3a0ec5e20d6e80f7442bac0c6461fce
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/425703
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Changpeng Liu 2018-09-13 03:05:47 -04:00 committed by Jim Harris
parent a077b477ca
commit 5b0e370bf6
2 changed files with 65 additions and 34 deletions

View File

@ -787,6 +787,8 @@ int nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair,
struct nvme_request *req); struct nvme_request *req);
int nvme_ctrlr_identify_active_ns(struct spdk_nvme_ctrlr *ctrlr); 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, int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
struct spdk_nvme_ctrlr *ctrlr); struct spdk_nvme_ctrlr *ctrlr);
void nvme_ns_destruct(struct spdk_nvme_ns *ns); void nvme_ns_destruct(struct spdk_nvme_ns *ns);

View File

@ -39,28 +39,12 @@ _nvme_ns_get_data(struct spdk_nvme_ns *ns)
return &ns->ctrlr->nsdata[ns->id - 1]; return &ns->ctrlr->nsdata[ns->id - 1];
} }
static static void
int nvme_ns_identify_update(struct spdk_nvme_ns *ns) nvme_ns_set_identify_data(struct spdk_nvme_ns *ns)
{ {
struct nvme_completion_poll_status status;
struct spdk_nvme_ns_data *nsdata; struct spdk_nvme_ns_data *nsdata;
int rc;
nsdata = _nvme_ns_get_data(ns); 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; 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->flags |= SPDK_NVME_NS_DPS_PI_SUPPORTED;
ns->pi_type = nsdata->dps.pit; 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)); 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"); 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, 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), ns->id_desc_list, sizeof(ns->id_desc_list),
nvme_completion_poll_cb, &status); nvme_completion_poll_cb, &status);
if (rc == 0) { if (rc < 0) {
rc = spdk_nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, &status, &ns->ctrlr->ctrlr_lock); 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"); SPDK_WARNLOG("Failed to retrieve NS ID Descriptor List\n");
memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list)); 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; 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, int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
struct spdk_nvme_ctrlr *ctrlr) struct spdk_nvme_ctrlr *ctrlr)
{ {
int rc;
assert(id > 0); assert(id > 0);
ns->ctrlr = ctrlr; ns->ctrlr = ctrlr;
ns->id = id; 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) void nvme_ns_destruct(struct spdk_nvme_ns *ns)