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:
parent
5e0ac51043
commit
e45437aba7
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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++;
|
||||
}
|
||||
|
||||
|
@ -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});
|
||||
|
Loading…
Reference in New Issue
Block a user