diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index e8323f415..97314a59c 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -305,15 +305,8 @@ void spdk_iscsi_conn_free_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *pdu) { if (pdu->task) { - if (pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) { - if (pdu->task != spdk_iscsi_task_get_primary(pdu->task)) { - assert(conn->data_in_cnt > 0); - conn->data_in_cnt--; - spdk_iscsi_conn_handle_queued_datain_tasks(conn); - } - } - spdk_iscsi_task_put(pdu->task); + spdk_iscsi_conn_handle_queued_datain_tasks(conn); } spdk_put_pdu(pdu); } @@ -348,10 +341,6 @@ _iscsi_conn_free_tasks(struct spdk_iscsi_conn *conn, struct spdk_scsi_lun *lun) TAILQ_FOREACH_SAFE(iscsi_task, &conn->queued_datain_tasks, link, tmp_iscsi_task) { if ((!iscsi_task->is_queued) && (lun == NULL || 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); } } diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 27e0afa29..bfe2fb960 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -3035,10 +3035,6 @@ iscsi_transfer_in(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task) transfer_len = task->scsi.length; if (task->scsi.status != SPDK_SCSI_STATUS_GOOD) { - if (task != primary) { - assert(conn->data_in_cnt > 0); - conn->data_in_cnt--; - } return 0; } @@ -3261,7 +3257,6 @@ int spdk_iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn) assert(subtask != NULL); subtask->scsi.offset = task->current_datain_offset; spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); - conn->data_in_cnt++; if (spdk_scsi_dev_get_lun(conn->dev, task->lun_id) == NULL) { /* Stop submitting split read I/Os for remaining data. */ @@ -3604,7 +3599,6 @@ _iscsi_conn_abort_queued_datain_task(struct spdk_iscsi_conn *conn, subtask->scsi.length = DMIN32(SPDK_BDEV_LARGE_BUF_MAX_SIZE, remaining_size); spdk_scsi_task_set_data(&subtask->scsi, NULL, 0); task->current_datain_offset += subtask->scsi.length; - conn->data_in_cnt++; subtask->scsi.transfer_len = subtask->scsi.length; spdk_scsi_task_process_abort(&subtask->scsi); diff --git a/lib/iscsi/task.c b/lib/iscsi/task.c index 93fa4b1bf..40e6f9fd8 100644 --- a/lib/iscsi/task.c +++ b/lib/iscsi/task.c @@ -43,6 +43,11 @@ iscsi_task_free(struct spdk_scsi_task *scsi_task) struct spdk_iscsi_task *task = spdk_iscsi_task_from_scsi_task(scsi_task); if (task->parent) { + if (task->scsi.dxfer_dir == SPDK_SCSI_DIR_FROM_DEV) { + assert(task->conn->data_in_cnt > 0); + task->conn->data_in_cnt--; + } + spdk_scsi_task_put(&task->parent->scsi); task->parent = NULL; } @@ -65,6 +70,7 @@ spdk_iscsi_task_get(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *parent abort(); } + assert(conn != NULL); memset(task, 0, sizeof(*task)); task->conn = conn; assert(conn->pending_task_cnt < UINT32_MAX); @@ -83,6 +89,9 @@ spdk_iscsi_task_get(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *parent task->scsi.cdb = parent->scsi.cdb; task->scsi.target_port = parent->scsi.target_port; task->scsi.initiator_port = parent->scsi.initiator_port; + if (task->scsi.dxfer_dir == SPDK_SCSI_DIR_FROM_DEV) { + conn->data_in_cnt++; + } } return task; diff --git a/test/unit/lib/iscsi/common.c b/test/unit/lib/iscsi/common.c index a29b39cc6..2ae3ada79 100644 --- a/test/unit/lib/iscsi/common.c +++ b/test/unit/lib/iscsi/common.c @@ -48,6 +48,9 @@ spdk_iscsi_task_get(struct spdk_iscsi_conn *conn, task->scsi.cdb = parent->scsi.cdb; task->scsi.target_port = parent->scsi.target_port; task->scsi.initiator_port = parent->scsi.initiator_port; + if (conn && (task->scsi.dxfer_dir == SPDK_SCSI_DIR_FROM_DEV)) { + conn->data_in_cnt++; + } } task->scsi.iovs = &task->scsi.iov; diff --git a/test/unit/lib/iscsi/conn.c/conn_ut.c b/test/unit/lib/iscsi/conn.c/conn_ut.c index 0eeb84de3..c4cf65578 100644 --- a/test/unit/lib/iscsi/conn.c/conn_ut.c +++ b/test/unit/lib/iscsi/conn.c/conn_ut.c @@ -162,7 +162,6 @@ DEFINE_STUB(spdk_del_transfer_task, bool, int spdk_iscsi_conn_handle_queued_datain_tasks(struct spdk_iscsi_conn *conn) { - CU_ASSERT(TAILQ_EMPTY(&conn->write_pdu_list)); return 0; }