Skip to content

Commit 0aadafb

Browse files
mikechristiemartinkpetersen
authored andcommitted
scsi: iscsi: Fix endpoint reuse regression
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 23d6fef ("scsi: iscsi: Fix in-kernel conn failure handling") where we added a in kernel ep_disconnect call to fix a bug in: Commit 0ab7104 ("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@oracle.com Fixes: 23d6fef ("scsi: iscsi: Fix in-kernel conn failure handling") Tested-by: Manish Rangankar <mrangankar@marvell.com> Reviewed-by: Lee Duncan <lduncan@suse.com> Reviewed-by: Chris Leech <cleech@redhat.com> Signed-off-by: Mike Christie <michael.christie@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 3c6ae37 commit 0aadafb

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

drivers/scsi/scsi_transport_iscsi.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2247,7 +2247,11 @@ static void iscsi_if_disconnect_bound_ep(struct iscsi_cls_conn *conn,
22472247
mutex_unlock(&conn->ep_mutex);
22482248

22492249
flush_work(&conn->cleanup_work);
2250-
2250+
/*
2251+
* Userspace is now done with the EP so we can release the ref
2252+
* iscsi_cleanup_conn_work_fn took.
2253+
*/
2254+
iscsi_put_endpoint(ep);
22512255
mutex_lock(&conn->ep_mutex);
22522256
}
22532257
}
@@ -2322,6 +2326,12 @@ static void iscsi_cleanup_conn_work_fn(struct work_struct *work)
23222326
return;
23232327
}
23242328

2329+
/*
2330+
* Get a ref to the ep, so we don't release its ID until after
2331+
* userspace is done referencing it in iscsi_if_disconnect_bound_ep.
2332+
*/
2333+
if (conn->ep)
2334+
get_device(&conn->ep->dev);
23252335
iscsi_ep_disconnect(conn, false);
23262336

23272337
if (system_state != SYSTEM_RUNNING) {

0 commit comments

Comments
 (0)