diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 129aaa3f8..6f7846d67 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -157,14 +157,18 @@ nvme_allocate_request(struct spdk_nvme_qpair *qpair, STAILQ_REMOVE_HEAD(&qpair->free_req, stailq); /* - * Only memset up to (but not including) the children - * TAILQ_ENTRY. children, and following members, are + * Only memset/zero fields that need it. All other fields + * will be initialized appropriately either later in this + * function, or before they are needed later in the + * submission patch. For example, the children + * TAILQ_ENTRY and following members are * only used as part of I/O splitting so we avoid * memsetting them until it is actually needed. * They will be initialized in nvme_request_add_child() * if the request is split. */ - memset(req, 0, offsetof(struct nvme_request, children)); + memset(req, 0, offsetof(struct nvme_request, payload_size)); + req->cb_fn = cb_fn; req->cb_arg = cb_arg; req->payload = *payload; diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index 11bb63567..7d72c78c2 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -465,6 +465,7 @@ spdk_nvme_ctrlr_cmd_abort_cpl(void *ctx, const struct spdk_nvme_cpl *cpl) rc = nvme_ctrlr_submit_admin_request(ctrlr, next); if (rc < 0) { SPDK_ERRLOG("Failed to submit queued abort.\n"); + memset(&next->cpl, 0, sizeof(next->cpl)); next->cpl.status.sct = SPDK_NVME_SCT_GENERIC; next->cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; next->cpl.status.dnr = 1; diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 24bc1699b..add767a43 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -180,11 +180,6 @@ nvme_payload_type(const struct nvme_payload *payload) { struct nvme_request { struct spdk_nvme_cmd cmd; - /** - * Data payload for this request's command. - */ - struct nvme_payload payload; - uint8_t retries; /** @@ -192,7 +187,6 @@ struct nvme_request { * request which was split into multiple child requests. */ uint16_t num_children; - uint32_t payload_size; /** * Offset in bytes from the beginning of payload for this request. @@ -201,6 +195,13 @@ struct nvme_request { uint32_t payload_offset; uint32_t md_offset; + uint32_t payload_size; + + /** + * Data payload for this request's command. + */ + struct nvme_payload payload; + spdk_nvme_cmd_cb cb_fn; void *cb_arg; STAILQ_ENTRY(nvme_request) stailq;