Patch "scsi: target: iscsit: Stop/wait on cmds during conn close" has been added to the 6.2-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: target: iscsit: Stop/wait on cmds during conn close

to the 6.2-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-target-iscsit-stop-wait-on-cmds-during-conn-clo.patch
and it can be found in the queue-6.2 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8a7452d7851913d5edcef183ea63d86d17392401
Author: Mike Christie <michael.christie@xxxxxxxxxx>
Date:   Sat Mar 18 20:56:16 2023 -0500

    scsi: target: iscsit: Stop/wait on cmds during conn close
    
    [ Upstream commit 395cee83d02de3073211b04fc85724f4abc663ad ]
    
    This fixes a bug added in commit f36199355c64 ("scsi: target: iscsi: Fix
    cmd abort fabric stop race").
    
    If we have multiple sessions to the same se_device we can hit a race where
    a LUN_RESET on one session cleans up the se_cmds from under another
    session which is being closed. This results in the closing session freeing
    its conn/session structs while they are still in use.
    
    The bug is:
    
     1. Session1 has IO se_cmd1.
    
     2. Session2 can also have se_cmds for I/O and optionally TMRs for ABORTS
        but then gets a LUN_RESET.
    
     3. The LUN_RESET on session2 sees the se_cmds on session1 and during the
        drain stages marks them all with CMD_T_ABORTED.
    
     4. session1 is now closed so iscsit_release_commands_from_conn() only sees
        se_cmds with the CMD_T_ABORTED bit set and returns immediately even
        though we have outstanding commands.
    
     5. session1's connection and session are freed.
    
     6. The backend request for se_cmd1 completes and it accesses the freed
        connection/session.
    
    This hooks the iscsit layer into the cmd counter code, so we can wait for
    all outstanding se_cmds before freeing the connection.
    
    Fixes: f36199355c64 ("scsi: target: iscsi: Fix cmd abort fabric stop race")
    Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230319015620.96006-6-michael.christie@xxxxxxxxxx
    Reviewed-by: Maurizio Lombardi <mlombard@xxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 11115c2078446..83b0071412294 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -4245,6 +4245,16 @@ static void iscsit_release_commands_from_conn(struct iscsit_conn *conn)
 		iscsit_free_cmd(cmd, true);
 
 	}
+
+	/*
+	 * Wait on commands that were cleaned up via the aborted_task path.
+	 * LLDs that implement iscsit_wait_conn will already have waited for
+	 * commands.
+	 */
+	if (!conn->conn_transport->iscsit_wait_conn) {
+		target_stop_cmd_counter(conn->cmd_cnt);
+		target_wait_for_cmds(conn->cmd_cnt);
+	}
 }
 
 static void iscsit_stop_timers_for_cmds(



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux