Commit cc79da30 authored by Mike Christie's avatar Mike Christie Committed by Martin K. Petersen
Browse files

scsi: target: iscsit: Fix TAS handling during conn cleanup



Fix a bug added in commit f3619935 ("scsi: target: iscsi: Fix cmd abort
fabric stop race").

If CMD_T_TAS is set on the se_cmd we must call iscsit_free_cmd() to do the
last put on the cmd and free it, because the connection is down and we will
not up sending the response and doing the put from the normal I/O
path.

Add a check for CMD_T_TAS in iscsit_release_commands_from_conn() so we now
detect this case and run iscsit_free_cmd().

Fixes: f3619935 ("scsi: target: iscsi: Fix cmd abort fabric stop race")
Signed-off-by: default avatarMike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20230319015620.96006-9-michael.christie@oracle.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 673db054
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -4220,9 +4220,12 @@ static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
	list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) {
		struct se_cmd *se_cmd = &cmd->se_cmd;

		if (se_cmd->se_tfo != NULL) {
		if (!se_cmd->se_tfo)
			continue;

		spin_lock_irq(&se_cmd->t_state_lock);
		if (se_cmd->transport_state & CMD_T_ABORTED) {
			if (!(se_cmd->transport_state & CMD_T_TAS))
				/*
				 * LIO's abort path owns the cleanup for this,
				 * so put it back on the list and let
@@ -4235,7 +4238,6 @@ static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
		}
		spin_unlock_irq(&se_cmd->t_state_lock);
	}
	}
	spin_unlock_bh(&conn->cmd_lock);

	list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) {