nvme: add error checking for internal ctrlr_cmds
Many of the internal controller initialization functions did not check for allocation failure; add return codes and check them where applicable. Change-Id: Id1b33bb06fca84035369d8b7ecd4c36b8ba7134c Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
5ee7a5df37
commit
89bf6d5ce1
@ -422,10 +422,15 @@ static int
|
||||
nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr)
|
||||
{
|
||||
struct nvme_completion_poll_status status;
|
||||
int rc;
|
||||
|
||||
status.done = false;
|
||||
nvme_ctrlr_cmd_identify_controller(ctrlr, &ctrlr->cdata,
|
||||
nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_identify_controller(ctrlr, &ctrlr->cdata,
|
||||
nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
}
|
||||
@ -452,6 +457,7 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
struct nvme_driver *driver = &g_nvme_driver;
|
||||
struct nvme_completion_poll_status status;
|
||||
int cq_allocated, sq_allocated;
|
||||
int rc;
|
||||
uint32_t max_io_queues;
|
||||
|
||||
status.done = false;
|
||||
@ -460,8 +466,12 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
max_io_queues = driver->max_io_queues;
|
||||
nvme_mutex_unlock(&driver->lock);
|
||||
|
||||
nvme_ctrlr_cmd_set_num_queues(ctrlr, max_io_queues,
|
||||
nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_set_num_queues(ctrlr, max_io_queues,
|
||||
nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
}
|
||||
@ -493,6 +503,7 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
struct nvme_completion_poll_status status;
|
||||
struct spdk_nvme_qpair *qpair;
|
||||
uint32_t i;
|
||||
int rc;
|
||||
|
||||
if (nvme_ctrlr_construct_io_qpairs(ctrlr)) {
|
||||
nvme_printf(ctrlr, "nvme_ctrlr_construct_io_qpairs failed!\n");
|
||||
@ -503,8 +514,12 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
qpair = &ctrlr->ioq[i];
|
||||
|
||||
status.done = false;
|
||||
nvme_ctrlr_cmd_create_io_cq(ctrlr, qpair,
|
||||
nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_create_io_cq(ctrlr, qpair,
|
||||
nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
}
|
||||
@ -514,8 +529,12 @@ nvme_ctrlr_create_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
}
|
||||
|
||||
status.done = false;
|
||||
nvme_ctrlr_cmd_create_io_sq(qpair->ctrlr, qpair,
|
||||
nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_create_io_sq(qpair->ctrlr, qpair,
|
||||
nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
}
|
||||
@ -663,12 +682,16 @@ nvme_ctrlr_configure_aer(struct spdk_nvme_ctrlr *ctrlr)
|
||||
struct nvme_async_event_request *aer;
|
||||
uint32_t i;
|
||||
struct nvme_completion_poll_status status;
|
||||
int rc;
|
||||
|
||||
status.done = false;
|
||||
|
||||
state.raw = 0xFF;
|
||||
state.bits.reserved = 0;
|
||||
nvme_ctrlr_cmd_set_async_event_config(ctrlr, state, nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_set_async_event_config(ctrlr, state, nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
|
@ -76,7 +76,7 @@ spdk_nvme_ctrlr_cmd_admin_raw(struct spdk_nvme_ctrlr *ctrlr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
@ -86,6 +86,9 @@ nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload,
|
||||
req = nvme_allocate_request_contig(payload,
|
||||
sizeof(struct spdk_nvme_ctrlr_data),
|
||||
cb_fn, cb_arg);
|
||||
if (req == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
cmd = &req->cmd;
|
||||
cmd->opc = SPDK_NVME_OPC_IDENTIFY;
|
||||
@ -97,9 +100,10 @@ nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload,
|
||||
cmd->cdw10 = 1;
|
||||
|
||||
nvme_ctrlr_submit_admin_request(ctrlr, req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid,
|
||||
void *payload, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
@ -109,6 +113,9 @@ nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid,
|
||||
req = nvme_allocate_request_contig(payload,
|
||||
sizeof(struct spdk_nvme_ns_data),
|
||||
cb_fn, cb_arg);
|
||||
if (req == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
cmd = &req->cmd;
|
||||
cmd->opc = SPDK_NVME_OPC_IDENTIFY;
|
||||
@ -119,9 +126,10 @@ nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr, uint16_t nsid,
|
||||
cmd->nsid = nsid;
|
||||
|
||||
nvme_ctrlr_submit_admin_request(ctrlr, req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg)
|
||||
@ -130,6 +138,9 @@ nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_cmd *cmd;
|
||||
|
||||
req = nvme_allocate_request_null(cb_fn, cb_arg);
|
||||
if (req == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
cmd = &req->cmd;
|
||||
cmd->opc = SPDK_NVME_OPC_CREATE_IO_CQ;
|
||||
@ -147,9 +158,10 @@ nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
cmd->dptr.prp.prp1 = io_que->cpl_bus_addr;
|
||||
|
||||
nvme_ctrlr_submit_admin_request(ctrlr, req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
@ -157,6 +169,9 @@ nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_cmd *cmd;
|
||||
|
||||
req = nvme_allocate_request_null(cb_fn, cb_arg);
|
||||
if (req == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
cmd = &req->cmd;
|
||||
cmd->opc = SPDK_NVME_OPC_CREATE_IO_SQ;
|
||||
@ -171,6 +186,7 @@ nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
cmd->dptr.prp.prp1 = io_que->cmd_bus_addr;
|
||||
|
||||
nvme_ctrlr_submit_admin_request(ctrlr, req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
@ -226,18 +242,18 @@ spdk_nvme_ctrlr_cmd_get_feature(struct spdk_nvme_ctrlr *ctrlr, uint8_t feature,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr,
|
||||
uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
uint32_t cdw11;
|
||||
|
||||
cdw11 = ((num_queues - 1) << 16) | (num_queues - 1);
|
||||
spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_NUMBER_OF_QUEUES, cdw11, 0,
|
||||
NULL, 0, cb_fn, cb_arg);
|
||||
return spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_NUMBER_OF_QUEUES, cdw11, 0,
|
||||
NULL, 0, cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
|
||||
union spdk_nvme_critical_warning_state state, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg)
|
||||
@ -245,8 +261,9 @@ nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
|
||||
uint32_t cdw11;
|
||||
|
||||
cdw11 = state.raw;
|
||||
spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION, cdw11, 0, NULL, 0,
|
||||
cb_fn, cb_arg);
|
||||
return spdk_nvme_ctrlr_cmd_set_feature(ctrlr, SPDK_NVME_FEAT_ASYNC_EVENT_CONFIGURATION, cdw11, 0,
|
||||
NULL, 0,
|
||||
cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
int
|
||||
@ -276,7 +293,7 @@ spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid,
|
||||
uint16_t sqid, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
@ -284,10 +301,14 @@ nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid,
|
||||
struct spdk_nvme_cmd *cmd;
|
||||
|
||||
req = nvme_allocate_request_null(cb_fn, cb_arg);
|
||||
if (req == NULL) {
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
cmd = &req->cmd;
|
||||
cmd->opc = SPDK_NVME_OPC_ABORT;
|
||||
cmd->cdw10 = (cid << 16) | sqid;
|
||||
|
||||
nvme_ctrlr_submit_admin_request(ctrlr, req);
|
||||
return 0;
|
||||
}
|
||||
|
@ -443,25 +443,25 @@ nvme_align32pow2(uint32_t x)
|
||||
}
|
||||
|
||||
/* Admin functions */
|
||||
void nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr,
|
||||
void *payload,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
void nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_identify_namespace(struct spdk_nvme_ctrlr *ctrlr,
|
||||
uint16_t nsid, void *payload,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
void nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
void nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
void nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr,
|
||||
uint32_t num_queues, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg);
|
||||
void nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
|
||||
int nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
|
||||
union spdk_nvme_critical_warning_state state,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
void nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid,
|
||||
int nvme_ctrlr_cmd_abort(struct spdk_nvme_ctrlr *ctrlr, uint16_t cid,
|
||||
uint16_t sqid, spdk_nvme_cmd_cb cb_fn, void *cb_arg);
|
||||
|
||||
void nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl);
|
||||
|
@ -101,6 +101,7 @@ nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
|
||||
struct nvme_completion_poll_status status;
|
||||
struct spdk_nvme_ns_data *nsdata;
|
||||
uint32_t pci_devid;
|
||||
int rc;
|
||||
|
||||
nvme_assert(id > 0, ("invalid namespace id %d", id));
|
||||
|
||||
@ -116,8 +117,12 @@ nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id,
|
||||
nsdata = _nvme_ns_get_data(ns);
|
||||
|
||||
status.done = false;
|
||||
nvme_ctrlr_cmd_identify_namespace(ctrlr, id, nsdata,
|
||||
nvme_completion_poll_cb, &status);
|
||||
rc = nvme_ctrlr_cmd_identify_namespace(ctrlr, id, nsdata,
|
||||
nvme_completion_poll_cb, &status);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
}
|
||||
|
@ -132,37 +132,42 @@ nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr,
|
||||
union spdk_nvme_critical_warning_state state, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_identify_controller(struct spdk_nvme_ctrlr *ctrlr, void *payload,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr,
|
||||
uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_create_io_cq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
nvme_ctrlr_cmd_create_io_sq(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct spdk_nvme_qpair *io_que, spdk_nvme_cmd_cb cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
x
Reference in New Issue
Block a user