From 39bdb45ed8e4e719df23510cc8d06d87aeae6977 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 15 Nov 2019 13:07:39 +0900 Subject: [PATCH] lib/iscsi: Decrement conn->data_in_cnt of primary correctly for LUN hotplug We had not decremented conn->data_in_cnt when the primary is removed from conn->queued_datain_tasks after submitting it. If we simply add decrement into iscsi_conn_free_tasks() and _iscsi_conn_remove_lun(), it conflicts with iscsi_transfer_in(). By recent refinements, primary is freed in either spdk_iscsi_conn_free_pdu() or iscsi_conn_free_tasks()/_iscsi_conn_remove_lun(). Hence let's make decrement of conn->data_in_cnt for primary follow the management of primary. In iscsi_conn_free_tasks()/_iscsi_conn_remove_lun(), if primary->current_datain_offset, conn->data_in_cnt is incremented, and hence decrement it. In spdk_iscsi_conn_free_pdu(), if primary and all subtasks are completed, decrement conn->data_in_cnt. This patch will fix the issue that conn->data_in_cnt ls still positive even after all tasks are freed when removing LUN dynamically. Signed-off-by: Shuhei Matsumoto Change-Id: I70cb431ab968387749ff7a5c77cd109904687797 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/474436 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Ziye Yang --- lib/iscsi/conn.c | 7 +++++++ lib/iscsi/iscsi.c | 10 ---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index b90da6ce3..618170e53 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -324,6 +324,7 @@ spdk_iscsi_conn_free_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pd if (spdk_iscsi_task_is_read(primary)) { if (primary->bytes_completed == primary->scsi.transfer_len) { /* Free the primary task after the last subtask done */ + conn->data_in_cnt--; spdk_iscsi_task_put(primary); } } @@ -356,6 +357,9 @@ iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn) TAILQ_FOREACH_SAFE(iscsi_task, &conn->queued_datain_tasks, link, tmp_iscsi_task) { if (!iscsi_task->is_queued) { TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link); + if (iscsi_task->current_datain_offset > 0) { + conn->data_in_cnt--; + } spdk_iscsi_task_put(iscsi_task); } } @@ -512,6 +516,9 @@ _iscsi_conn_remove_lun(void *_ctx) TAILQ_FOREACH_SAFE(iscsi_task, &conn->queued_datain_tasks, link, tmp_iscsi_task) { if ((!iscsi_task->is_queued) && (lun == iscsi_task->scsi.lun)) { TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link); + if (iscsi_task->current_datain_offset > 0) { + conn->data_in_cnt--; + } spdk_iscsi_task_put(iscsi_task); } } diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 754c4d4a5..08add39b4 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -3026,16 +3026,6 @@ iscsi_transfer_in(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task) if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) { if (task != primary) { conn->data_in_cnt--; - /* Handle the case when primary task return success but the subtask failed */ - if (primary->bytes_completed == primary->scsi.transfer_len && - primary->scsi.status == SPDK_SCSI_STATUS_GOOD) { - conn->data_in_cnt--; - } - } else { - /* handle the case that it is a primary task which has subtasks */ - if (primary->scsi.transfer_len != primary->scsi.length) { - conn->data_in_cnt--; - } } return 0;