Commit d3d4a688 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

vhost_scsi: added spdk_vhost_task_init_target()



Removed get_scsi_dev and get_scsi_lun functions, moved virtio lun field
parsing into a single function.

Change-Id: I2d1588491e0aee523b053d8ea49fdc6bb7f90613
Signed-off-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/366721


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 62eb2315
Loading
Loading
Loading
Loading
+18 −18
Original line number Diff line number Diff line
@@ -301,24 +301,27 @@ invalid_request(struct spdk_vhost_task *task)
		      task->resp ? task->resp->response : -1);
}

static struct spdk_scsi_dev *
get_scsi_dev(struct spdk_vhost_scsi_dev *svdev, const __u8 *lun)
static int
spdk_vhost_task_init_target(struct spdk_vhost_task *task, const __u8 *lun)
{
	struct spdk_scsi_dev *dev;
	uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF;

	SPDK_TRACEDUMP(SPDK_TRACE_VHOST_SCSI_QUEUE, "LUN", lun, 8);

	/* First byte must be 1 and second is target */
	if (lun[0] != 1 || lun[1] >= SPDK_VHOST_SCSI_CTRLR_MAX_DEVS)
		return NULL;
		return -1;

	return svdev->scsi_dev[lun[1]];
	dev = task->svdev->scsi_dev[lun[1]];
	if (dev == NULL) {
		return -1;
	}

static struct spdk_scsi_lun *
get_scsi_lun(struct spdk_scsi_dev *scsi_dev, const __u8 *lun)
{
	uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF;

	/* For now only one LUN per controller is allowed so no need to search LUN IDs */
	return spdk_scsi_dev_get_lun(scsi_dev, lun_id);
	task->scsi_dev = dev;
	task->scsi.target_port = spdk_scsi_dev_find_port_by_id(task->scsi_dev, 0);
	task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_id);
	return 0;
}

static void
@@ -338,7 +341,7 @@ process_ctrl_request(struct spdk_vhost_task *task)
	SPDK_TRACEDUMP(SPDK_TRACE_VHOST_SCSI_QUEUE, "Request desriptor", (uint8_t *)ctrl_req,
		       desc->len);

	task->scsi_dev = get_scsi_dev(task->svdev, ctrl_req->lun);
	spdk_vhost_task_init_target(task, ctrl_req->lun);

	/* Process the TMF request */
	switch (ctrl_req->type) {
@@ -358,7 +361,6 @@ process_ctrl_request(struct spdk_vhost_task *task)
		case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
			/* Handle LUN reset */
			SPDK_TRACELOG(SPDK_TRACE_VHOST_SCSI_QUEUE, "LUN reset\n");
			task->scsi.lun = get_scsi_lun(task->scsi_dev, ctrl_req->lun);

			mgmt_task_submit(task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
			return;
@@ -511,17 +513,15 @@ process_request(struct spdk_vhost_task *task)
		return result;
	}

	task->scsi_dev = get_scsi_dev(task->svdev, req->lun);
	if (unlikely(task->scsi_dev == NULL)) {
	result = spdk_vhost_task_init_target(task, req->lun);
	if (unlikely(result != 0)) {
		task->resp->response = VIRTIO_SCSI_S_BAD_TARGET;
		return -1;
	}

	task->scsi.cdb = req->cdb;
	task->scsi.target_port = spdk_scsi_dev_find_port_by_id(task->scsi_dev, 0);
	SPDK_TRACEDUMP(SPDK_TRACE_VHOST_SCSI_DATA, "request CDB", req->cdb, VIRTIO_SCSI_CDB_SIZE);

	task->scsi.lun = get_scsi_lun(task->scsi_dev, req->lun);
	if (unlikely(task->scsi.lun == NULL)) {
		spdk_scsi_task_process_null_lun(&task->scsi);
		task->resp->response = VIRTIO_SCSI_S_OK;