scsi: automatically set spdk_scsi_task::type field

The type of a task is known due to the function used to submit it:
- spdk_scsi_dev_queue_task() for normal SCSI command tasks
- spdk_scsi_dev_queue_mgmt_task() for management tasks

Change-Id: I183a1f89ab85f3fce1de2491e77d95d4b147fd72
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2017-05-12 17:31:46 -07:00
parent de5ffac4ec
commit 1e7e6a618b
10 changed files with 42 additions and 34 deletions

View File

@ -3256,7 +3256,6 @@ spdk_iscsi_op_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
return SPDK_ISCSI_CONNECTION_FATAL;
}
task->scsi.type = SPDK_SCSI_TASK_TYPE_MANAGE;
spdk_iscsi_task_associate_pdu(task, pdu);
task->scsi.target_port = conn->target_port;
task->scsi.initiator_port = conn->initiator_port;

View File

@ -1064,7 +1064,6 @@ spdk_iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn,
return -1;
}
task->scsi.type = SPDK_SCSI_TASK_TYPE_MANAGE;
task->scsi.target_port = conn->target_port;
task->scsi.initiator_port = conn->initiator_port;
task->scsi.lun = lun;

View File

@ -205,6 +205,7 @@ spdk_scsi_dev_queue_mgmt_task(struct spdk_scsi_dev *dev,
{
assert(task != NULL);
task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
spdk_scsi_lun_task_mgmt_execute(task);
}
@ -214,6 +215,7 @@ spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev,
{
assert(task != NULL);
task->type = SPDK_SCSI_TASK_TYPE_CMD;
if (spdk_scsi_lun_append_task(task->lun, task) == 0) {
/* ready to execute, disk is valid for LUN access */
spdk_scsi_lun_execute_tasks(task->lun);

View File

@ -43,14 +43,18 @@ void
spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
if (lun) {
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
TAILQ_REMOVE(&lun->tasks, task, scsi_link);
}
spdk_trace_record(TRACE_SCSI_TASK_DONE, lun->dev->id, 0, (uintptr_t)task, 0);
}
spdk_event_call(task->cb_event);
}
void
spdk_scsi_lun_complete_mgmt_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
spdk_event_call(task->cb_event);
}
void
spdk_scsi_lun_clear_all(struct spdk_scsi_lun *lun)
{
@ -121,7 +125,7 @@ spdk_scsi_lun_reset(struct spdk_scsi_task *mtask, struct spdk_scsi_lun *lun)
if (!lun) {
/* LUN does not exist */
mtask->response = SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN;
spdk_scsi_lun_complete_task(NULL, mtask);
spdk_scsi_lun_complete_mgmt_task(NULL, mtask);
return -1;
}
@ -177,7 +181,7 @@ spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task)
break;
}
spdk_scsi_lun_complete_task(task->lun, task);
spdk_scsi_lun_complete_mgmt_task(task->lun, task);
return rc;
}

View File

