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 <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/393697
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Daniel Verkamp 2018-01-04 14:03:34 -07:00 committed by Jim Harris
parent 5e0ac51043
commit e45437aba7
8 changed files with 30 additions and 48 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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 */

View File

@ -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

View File

@ -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 */

View File

@ -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++;
}

View File

@ -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});