From 8d081e74c12d1aebd25d925c23e5a3f71b24f470 Mon Sep 17 00:00:00 2001 From: Sochin Jiang Date: Mon, 7 Sep 2020 15:16:32 +0800 Subject: [PATCH] lib/iscsi: fix another assertion failure of 'assert(task->ref > 0)' In high read IO pressure, there is a loop call of process_completed_read_subtask_list() while calling spdk_iscsi_task_response(), this cause 'primary->bytes_completed' changes, in turn cause multiple calls of 'spdk_iscsi_task_put(primary)', assertion failes in spdk_scsi_task_put(). Signed-off-by: Sochin Jiang Change-Id: I41d02d318f827f3bb3ad9ba3a06e080b5113cd40 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4083 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker Community-CI: Mellanox Build Bot --- lib/iscsi/conn.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 5e3769eec..cd0a179f4 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -1088,16 +1088,15 @@ process_completed_read_subtask_list(struct spdk_iscsi_conn *conn, if (subtask->scsi.offset == primary->bytes_completed) { TAILQ_REMOVE(&primary->subtask_list, subtask, subtask_link); primary->bytes_completed += subtask->scsi.length; + if (primary->bytes_completed == primary->scsi.transfer_len) { + iscsi_task_put(primary); + } iscsi_task_response(conn, subtask); iscsi_task_put(subtask); } else { break; } } - - if (primary->bytes_completed == primary->scsi.transfer_len) { - iscsi_task_put(primary); - } } static void