@ -1235,22 +1235,28 @@ spdk_bdev_scsi_mode_select_page(struct spdk_bdev *bdev,
}
static void
spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
spdk_bdev_scsi_task_complete_cmd(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
void *cb_arg)
{
struct spdk_scsi_task *task = cb_arg;
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
int sc, sk, asc, ascq;
spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
} else if (task->type == SPDK_SCSI_TASK_TYPE_MANAGE) {
if (status == SPDK_BDEV_IO_STATUS_SUCCESS)
spdk_scsi_lun_complete_task(task->lun, task);
}
static void
spdk_bdev_scsi_task_complete_mgmt(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
void *cb_arg)
{
struct spdk_scsi_task *task = cb_arg;
if (status == SPDK_BDEV_IO_STATUS_SUCCESS) {
task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS;
}
spdk_scsi_lun_complete_task(task->lun, task);
spdk_scsi_lun_complete_mgmt_task(task->lun, task);
}
static int
@ -1311,7 +1317,7 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev,
task->blockdev_io = spdk_bdev_readv(bdev, task->ch, task->iovs,
task->iovcnt, offset, nbytes,
spdk_bdev_scsi_task_complete, task);
spdk_bdev_scsi_task_complete_cmd, task);
if (!task->blockdev_io) {
SPDK_ERRLOG("spdk_bdev_readv() failed\n");
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
@ -1366,7 +1372,7 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev,
offset += task->offset;
task->blockdev_io = spdk_bdev_writev(bdev, task->ch, task->iovs,
task->iovcnt, offset, task->length,
spdk_bdev_scsi_task_complete,
spdk_bdev_scsi_task_complete_cmd,
task);
if (!task->blockdev_io) {
@ -1420,7 +1426,7 @@ spdk_bdev_scsi_sync(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
}
task->blockdev_io = spdk_bdev_flush(bdev, task->ch, offset, nbytes,
spdk_bdev_scsi_task_complete, task);
spdk_bdev_scsi_task_complete_cmd, task);
if (!task->blockdev_io) {
SPDK_ERRLOG("spdk_bdev_flush() failed\n");
@ -1521,7 +1527,7 @@ spdk_bdev_scsi_unmap(struct spdk_bdev *bdev,
}
task->blockdev_io = spdk_bdev_unmap(bdev, task->ch, desc,
bdesc_count, spdk_bdev_scsi_task_complete,
bdesc_count, spdk_bdev_scsi_task_complete_cmd,
task);
if (!task->blockdev_io) {
@ -1942,5 +1948,5 @@ int
spdk_bdev_scsi_reset(struct spdk_bdev *bdev, struct spdk_scsi_task *task)
{
return spdk_bdev_reset(bdev, SPDK_BDEV_RESET_SOFT,
spdk_bdev_scsi_task_complete, task);
spdk_bdev_scsi_task_complete_mgmt, task);
}

View File

@ -130,6 +130,7 @@ int spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *
void spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task);
void spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
void spdk_scsi_lun_complete_mgmt_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
int spdk_scsi_lun_claim(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_delete(const char *lun_name);

View File

@ -84,7 +84,6 @@ spdk_scsi_task_construct(struct spdk_scsi_task *task,
if (parent != NULL) {
parent->ref++;
task->parent = parent;
task->type = parent->type;
task->dxfer_dir = parent->dxfer_dir;
task->transfer_len = parent->transfer_len;
task->lun = parent->lun;

View File

@ -475,7 +475,6 @@ process_ctrl_request(struct spdk_vhost_scsi_ctrlr *vdev, struct rte_vhost_vring
case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
/* Handle LUN reset */
SPDK_TRACELOG(SPDK_TRACE_VHOST_QUEUE, "LUN reset\n");
task->scsi.type = SPDK_SCSI_TASK_TYPE_MANAGE;
task->scsi.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
task->scsi.lun = get_scsi_lun(task->scsi_dev, ctrl_req->lun);

View File

@ -271,7 +271,6 @@ lun_task_mgmt_execute_abort_task_not_supported(void)
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
mgmt_task->function = SPDK_SCSI_TASK_FUNC_ABORT_TASK;
mgmt_task->lun = lun;
mgmt_task->initiator_port = &initiator_port;
@ -342,7 +341,6 @@ lun_task_mgmt_execute_abort_task_all_not_supported(void)
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
mgmt_task->function = SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET;
mgmt_task->lun = lun;
mgmt_task->initiator_port = &initiator_port;
@ -384,7 +382,6 @@ lun_task_mgmt_execute_lun_reset_failure(void)
int rc;
mgmt_task = spdk_get_task(NULL);
mgmt_task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
mgmt_task->lun = NULL;
mgmt_task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
@ -410,7 +407,6 @@ lun_task_mgmt_execute_lun_reset(void)
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
mgmt_task->lun = lun;
mgmt_task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
@ -438,7 +434,6 @@ lun_task_mgmt_execute_invalid_case(void)
lun->dev = &dev;
mgmt_task = spdk_get_task(NULL);
mgmt_task->type = SPDK_SCSI_TASK_TYPE_MANAGE;
/* Pass an invalid value to the switch statement */
mgmt_task->function = 5;

View File

@ -131,6 +131,11 @@ spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *ta
{
}
void
spdk_scsi_lun_complete_mgmt_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)
{
}
static void
spdk_put_task(struct spdk_scsi_task *task)
{
@ -553,9 +558,8 @@ task_complete_test(void)
TAILQ_INSERT_TAIL(&lun.tasks, &task, scsi_link);
task.lun = &lun;
task.type = SPDK_SCSI_TASK_TYPE_CMD;
bdev_io.status = SPDK_BDEV_IO_STATUS_SUCCESS;
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
spdk_bdev_scsi_task_complete_cmd(&bdev_io, bdev_io.status, &task);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
bdev_io.status = SPDK_BDEV_IO_STATUS_SCSI_ERROR;
@ -563,14 +567,14 @@ task_complete_test(void)
bdev_io.error.scsi.sk = SPDK_SCSI_SENSE_HARDWARE_ERROR;
bdev_io.error.scsi.asc = SPDK_SCSI_ASC_WARNING;
bdev_io.error.scsi.ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
spdk_bdev_scsi_task_complete_cmd(&bdev_io, bdev_io.status, &task);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_HARDWARE_ERROR);
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_WARNING);
CU_ASSERT_EQUAL(task.sense_data[13], SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED);
bdev_io.status = SPDK_BDEV_IO_STATUS_FAILED;
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
spdk_bdev_scsi_task_complete_cmd(&bdev_io, bdev_io.status, &task);
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_ABORTED_COMMAND);
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);