From 476b1b0fc9f86028e4f549eb563f91ae05073408 Mon Sep 17 00:00:00 2001 From: Ziye Yang Date: Tue, 31 Jul 2018 18:08:27 +0800 Subject: [PATCH] lib/iscsi: fix the queued_datain_task hanlding issue. Due to the network issue, spdk_iscsi_conn_free_pdu in spdk_iscsi_conn_flush_pdus_internal will not be executed. So consider the pdu free, we should call spdk_iscsi_conn_free_pdu in spdk_iscsi_conn_free_tasks. Actually, for the task which in queued_datain_task, we have the following case: 1 The task is not sent to the scsi layer: it means that the task is not freed, so we should call spdk_iscsi_task_put here. 2 The task is sent to the scsi layer, but no subtasks are sent to the scsi layer: It means that the call back function (spdk_iscsi_task_cpl) will be called, but since it will have the subtask, so spdk_iscsi_task_put will not be called, thus, we should call spdk_iscsi_task_put here. 3 The task is sent to the scsi layer, and some subtasks are also sent to the scsi layer: It also mean that the spdk_iscsi_task_put will not be called in spdk_iscsi_task_cpl, and not all the subtasks will be finished, so the father task will not be freed, so we should still call spdk_iscsi_task_put here. 4 The task is sent to the scsi layer, and all the subtasks are also sent to the scsi layer, thus this task is not in the queued_data_in_task. So according to 1-4, we should call spdk_iscsi_task_put here, and also decrease the data_in_cnt; Change-Id: Icb13df1ae07f6eea0247d45f4a0397edc4aa2500 Signed-off-by: Ziye Yang Reviewed-on: https://review.gerrithub.io/420875 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu --- lib/iscsi/conn.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 00c3f27c0..5a0858c00 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -364,10 +364,7 @@ static int spdk_iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn) TAILQ_FOREACH_SAFE(pdu, &conn->write_pdu_list, tailq, tmp_pdu) { TAILQ_REMOVE(&conn->write_pdu_list, pdu, tailq); - if (pdu->task) { - spdk_iscsi_task_put(pdu->task); - } - spdk_put_pdu(pdu); + spdk_iscsi_conn_free_pdu(conn, pdu); } TAILQ_FOREACH_SAFE(pdu, &conn->snack_pdu_list, tailq, tmp_pdu) { @@ -380,9 +377,7 @@ 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); - pdu = iscsi_task->pdu; spdk_iscsi_task_put(iscsi_task); - spdk_put_pdu(pdu); } if (conn->pending_task_cnt) {