Commit e45437ab authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

scsi, iscsi: move task->parent to iSCSI task



The SCSI layer no longer needs to know about the parent/subtask
relationship maintained by iSCSI.

Change-Id: Ia6f7c5367c5b656bd7521ed1abb6d0f713a0500b
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/393697


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatar <shuhei.matsumoto.xt@hitachi.com>
parent 5e0ac510
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -120,7 +120,6 @@ struct spdk_scsi_task {
	uint32_t data_transferred;

	uint64_t offset;
	struct spdk_scsi_task *parent;

	uint8_t *cdb;

@@ -219,8 +218,7 @@ const char *spdk_scsi_port_get_name(const struct spdk_scsi_port *port);

void spdk_scsi_task_construct(struct spdk_scsi_task *task,
			      spdk_scsi_task_cpl cpl_fn,
			      spdk_scsi_task_free free_fn,
			      struct spdk_scsi_task *parent);
			      spdk_scsi_task_free free_fn);
void spdk_scsi_task_put(struct spdk_scsi_task *task);

void spdk_scsi_task_free_data(struct spdk_scsi_task *task);
@@ -255,16 +253,6 @@ void spdk_scsi_task_set_status(struct spdk_scsi_task *task, int sc, int sk, int
			       int ascq);
void spdk_scsi_task_process_null_lun(struct spdk_scsi_task *task);

static inline struct spdk_scsi_task *
spdk_scsi_task_get_primary(struct spdk_scsi_task *task)
{
	if (task->parent) {
		return task->parent;
	} else {
		return task;
	}
}

#ifdef __cplusplus
}
#endif
+3 −3
Original line number Diff line number Diff line
@@ -2707,7 +2707,7 @@ spdk_iscsi_send_datain(struct spdk_iscsi_conn *conn,
	}
	DataSN++;

	if (task->scsi.parent) {
	if (task->parent) {
		offset += primary->scsi.data_transferred;
	}
	to_be32(&rsph->buffer_offset, (uint32_t)offset);
@@ -2949,7 +2949,7 @@ static int spdk_iscsi_op_scsi_read(struct spdk_iscsi_conn *conn,

	TAILQ_INIT(&task->subtask_list);
	task->scsi.dxfer_dir = SPDK_SCSI_DIR_FROM_DEV;
	task->scsi.parent = NULL;
	task->parent = NULL;
	task->scsi.offset = 0;
	task->scsi.length = DMIN32(SPDK_BDEV_LARGE_BUF_MAX_SIZE, task->scsi.transfer_len);
	spdk_scsi_task_set_data(&task->scsi, NULL, 0);
@@ -3020,7 +3020,7 @@ spdk_iscsi_op_scsi(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu)
	task->scsi.transfer_len = transfer_len;
	task->scsi.target_port = conn->target_port;
	task->scsi.initiator_port = conn->initiator_port;
	task->scsi.parent = NULL;
	task->parent = NULL;

	if (task->scsi.lun == NULL) {
		spdk_scsi_task_process_null_lun(&task->scsi);
+14 −2
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ spdk_iscsi_task_free(struct spdk_scsi_task *scsi_task)
{
	struct spdk_iscsi_task *task = spdk_iscsi_task_from_scsi_task(scsi_task);

	if (task->parent) {
		spdk_scsi_task_put(&task->parent->scsi);
		task->parent = NULL;
	}

	spdk_iscsi_task_disassociate_pdu(task);
	assert(task->conn->pending_task_cnt > 0);
	task->conn->pending_task_cnt--;
@@ -66,10 +71,17 @@ spdk_iscsi_task_get(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *parent
	conn->pending_task_cnt++;
	spdk_scsi_task_construct(&task->scsi,
				 cpl_fn,
				 spdk_iscsi_task_free,
				 parent ? &parent->scsi : NULL);
				 spdk_iscsi_task_free);
	if (parent) {
		parent->scsi.ref++;
		task->parent = parent;
		task->tag = parent->tag;
		task->scsi.dxfer_dir = parent->scsi.dxfer_dir;
		task->scsi.transfer_len = parent->scsi.transfer_len;
		task->scsi.lun = parent->scsi.lun;
		task->scsi.cdb = parent->scsi.cdb;
		task->scsi.target_port = parent->scsi.target_port;
		task->scsi.initiator_port = parent->scsi.initiator_port;
	}

	return task;
+7 −6
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@
struct spdk_iscsi_task {
	struct spdk_scsi_task	scsi;

	struct spdk_iscsi_task *parent;

	struct spdk_iscsi_conn *conn;
	struct spdk_iscsi_pdu *pdu;
	uint32_t outstanding_r2t;
@@ -173,12 +175,11 @@ spdk_iscsi_task_from_scsi_task(struct spdk_scsi_task *task)
static inline struct spdk_iscsi_task *
spdk_iscsi_task_get_primary(struct spdk_iscsi_task *task)
{
	struct spdk_scsi_task *scsi_task;
	struct spdk_scsi_task *scsi_primary_task;

	scsi_task = &task->scsi;
	scsi_primary_task = spdk_scsi_task_get_primary(scsi_task);
	return spdk_iscsi_task_from_scsi_task(scsi_primary_task);
	if (task->parent) {
		return task->parent;
	} else {
		return task;
	}
}

#endif /* SPDK_ISCSI_TASK_H */
+1 −18
Original line number Diff line number Diff line
@@ -49,11 +49,6 @@ spdk_scsi_task_put(struct spdk_scsi_task *task)
	if (task->ref == 0) {
		struct spdk_bdev_io *bdev_io = task->bdev_io;

		if (task->parent) {
			spdk_scsi_task_put(task->parent);
			task->parent = NULL;
		}

		if (bdev_io) {
			spdk_bdev_free_io(bdev_io);
		}
@@ -67,8 +62,7 @@ spdk_scsi_task_put(struct spdk_scsi_task *task)
void
spdk_scsi_task_construct(struct spdk_scsi_task *task,
			 spdk_scsi_task_cpl cpl_fn,
			 spdk_scsi_task_free free_fn,
			 struct spdk_scsi_task *parent)
			 spdk_scsi_task_free free_fn)
{
	assert(task != NULL);
	assert(cpl_fn != NULL);
@@ -85,17 +79,6 @@ spdk_scsi_task_construct(struct spdk_scsi_task *task,
	assert(task->iov.iov_base == NULL);
	task->iovs = &task->iov;
	task->iovcnt = 1;

	if (parent != NULL) {
		parent->ref++;
		task->parent = parent;
		task->dxfer_dir = parent->dxfer_dir;
		task->transfer_len = parent->transfer_len;
		task->lun = parent->lun;
		task->cdb = parent->cdb;
		task->target_port = parent->target_port;
		task->initiator_port = parent->initiator_port;
	}
}

void
Loading