From 3c4dfbd339a9cf6744e0b41f8e3b492a555cee09 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 15 Nov 2019 13:22:52 +0900 Subject: [PATCH] lib/iscsi: Assert if conn->data_in_cnt goes negative or is left positive During testing, we observed both conn->data_in_cnt went negative or was left positive unexpectedly. Hence add assert to detect both cases. Signed-off-by: Ziye Yang Signed-off-by: Shuhei Matsumoto Change-Id: I102d4eb7c8beb0e56b6a46fd0f85b3eb1c447da5 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/474437 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/iscsi/conn.c | 6 ++++++ lib/iscsi/iscsi.c | 1 + 2 files changed, 7 insertions(+) diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 618170e53..40dcc1782 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -310,9 +310,11 @@ spdk_iscsi_conn_free_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pd primary = spdk_iscsi_task_get_primary(pdu->task); if (pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) { if (pdu->task->scsi.offset > 0) { + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; if (pdu->bhs.flags & ISCSI_DATAIN_STATUS) { /* Free the primary task after the last subtask done */ + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; spdk_iscsi_task_put(primary); } @@ -324,6 +326,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 */ + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; spdk_iscsi_task_put(primary); } @@ -358,6 +361,7 @@ iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn) if (!iscsi_task->is_queued) { TAILQ_REMOVE(&conn->queued_datain_tasks, iscsi_task, link); if (iscsi_task->current_datain_offset > 0) { + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; } spdk_iscsi_task_put(iscsi_task); @@ -517,6 +521,7 @@ _iscsi_conn_remove_lun(void *_ctx) 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) { + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; } spdk_iscsi_task_put(iscsi_task); @@ -587,6 +592,7 @@ iscsi_conn_stop(struct spdk_iscsi_conn *conn) struct spdk_iscsi_tgt_node *target; assert(conn->state == ISCSI_CONN_STATE_EXITED); + assert(conn->data_in_cnt == 0); if (conn->sess != NULL && conn->sess->session_type == SESSION_TYPE_NORMAL && diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 08add39b4..f43ea8e80 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -3025,6 +3025,7 @@ iscsi_transfer_in(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task) if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) { if (task != primary) { + assert(conn->data_in_cnt > 0); conn->data_in_cnt--; }