int spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; bool done; if (cmd->opc == SPDK_NVME_OPC_FABRIC) { done = nvmf_process_fabrics_command(req); } else if (req->conn->type == CONN_TYPE_AQ) { done = nvmf_process_admin_cmd(req); } else { done = nvmf_process_io_cmd(req); } if (done) { /* Synchronous command - response is already filled out */ return spdk_nvmf_request_complete(req); } /* * Asynchronous command. * The completion callback will call spdk_nvmf_request_complete(). */ return 0; }
static void nvmf_direct_ctrlr_complete_cmd(void *ctx, const struct spdk_nvme_cpl *cmp) { struct spdk_nvmf_request *req = ctx; spdk_trace_record(TRACE_NVMF_LIB_COMPLETE, 0, 0, (uint64_t)req, 0); req->rsp->nvme_cpl = *cmp; spdk_nvmf_request_complete(req); }
int spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { struct spdk_nvmf_session *session = req->conn->sess; struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; struct spdk_nvme_cpl *rsp = &req->rsp->nvme_cpl; spdk_nvmf_request_exec_status status; nvmf_trace_command(req->cmd, req->conn->type); if (cmd->opc == SPDK_NVME_OPC_FABRIC) { status = nvmf_process_fabrics_command(req); } else if (session == NULL || !session->vcprop.cc.bits.en) { /* Only Fabric commands are allowed when the controller is disabled */ SPDK_ERRLOG("Non-Fabric command sent to disabled controller\n"); rsp->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR; status = SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } else if (req->conn->type == CONN_TYPE_AQ) { struct spdk_nvmf_subsystem *subsystem; subsystem = session->subsys; assert(subsystem != NULL); if (subsystem->subtype == SPDK_NVMF_SUBTYPE_DISCOVERY) { status = nvmf_process_discovery_cmd(req); } else { status = session->subsys->ops->process_admin_cmd(req); } } else { status = session->subsys->ops->process_io_cmd(req); } switch (status) { case SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE: return spdk_nvmf_request_complete(req); case SPDK_NVMF_REQUEST_EXEC_STATUS_RELEASE: if (req->conn->transport->req_release(req)) { SPDK_ERRLOG("Transport request release error!\n"); return -1; } return 0; case SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS: return 0; default: SPDK_ERRLOG("Unknown request exec status: 0x%x\n", status); return -1; } return 0; }
void spdk_nvmf_handle_connect(struct spdk_nvmf_request *req) { struct spdk_nvmf_fabric_connect_cmd *connect = &req->cmd->connect_cmd; struct spdk_nvmf_fabric_connect_data *connect_data = (struct spdk_nvmf_fabric_connect_data *) req->data; struct spdk_nvmf_fabric_connect_rsp *response = &req->rsp->connect_rsp; struct spdk_nvmf_conn *conn = req->conn; spdk_nvmf_session_connect(conn, connect, connect_data, response); SPDK_TRACELOG(SPDK_TRACE_NVMF, "connect capsule response: cntlid = 0x%04x\n", response->status_code_specific.success.cntlid); spdk_nvmf_request_complete(req); return; }