vhost_scsi: minor cleanup

Clarify some error messages
and simplify the code.

Change-Id: I586ea55a1d9fa10142d4a9d469b62f1b83076cd5
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/381925
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Dariusz Stojaczyk 2017-10-10 12:32:57 +02:00 committed by Jim Harris
parent 6bb01df6d7
commit aab8511796

View File

@ -181,7 +181,6 @@ eventq_enqueue(struct spdk_vhost_scsi_dev *svdev, unsigned scsi_dev_num, uint32_
int rc; int rc;
assert(scsi_dev_num < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS); assert(scsi_dev_num < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS);
vq = &svdev->vdev.virtqueue[VIRTIO_SCSI_EVENTQ]; vq = &svdev->vdev.virtqueue[VIRTIO_SCSI_EVENTQ];
if (spdk_vhost_vq_avail_ring_get(vq, &req, 1) != 1) { if (spdk_vhost_vq_avail_ring_get(vq, &req, 1) != 1) {
@ -198,10 +197,9 @@ eventq_enqueue(struct spdk_vhost_scsi_dev *svdev, unsigned scsi_dev_num, uint32_
} }
desc_ev = spdk_vhost_gpa_to_vva(&svdev->vdev, desc->addr); desc_ev = spdk_vhost_gpa_to_vva(&svdev->vdev, desc->addr);
if (desc->len < sizeof(*desc_ev) || desc_ev == NULL) { if (desc_ev == NULL) {
SPDK_ERRLOG("Controller %s: Invalid eventq descriptor at index %"PRIu16".\n", SPDK_ERRLOG("Controller %s: Eventq descriptor at index %"PRIu16" points to unmapped guest memory address %p.\n",
svdev->vdev.name, req); svdev->vdev.name, req, (void *)(uintptr_t)desc->addr);
req_size = 0;
goto out; goto out;
} }
@ -411,9 +409,9 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
rc = spdk_vhost_vq_get_desc(vdev, task->vq, task->req_idx, &desc, &desc_table, &desc_table_len); rc = spdk_vhost_vq_get_desc(vdev, task->vq, task->req_idx, &desc, &desc_table, &desc_table_len);
/* First descriptor must be readable */ /* First descriptor must be readable */
if (rc != 0 || spdk_unlikely(spdk_vhost_vring_desc_is_wr(desc))) { if (rc != 0 || spdk_unlikely(spdk_vhost_vring_desc_is_wr(desc))) {
SPDK_WARNLOG("Invalid first (request) descriptor.\n"); SPDK_WARNLOG("%s: invalid first (request) descriptor at index %"PRIu16".\n",
task->resp = NULL; vdev->name, task->req_idx);
goto abort_task; goto invalid_task;
} }
*req = spdk_vhost_gpa_to_vva(vdev, desc->addr); *req = spdk_vhost_gpa_to_vva(vdev, desc->addr);
@ -423,8 +421,7 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
if (desc == NULL) { if (desc == NULL) {
SPDK_WARNLOG("%s: Descriptor chain at index %d contains neither payload nor response buffer.\n", SPDK_WARNLOG("%s: Descriptor chain at index %d contains neither payload nor response buffer.\n",
vdev->name, task->req_idx); vdev->name, task->req_idx);
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
task->scsi.dxfer_dir = spdk_vhost_vring_desc_is_wr(desc) ? SPDK_SCSI_DIR_FROM_DEV : task->scsi.dxfer_dir = spdk_vhost_vring_desc_is_wr(desc) ? SPDK_SCSI_DIR_FROM_DEV :
SPDK_SCSI_DIR_TO_DEV; SPDK_SCSI_DIR_TO_DEV;
@ -440,8 +437,7 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
if (spdk_unlikely(rc != 0)) { if (spdk_unlikely(rc != 0)) {
SPDK_WARNLOG("%s: invalid descriptor chain at request index %d (descriptor id overflow?).\n", SPDK_WARNLOG("%s: invalid descriptor chain at request index %d (descriptor id overflow?).\n",
vdev->name, task->req_idx); vdev->name, task->req_idx);
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
if (desc == NULL) { if (desc == NULL) {
@ -462,13 +458,11 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
while (desc && iovcnt < iovcnt_max) { while (desc && iovcnt < iovcnt_max) {
if (spdk_unlikely(!spdk_vhost_vring_desc_is_wr(desc))) { if (spdk_unlikely(!spdk_vhost_vring_desc_is_wr(desc))) {
SPDK_WARNLOG("FROM DEV cmd: descriptor nr %" PRIu16" in payload chain is read only.\n", iovcnt); SPDK_WARNLOG("FROM DEV cmd: descriptor nr %" PRIu16" in payload chain is read only.\n", iovcnt);
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vdev, iovs, &iovcnt, desc))) { if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vdev, iovs, &iovcnt, desc))) {
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
len += desc->len; len += desc->len;
@ -476,8 +470,7 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
if (spdk_unlikely(rc != 0)) { if (spdk_unlikely(rc != 0)) {
SPDK_WARNLOG("%s: invalid payload in descriptor chain starting at index %d.\n", SPDK_WARNLOG("%s: invalid payload in descriptor chain starting at index %d.\n",
vdev->name, task->req_idx); vdev->name, task->req_idx);
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
} }
} else { } else {
@ -490,16 +483,14 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
/* Process descriptors up to response. */ /* Process descriptors up to response. */
while (!spdk_vhost_vring_desc_is_wr(desc) && iovcnt < iovcnt_max) { while (!spdk_vhost_vring_desc_is_wr(desc) && iovcnt < iovcnt_max) {
if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vdev, iovs, &iovcnt, desc))) { if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vdev, iovs, &iovcnt, desc))) {
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
len += desc->len; len += desc->len;
spdk_vhost_vring_desc_get_next(&desc, desc_table, desc_table_len); spdk_vhost_vring_desc_get_next(&desc, desc_table, desc_table_len);
if (spdk_unlikely(desc == NULL)) { if (spdk_unlikely(desc == NULL)) {
SPDK_WARNLOG("TO_DEV cmd: no response descriptor.\n"); SPDK_WARNLOG("TO_DEV cmd: no response descriptor.\n");
task->resp = NULL; goto invalid_task;
goto abort_task;
} }
} }
@ -508,7 +499,8 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
if (iovcnt == iovcnt_max) { if (iovcnt == iovcnt_max) {
SPDK_WARNLOG("Too many IO vectors in chain!\n"); SPDK_WARNLOG("Too many IO vectors in chain!\n");
goto abort_task; task->resp->response = VIRTIO_SCSI_S_ABORTED;
goto invalid_task;
} }
task->scsi.iovcnt = iovcnt; task->scsi.iovcnt = iovcnt;
@ -516,11 +508,9 @@ task_data_setup(struct spdk_vhost_scsi_task *task,
task->scsi.transfer_len = len; task->scsi.transfer_len = len;
return 0; return 0;
abort_task: invalid_task:
if (task->resp) { SPDK_DEBUGLOG(SPDK_TRACE_VHOST_SCSI_DATA, "%s: Invalid task at index %"PRIu16".\n",
task->resp->response = VIRTIO_SCSI_S_ABORTED; vdev->name, task->req_idx);
}
return -1; return -1;
} }