diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index fd05eabe0..2978ddc21 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -160,7 +160,6 @@ struct spdk_scsi_task { uint32_t *owner_task_ctr; uint32_t abort_id; - TAILQ_HEAD(subtask_list, spdk_scsi_task) subtask_list; }; struct spdk_scsi_port; diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index da7dcd000..6719e520b 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -868,15 +868,15 @@ static void process_completed_read_subtask_list(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *primary) { - struct spdk_scsi_task *tmp; + struct spdk_iscsi_task *tmp; - while (!TAILQ_EMPTY(&primary->scsi.subtask_list)) { - tmp = TAILQ_FIRST(&primary->scsi.subtask_list); - if (tmp->offset == primary->scsi.bytes_completed) { - TAILQ_REMOVE(&primary->scsi.subtask_list, tmp, scsi_link); - primary->scsi.bytes_completed += tmp->length; - spdk_iscsi_task_response(conn, (struct spdk_iscsi_task *)tmp); - spdk_iscsi_task_put((struct spdk_iscsi_task *)tmp); + while (!TAILQ_EMPTY(&primary->subtask_list)) { + tmp = TAILQ_FIRST(&primary->subtask_list); + if (tmp->scsi.offset == primary->scsi.bytes_completed) { + TAILQ_REMOVE(&primary->subtask_list, tmp, subtask_link); + primary->scsi.bytes_completed += tmp->scsi.length; + spdk_iscsi_task_response(conn, tmp); + spdk_iscsi_task_put(tmp); } else { break; } @@ -888,20 +888,20 @@ process_read_task_completion(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task, struct spdk_iscsi_task *primary) { - struct spdk_scsi_task *tmp; + struct spdk_iscsi_task *tmp; bool flag = false; if ((task != primary) && (task->scsi.offset != primary->scsi.bytes_completed)) { - TAILQ_FOREACH(tmp, &primary->scsi.subtask_list, scsi_link) { - if (task->scsi.offset < tmp->offset) { - TAILQ_INSERT_BEFORE(tmp, &task->scsi, scsi_link); + TAILQ_FOREACH(tmp, &primary->subtask_list, link) { + if (task->scsi.offset < tmp->scsi.offset) { + TAILQ_INSERT_BEFORE(tmp, task, subtask_link); flag = true; break; } } if (!flag) { - TAILQ_INSERT_TAIL(&primary->scsi.subtask_list, &task->scsi, scsi_link); + TAILQ_INSERT_TAIL(&primary->subtask_list, task, subtask_link); } return; } diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 38e216d08..fe0d980d7 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -2901,7 +2901,7 @@ static int spdk_iscsi_op_scsi_read(struct spdk_iscsi_conn *conn, { int32_t remaining_size = 0; - TAILQ_INIT(&task->scsi.subtask_list); + TAILQ_INIT(&task->subtask_list); task->scsi.dxfer_dir = SPDK_SCSI_DIR_FROM_DEV; task->scsi.parent = NULL; task->scsi.offset = 0; diff --git a/lib/iscsi/task.h b/lib/iscsi/task.h index e54ee371b..2b782e565 100644 --- a/lib/iscsi/task.h +++ b/lib/iscsi/task.h @@ -75,6 +75,9 @@ struct spdk_iscsi_task { uint32_t ttt; TAILQ_ENTRY(spdk_iscsi_task) link; + + TAILQ_HEAD(subtask_list, spdk_iscsi_task) subtask_list; + TAILQ_ENTRY(spdk_iscsi_task) subtask_link; }; static inline void