Commit 1e7e6a61 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

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: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent de5ffac4
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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;
+0 −1
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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);
+9 −5
Original line number Diff line number Diff line
@@ -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;
}
+22 −16
Original line number Diff line number Diff line
@@ -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);
}
Loading