All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] target: iscsi: handle abort for WRITE_PENDING cmds
@ 2022-07-13 20:42 Dmitry Bogdanov
  2022-07-14 16:44 ` Mike Christie
  0 siblings, 1 reply; 6+ messages in thread
From: Dmitry Bogdanov @ 2022-07-13 20:42 UTC (permalink / raw)
  To: Martin Petersen, target-devel, Nick Couchman
  Cc: linux-scsi, linux, Dmitry Bogdanov

Sometimes an initiator does not send data for WRITE commands and tries
to abort it. The abort hangs waiting for frontend driver completion.
iSCSI driver waits for for data and that timeout eventually initiates
connection reinstatment. The connection closing releases the commands in
the connection, but those aborted commands still did not handle the
abort and did not decrease a command ref counter. Because of that the
connection reinstatement hangs indefinitely and prevents re-login for
that initiator.

This patch adds a handling in TCM of the abort for the WRITE_PENDING
commands at connection closing moment to make it possible to release
them.

Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
 drivers/target/iscsi/iscsi_target.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index e368f038ff5c..27eca5e72f52 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -26,6 +26,7 @@
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
 
+#include <target/target_core_backend.h>
 #include <target/iscsi/iscsi_target_core.h>
 #include "iscsi_target_parameters.h"
 #include "iscsi_target_seq_pdu_list.h"
@@ -4171,7 +4172,8 @@ static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
 
 		if (se_cmd->se_tfo != NULL) {
 			spin_lock_irq(&se_cmd->t_state_lock);
-			if (se_cmd->transport_state & CMD_T_ABORTED) {
+			if (se_cmd->t_state != TRANSPORT_WRITE_PENDING &&
+			    se_cmd->transport_state & CMD_T_ABORTED) {
 				/*
 				 * LIO's abort path owns the cleanup for this,
 				 * so put it back on the list and let
@@ -4191,8 +4193,13 @@ static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
 		list_del_init(&cmd->i_conn_node);
 
 		iscsit_increment_maxcmdsn(cmd, sess);
-		iscsit_free_cmd(cmd, true);
-
+		if (cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING &&
+		    cmd->se_cmd.transport_state & CMD_T_ABORTED) {
+			/* handle an abort in TCM */
+			target_complete_cmd(&cmd->se_cmd, SAM_STAT_TASK_ABORTED);
+		} else {
+			iscsit_free_cmd(cmd, true);
+		}
 	}
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-07-20  2:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-13 20:42 [PATCH] target: iscsi: handle abort for WRITE_PENDING cmds Dmitry Bogdanov
2022-07-14 16:44 ` Mike Christie
2022-07-18  8:45   ` Dmitry Bogdanov
2022-07-18 21:22     ` Mike Christie
2022-07-19 16:14       ` Dmitry Bogdanov
2022-07-20  2:31         ` Mike Christie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.