diff options
| author | Stefan Metzmacher <metze@samba.org> | 2025-08-12 10:55:31 +0200 |
|---|---|---|
| committer | Steve French <stfrench@microsoft.com> | 2025-09-28 18:29:52 -0500 |
| commit | b31606097de8393c8adac4161a4d3a6098af10e0 (patch) | |
| tree | 41b53911a88e3128dc99c09278a86cfbcda61f5a | |
| parent | e2d5e516c66383bed098b60be4925f9cbe9e3530 (diff) | |
| download | linux-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.c | 11 |
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); } |
