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: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/366721 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
62eb231574
commit
d3d4a688cd
@ -301,24 +301,27 @@ invalid_request(struct spdk_vhost_task *task)
|
|||||||
task->resp ? task->resp->response : -1);
|
task->resp ? task->resp->response : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct spdk_scsi_dev *
|
static int
|
||||||
get_scsi_dev(struct spdk_vhost_scsi_dev *svdev, const __u8 *lun)
|
spdk_vhost_task_init_target(struct spdk_vhost_task *task, const __u8 *lun)
|
||||||
{
|
|
||||||
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 svdev->scsi_dev[lun[1]];
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct spdk_scsi_lun *
|
|
||||||
get_scsi_lun(struct spdk_scsi_dev *scsi_dev, const __u8 *lun)
|
|
||||||
{
|
{
|
||||||
|
struct spdk_scsi_dev *dev;
|
||||||
uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF;
|
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 */
|
SPDK_TRACEDUMP(SPDK_TRACE_VHOST_SCSI_QUEUE, "LUN", lun, 8);
|
||||||
return spdk_scsi_dev_get_lun(scsi_dev, lun_id);
|
|
||||||
|
/* First byte must be 1 and second is target */
|
||||||
|
if (lun[0] != 1 || lun[1] >= SPDK_VHOST_SCSI_CTRLR_MAX_DEVS)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
dev = task->svdev->scsi_dev[lun[1]];
|
||||||
|
if (dev == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
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,
|
SPDK_TRACEDUMP(SPDK_TRACE_VHOST_SCSI_QUEUE, "Request desriptor", (uint8_t *)ctrl_req,
|
||||||
desc->len);
|
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 */
|
/* Process the TMF request */
|
||||||
switch (ctrl_req->type) {
|
switch (ctrl_req->type) {
|
||||||
@ -358,7 +361,6 @@ process_ctrl_request(struct spdk_vhost_task *task)
|
|||||||
case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
|
case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
|
||||||
/* Handle LUN reset */
|
/* Handle LUN reset */
|
||||||
SPDK_TRACELOG(SPDK_TRACE_VHOST_SCSI_QUEUE, "LUN reset\n");
|
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);
|
mgmt_task_submit(task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
|
||||||
return;
|
return;
|
||||||
@ -511,17 +513,15 @@ process_request(struct spdk_vhost_task *task)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
task->scsi_dev = get_scsi_dev(task->svdev, req->lun);
|
result = spdk_vhost_task_init_target(task, req->lun);
|
||||||
if (unlikely(task->scsi_dev == NULL)) {
|
if (unlikely(result != 0)) {
|
||||||
task->resp->response = VIRTIO_SCSI_S_BAD_TARGET;
|
task->resp->response = VIRTIO_SCSI_S_BAD_TARGET;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
task->scsi.cdb = req->cdb;
|
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);
|
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)) {
|
if (unlikely(task->scsi.lun == NULL)) {
|
||||||
spdk_scsi_task_process_null_lun(&task->scsi);
|
spdk_scsi_task_process_null_lun(&task->scsi);
|
||||||
task->resp->response = VIRTIO_SCSI_S_OK;
|
task->resp->response = VIRTIO_SCSI_S_OK;
|
||||||
|
Loading…
Reference in New Issue
Block a user