nvmf: sanity check passthru handlers

These routines can only handle a single buffer; double check that is the
case, and fail if not.

Signed-off-by: John Levon <john.levon@nutanix.com>
Change-Id: I136482c27c73655887c49405f747b8ed073f7b69
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16198
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
This commit is contained in:
John Levon 2023-01-08 00:21:21 +00:00 committed by Tomasz Zawadzki
parent 9b7c2bf544
commit 6b206e3110
2 changed files with 17 additions and 2 deletions

View File

@ -743,7 +743,14 @@ nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *
{ {
int rc; int rc;
rc = spdk_bdev_nvme_io_passthru(desc, ch, &req->cmd->nvme_cmd, req->data, req->length, if (spdk_unlikely(req->iovcnt != 1)) {
req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
req->rsp->nvme_cpl.status.dnr = 1;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
rc = spdk_bdev_nvme_io_passthru(desc, ch, &req->cmd->nvme_cmd, req->iov[0].iov_base, req->length,
nvmf_bdev_ctrlr_complete_cmd, req); nvmf_bdev_ctrlr_complete_cmd, req);
if (spdk_unlikely(rc)) { if (spdk_unlikely(rc)) {
if (rc == -ENOMEM) { if (rc == -ENOMEM) {
@ -766,9 +773,16 @@ spdk_nvmf_bdev_ctrlr_nvme_passthru_admin(struct spdk_bdev *bdev, struct spdk_bde
{ {
int rc; int rc;
if (spdk_unlikely(req->iovcnt != 1)) {
req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
req->rsp->nvme_cpl.status.dnr = 1;
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
req->cmd_cb_fn = cb_fn; req->cmd_cb_fn = cb_fn;
rc = spdk_bdev_nvme_admin_passthru(desc, ch, &req->cmd->nvme_cmd, req->data, req->length, rc = spdk_bdev_nvme_admin_passthru(desc, ch, &req->cmd->nvme_cmd, req->iov[0].iov_base, req->length,
nvmf_bdev_ctrlr_complete_admin_cmd, req); nvmf_bdev_ctrlr_complete_admin_cmd, req);
if (spdk_unlikely(rc)) { if (spdk_unlikely(rc)) {
if (rc == -ENOMEM) { if (rc == -ENOMEM) {

View File

@ -840,6 +840,7 @@ test_nvmf_bdev_ctrlr_nvme_passthru(void)
req.qpair = &qpair; req.qpair = &qpair;
req.cmd = (union nvmf_h2c_msg *)&cmd; req.cmd = (union nvmf_h2c_msg *)&cmd;
req.rsp = &rsp; req.rsp = &rsp;
spdk_iov_one(req.iov, &req.iovcnt, NULL, 0);
cmd.nsid = 1; cmd.nsid = 1;
cmd.opc = 0xFF; cmd.opc = 0xFF;