Commit 39bdb45e authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

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: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I70cb431ab968387749ff7a5c77cd109904687797
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/474436


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarZiye Yang <ziye.yang@intel.com>
parent 0110aad7
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);
		}
	}
+0 −10
Original line number Diff line number Diff line
@@ -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;