summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2025-08-12 10:55:31 +0200
committerSteve French <stfrench@microsoft.com>2025-09-28 18:29:52 -0500
commitb31606097de8393c8adac4161a4d3a6098af10e0 (patch)
tree41b53911a88e3128dc99c09278a86cfbcda61f5a
parente2d5e516c66383bed098b60be4925f9cbe9e3530 (diff)
downloadlinux-b31606097de8393c8adac4161a4d3a6098af10e0.tar.gz
linux-b31606097de8393c8adac4161a4d3a6098af10e0.zip
smb: server: move smb_direct_disconnect_rdma_work() into free_transport()
The logic is also needed when smb_direct_handle_connect_request() calls free_transport(), because rdma_accept() and RDMA_CM_EVENT_ESTABLISHED could already be reached. Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
-rw-r--r--fs/smb/server/transport_rdma.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c
index c5850dcf2e19..298c7e060db6 100644
--- a/fs/smb/server/transport_rdma.c
+++ b/fs/smb/server/transport_rdma.c
@@ -381,13 +381,19 @@ static void free_transport(struct smb_direct_transport *t)
struct smbdirect_socket *sc = &t->socket;
struct smbdirect_recv_io *recvmsg;
+ disable_work_sync(&t->disconnect_work);
+ if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING) {
+ smb_direct_disconnect_rdma_work(&t->disconnect_work);
+ wait_event_interruptible(sc->status_wait,
+ sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
+ }
+
wake_up_all(&t->wait_send_credits);
ksmbd_debug(RDMA, "wait for all send posted to IB to finish\n");
wait_event(t->wait_send_pending,
atomic_read(&t->send_pending) == 0);
- disable_work_sync(&t->disconnect_work);
disable_work_sync(&t->post_recv_credits_work);
disable_work_sync(&t->send_immediate_work);
@@ -1551,9 +1557,6 @@ static void smb_direct_disconnect(struct ksmbd_transport *t)
ksmbd_debug(RDMA, "Disconnecting cm_id=%p\n", sc->rdma.cm_id);
- smb_direct_disconnect_rdma_work(&st->disconnect_work);
- wait_event_interruptible(sc->status_wait,
- sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
free_transport(st);
}