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:
parent
a077b477ca
commit
5b0e370bf6
@ -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);
|
||||||
|
@ -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,24 +94,62 @@ 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)) {
|
|
||||||
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 || spdk_nvme_cpl_is_error(&status.cpl)) {
|
if (ns->ctrlr->vs.raw < SPDK_NVME_VERSION(1, 3, 0) ||
|
||||||
SPDK_WARNLOG("Failed to retrieve NS ID Descriptor List\n");
|
(ns->ctrlr->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
|
||||||
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");
|
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) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user