Patch "scsi: iscsi: Fix endpoint reuse regression" has been added to the 5.17-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: iscsi: Fix endpoint reuse regression

to the 5.17-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-iscsi-fix-endpoint-reuse-regression.patch
and it can be found in the queue-5.17 subdirectory.

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



commit f6a4c172d3e004a8e6dbceb93b9fd70a4933611a
Author: Mike Christie <michael.christie@xxxxxxxxxx>
Date:   Thu Apr 7 19:13:08 2022 -0500

    scsi: iscsi: Fix endpoint reuse regression
    
    [ Upstream commit 0aadafb5c34403a7cced1a8d61877048dc059f70 ]
    
    This patch fixes a bug where when using iSCSI offload we can free an
    endpoint while userspace still thinks it's active. That then causes the
    endpoint ID to be reused for a new connection's endpoint while userspace
    still thinks the ID is for the original connection. Userspace will then end
    up disconnecting a running connection's endpoint or trying to bind to
    another connection's endpoint.
    
    This bug is a regression added in:
    
    Commit 23d6fefbb3f6 ("scsi: iscsi: Fix in-kernel conn failure handling")
    
    where we added a in kernel ep_disconnect call to fix a bug in:
    
    Commit 0ab710458da1 ("scsi: iscsi: Perform connection failure entirely in
    kernel space")
    
    where we would call stop_conn without having done ep_disconnect. This early
    ep_disconnect call will then free the endpoint and it's ID while userspace
    still thinks the ID is valid.
    
    Fix the early release of the ID by having the in kernel recovery code keep
    a reference to the endpoint until userspace has called into the kernel to
    finish cleaning up the endpoint/connection. It requires the previous commit
    "scsi: iscsi: Release endpoint ID when its freed" which moved the freeing
    of the ID until when the endpoint is released.
    
    Link: https://lore.kernel.org/r/20220408001314.5014-5-michael.christie@xxxxxxxxxx
    Fixes: 23d6fefbb3f6 ("scsi: iscsi: Fix in-kernel conn failure handling")
    Tested-by: Manish Rangankar <mrangankar@xxxxxxxxxxx>
    Reviewed-by: Lee Duncan <lduncan@xxxxxxxx>
    Reviewed-by: Chris Leech <cleech@xxxxxxxxxx>
    Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 03cda2da80ef..4fa2fd7f4c72 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -2267,7 +2267,11 @@ static void iscsi_if_disconnect_bound_ep(struct iscsi_cls_conn *conn,
 		mutex_unlock(&conn->ep_mutex);
 
 		flush_work(&conn->cleanup_work);
-
+		/*
+		 * Userspace is now done with the EP so we can release the ref
+		 * iscsi_cleanup_conn_work_fn took.
+		 */
+		iscsi_put_endpoint(ep);
 		mutex_lock(&conn->ep_mutex);
 	}
 }
@@ -2342,6 +2346,12 @@ static void iscsi_cleanup_conn_work_fn(struct work_struct *work)
 		return;
 	}
 
+	/*
+	 * Get a ref to the ep, so we don't release its ID until after
+	 * userspace is done referencing it in iscsi_if_disconnect_bound_ep.
+	 */
+	if (conn->ep)
+		get_device(&conn->ep->dev);
 	iscsi_ep_disconnect(conn, false);
 
 	if (system_state != SYSTEM_RUNNING) {



[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