From e45437aba795d161ab25435593d210d269e1e836 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Thu, 4 Jan 2018 14:03:34 -0700 Subject: [PATCH] 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: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/393697 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu Reviewed-by: --- include/spdk/scsi.h | 14 +------------- lib/iscsi/iscsi.c | 6 +++--- lib/iscsi/task.c | 16 ++++++++++++++-- lib/iscsi/task.h | 13 +++++++------ lib/scsi/task.c | 19 +------------------ lib/vhost/vhost_scsi.c | 5 ++--- test/unit/lib/scsi/lun.c/lun_ut.c | 3 +-- .../lib/vhost/vhost_scsi.c/vhost_scsi_ut.c | 2 +- 8 files changed, 30 insertions(+), 48 deletions(-) diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index 85e80a22d..46ae988fd 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -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 diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index cd5eb0710..c58693260 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -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); diff --git a/lib/iscsi/task.c b/lib/iscsi/task.c index b8e075b85..6b56cd978 100644 --- a/lib/iscsi/task.c +++ b/lib/iscsi/task.c @@ -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; diff --git a/lib/iscsi/task.h b/lib/iscsi/task.h index 127f94135..8e6f7e04e 100644 --- a/lib/iscsi/task.h +++ b/lib/iscsi/task.h @@ -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 */ diff --git a/lib/scsi/task.c b/lib/scsi/task.c index ce1b86217..72546c2ec 100644 --- a/lib/scsi/task.c +++ b/lib/scsi/task.c @@ -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 diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 963fb3e6a..38fb20e37 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -307,8 +307,7 @@ process_ctrl_request(struct spdk_vhost_scsi_task *task) uint32_t desc_table_size; int rc; - spdk_scsi_task_construct(&task->scsi, spdk_vhost_scsi_task_mgmt_cpl, spdk_vhost_scsi_task_free_cb, - NULL); + spdk_scsi_task_construct(&task->scsi, spdk_vhost_scsi_task_mgmt_cpl, spdk_vhost_scsi_task_free_cb); rc = spdk_vhost_vq_get_desc(vdev, task->vq, task->req_idx, &desc, &desc_table, &desc_table_size); if (spdk_unlikely(rc != 0)) { SPDK_ERRLOG("%s: Invalid controlq descriptor at index %d.\n", @@ -403,7 +402,7 @@ task_data_setup(struct spdk_vhost_scsi_task *task, uint32_t desc_table_len, len = 0; int rc; - spdk_scsi_task_construct(&task->scsi, spdk_vhost_scsi_task_cpl, spdk_vhost_scsi_task_free_cb, NULL); + spdk_scsi_task_construct(&task->scsi, spdk_vhost_scsi_task_cpl, spdk_vhost_scsi_task_free_cb); rc = spdk_vhost_vq_get_desc(vdev, task->vq, task->req_idx, &desc, &desc_table, &desc_table_len); /* First descriptor must be readable */ diff --git a/test/unit/lib/scsi/lun.c/lun_ut.c b/test/unit/lib/scsi/lun.c/lun_ut.c index 3a86f5d68..611296698 100644 --- a/test/unit/lib/scsi/lun.c/lun_ut.c +++ b/test/unit/lib/scsi/lun.c/lun_ut.c @@ -96,8 +96,7 @@ ut_init_task(struct spdk_scsi_task *task) { memset(task, 0, sizeof(*task)); spdk_scsi_task_construct(task, spdk_lun_ut_cpl_task, - spdk_lun_ut_free_task, - NULL); + spdk_lun_ut_free_task); g_task_count++; } diff --git a/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c b/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c index 5e03d4018..9eef75e93 100644 --- a/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c +++ b/test/unit/lib/vhost/vhost_scsi.c/vhost_scsi_ut.c @@ -58,7 +58,7 @@ DEFINE_STUB_V(spdk_scsi_dev_queue_mgmt_task, (struct spdk_scsi_dev *dev, DEFINE_STUB_P(spdk_scsi_dev_find_port_by_id, struct spdk_scsi_port, (struct spdk_scsi_dev *dev, uint64_t id), {0}); DEFINE_STUB_V(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)); DEFINE_STUB_P(spdk_scsi_dev_get_lun, struct spdk_scsi_lun, (struct spdk_scsi_dev *dev, int lun_id), {0}); DEFINE_STUB_V(spdk_scsi_task_process_null_lun, (struct spdk_scsi_task *task)); DEFINE_STUB_P(spdk_scsi_lun_get_dev, const struct spdk_scsi_dev, (const struct spdk_scsi_lun *lun), {0});