nvmf: Move spdk_nvmf_ctrlr_process_io_cmd into ctrlr.c
Previously, all I/O commands were implemented by simply passing them to the bdev layer. Now, some I/O commands will be emulated. Prepare for that by moving the code for this function to ctrlr.c, where the emulation will occur. Change-Id: Id34e5549e5ce216d602fb347b4506fbd324eed4e Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/c/440591 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: Seth Howell <seth.howell5141@gmail.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
5f0df58532
commit
1b6b6cc440
@ -1957,3 +1957,61 @@ spdk_nvmf_ctrlr_abort_aer(struct spdk_nvmf_ctrlr *ctrlr)
|
||||
spdk_nvmf_request_complete(ctrlr->aer_req);
|
||||
ctrlr->aer_req = NULL;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint32_t nsid;
|
||||
struct spdk_nvmf_ns *ns;
|
||||
struct spdk_bdev *bdev;
|
||||
struct spdk_bdev_desc *desc;
|
||||
struct spdk_io_channel *ch;
|
||||
struct spdk_nvmf_poll_group *group = req->qpair->group;
|
||||
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
|
||||
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
||||
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
|
||||
|
||||
/* pre-set response details for this command */
|
||||
response->status.sc = SPDK_NVME_SC_SUCCESS;
|
||||
nsid = cmd->nsid;
|
||||
|
||||
if (spdk_unlikely(ctrlr == NULL)) {
|
||||
SPDK_ERRLOG("I/O command sent before CONNECT\n");
|
||||
response->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||
response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
if (spdk_unlikely(ctrlr->vcprop.cc.bits.en != 1)) {
|
||||
SPDK_ERRLOG("I/O command sent to disabled controller\n");
|
||||
response->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||
response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
ns = _spdk_nvmf_subsystem_get_ns(ctrlr->subsys, nsid);
|
||||
if (ns == NULL || ns->bdev == NULL) {
|
||||
SPDK_ERRLOG("Unsuccessful query for nsid %u\n", cmd->nsid);
|
||||
response->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT;
|
||||
response->status.dnr = 1;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
bdev = ns->bdev;
|
||||
desc = ns->desc;
|
||||
ch = group->sgroups[ctrlr->subsys->id].channels[nsid - 1];
|
||||
switch (cmd->opc) {
|
||||
case SPDK_NVME_OPC_READ:
|
||||
return spdk_nvmf_bdev_ctrlr_read_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_WRITE:
|
||||
return spdk_nvmf_bdev_ctrlr_write_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_WRITE_ZEROES:
|
||||
return spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_FLUSH:
|
||||
return spdk_nvmf_bdev_ctrlr_flush_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_DATASET_MANAGEMENT:
|
||||
return spdk_nvmf_bdev_ctrlr_dsm_cmd(bdev, desc, ch, req);
|
||||
default:
|
||||
return spdk_nvmf_bdev_ctrlr_nvme_passthru_io(bdev, desc, ch, req);
|
||||
}
|
||||
}
|
||||
|
@ -173,9 +173,9 @@ nvmf_bdev_ctrl_queue_io(struct spdk_nvmf_request *req, struct spdk_bdev *bdev,
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint64_t bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
||||
uint32_t block_size = spdk_bdev_get_block_size(bdev);
|
||||
@ -217,9 +217,9 @@ nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint64_t bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
||||
uint32_t block_size = spdk_bdev_get_block_size(bdev);
|
||||
@ -261,9 +261,9 @@ nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint64_t bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
||||
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
||||
@ -296,9 +296,9 @@ nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
|
||||
int rc;
|
||||
@ -442,9 +442,9 @@ nvmf_bdev_ctrlr_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint32_t attribute;
|
||||
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
||||
@ -460,9 +460,9 @@ nvmf_bdev_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
static int
|
||||
nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
int
|
||||
spdk_nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@ -480,61 +480,3 @@ nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *
|
||||
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req)
|
||||
{
|
||||
uint32_t nsid;
|
||||
struct spdk_nvmf_ns *ns;
|
||||
struct spdk_bdev *bdev;
|
||||
struct spdk_bdev_desc *desc;
|
||||
struct spdk_io_channel *ch;
|
||||
struct spdk_nvmf_poll_group *group = req->qpair->group;
|
||||
struct spdk_nvmf_ctrlr *ctrlr = req->qpair->ctrlr;
|
||||
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
||||
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
|
||||
|
||||
/* pre-set response details for this command */
|
||||
response->status.sc = SPDK_NVME_SC_SUCCESS;
|
||||
nsid = cmd->nsid;
|
||||
|
||||
if (spdk_unlikely(ctrlr == NULL)) {
|
||||
SPDK_ERRLOG("I/O command sent before CONNECT\n");
|
||||
response->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||
response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
if (spdk_unlikely(ctrlr->vcprop.cc.bits.en != 1)) {
|
||||
SPDK_ERRLOG("I/O command sent to disabled controller\n");
|
||||
response->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||
response->status.sc = SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
ns = _spdk_nvmf_subsystem_get_ns(ctrlr->subsys, nsid);
|
||||
if (ns == NULL || ns->bdev == NULL) {
|
||||
SPDK_ERRLOG("Unsuccessful query for nsid %u\n", cmd->nsid);
|
||||
response->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT;
|
||||
response->status.dnr = 1;
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
bdev = ns->bdev;
|
||||
desc = ns->desc;
|
||||
ch = group->sgroups[ctrlr->subsys->id].channels[nsid - 1];
|
||||
switch (cmd->opc) {
|
||||
case SPDK_NVME_OPC_READ:
|
||||
return nvmf_bdev_ctrlr_read_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_WRITE:
|
||||
return nvmf_bdev_ctrlr_write_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_WRITE_ZEROES:
|
||||
return nvmf_bdev_ctrlr_write_zeroes_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_FLUSH:
|
||||
return nvmf_bdev_ctrlr_flush_cmd(bdev, desc, ch, req);
|
||||
case SPDK_NVME_OPC_DATASET_MANAGEMENT:
|
||||
return nvmf_bdev_ctrlr_dsm_cmd(bdev, desc, ch, req);
|
||||
default:
|
||||
return nvmf_bdev_ctrlr_nvme_passthru_io(bdev, desc, ch, req);
|
||||
}
|
||||
}
|
||||
|
@ -306,6 +306,18 @@ bool spdk_nvmf_ctrlr_write_zeroes_supported(struct spdk_nvmf_ctrlr *ctrlr);
|
||||
void spdk_nvmf_ctrlr_ns_changed(struct spdk_nvmf_ctrlr *ctrlr, uint32_t nsid);
|
||||
|
||||
void spdk_nvmf_bdev_ctrlr_identify_ns(struct spdk_nvmf_ns *ns, struct spdk_nvme_ns_data *nsdata);
|
||||
int spdk_nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
int spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
int spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
int spdk_nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
int spdk_nvmf_bdev_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
int spdk_nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||
|
||||
int spdk_nvmf_subsystem_add_ctrlr(struct spdk_nvmf_subsystem *subsystem,
|
||||
struct spdk_nvmf_ctrlr *ctrlr);
|
||||
|
@ -120,6 +120,42 @@ DEFINE_STUB(spdk_nvmf_transport_qpair_set_sqsize,
|
||||
(struct spdk_nvmf_qpair *qpair),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_read_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_write_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_write_zeroes_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_flush_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_dsm_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_nvme_passthru_io,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
int
|
||||
spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn, void *ctx)
|
||||
{
|
||||
|
@ -127,6 +127,42 @@ DEFINE_STUB(spdk_nvmf_request_free,
|
||||
(struct spdk_nvmf_request *req),
|
||||
-1);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_read_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_write_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_write_zeroes_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_flush_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_dsm_cmd,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_nvme_passthru_io,
|
||||
int,
|
||||
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
|
||||
struct spdk_nvmf_request *req),
|
||||
0);
|
||||
|
||||
struct spdk_trace_histories *g_trace_histories;
|
||||
|
||||
struct spdk_bdev {
|
||||
|
Loading…
Reference in New Issue
Block a user