diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 5a0858c00..57964c285 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -376,8 +376,10 @@ static int spdk_iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn) } TAILQ_FOREACH_SAFE(iscsi_task, &conn->queued_datain_tasks, link, tmp_iscsi_task) { - TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link); - spdk_iscsi_task_put(iscsi_task); + if (!iscsi_task->is_queued) { + TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link); + spdk_iscsi_task_put(iscsi_task); + } } if (conn->pending_task_cnt) { @@ -883,6 +885,7 @@ spdk_iscsi_task_cpl(struct spdk_scsi_task *scsi_task) spdk_trace_record(TRACE_ISCSI_TASK_DONE, conn->id, 0, (uintptr_t)task, 0); + task->is_queued = false; primary = spdk_iscsi_task_get_primary(task); if (spdk_iscsi_task_is_read(primary)) { diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 90eabe647..c876060c2 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -2816,6 +2816,7 @@ static void spdk_iscsi_queue_task(struct spdk_iscsi_conn *conn, { spdk_trace_record(TRACE_ISCSI_TASK_QUEUE, conn->id, task->scsi.length, (uintptr_t)task, (uintptr_t)task->pdu); + task->is_queued = true; spdk_scsi_dev_queue_task(conn->dev, &task->scsi); } diff --git a/lib/iscsi/task.h b/lib/iscsi/task.h index 0fee4cda2..fea928ac6 100644 --- a/lib/iscsi/task.h +++ b/lib/iscsi/task.h @@ -97,6 +97,7 @@ struct spdk_iscsi_task { TAILQ_HEAD(subtask_list, spdk_iscsi_task) subtask_list; TAILQ_ENTRY(spdk_iscsi_task) subtask_link; + bool is_queued; /* is queued in scsi layer for handling */ }; static inline void