+++ /dev/null
-From stable+bounces-169889-greg=kroah.com@vger.kernel.org Sun Aug 17 15:51:23 2025
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 17 Aug 2025 09:51:13 -0400
-Subject: smb: client: let send_done() cleanup before calling smbd_disconnect_rdma_connection()
-To: stable@vger.kernel.org
-Cc: Stefan Metzmacher <metze@samba.org>, Steve French <smfrench@gmail.com>, Tom Talpey <tom@talpey.com>, Long Li <longli@microsoft.com>, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, Steve French <stfrench@microsoft.com>, Sasha Levin <sashal@kernel.org>
-Message-ID: <20250817135113.1474958-1-sashal@kernel.org>
-
-From: Stefan Metzmacher <metze@samba.org>
-
-[ Upstream commit 5349ae5e05fa37409fd48a1eb483b199c32c889b ]
-
-We should call ib_dma_unmap_single() and mempool_free() before calling
-smbd_disconnect_rdma_connection().
-
-And smbd_disconnect_rdma_connection() needs to be the last function to
-call as all other state might already be gone after it returns.
-
-Cc: Steve French <smfrench@gmail.com>
-Cc: Tom Talpey <tom@talpey.com>
-Cc: Long Li <longli@microsoft.com>
-Cc: linux-cifs@vger.kernel.org
-Cc: samba-technical@lists.samba.org
-Fixes: f198186aa9bb ("CIFS: SMBD: Establish SMB Direct connection")
-Signed-off-by: Stefan Metzmacher <metze@samba.org>
-Signed-off-by: Steve French <stfrench@microsoft.com>
-[ Replaced `info` with `request->info` ]
-Signed-off-by: Sasha Levin <sashal@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- fs/smb/client/smbdirect.c | 15 +++++++++------
- 1 file changed, 9 insertions(+), 6 deletions(-)
-
---- a/fs/smb/client/smbdirect.c
-+++ b/fs/smb/client/smbdirect.c
-@@ -273,18 +273,21 @@ static void send_done(struct ib_cq *cq,
- log_rdma_send(INFO, "smbd_request 0x%p completed wc->status=%d\n",
- request, wc->status);
-
-- if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) {
-- log_rdma_send(ERR, "wc->status=%d wc->opcode=%d\n",
-- wc->status, wc->opcode);
-- smbd_disconnect_rdma_connection(request->info);
-- }
--
- for (i = 0; i < request->num_sge; i++)
- ib_dma_unmap_single(request->info->id->device,
- request->sge[i].addr,
- request->sge[i].length,
- DMA_TO_DEVICE);
-
-+ if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) {
-+ struct smbd_connection *info = request->info;
-+ log_rdma_send(ERR, "wc->status=%d wc->opcode=%d\n",
-+ wc->status, wc->opcode);
-+ mempool_free(request, info->request_mempool);
-+ smbd_disconnect_rdma_connection(info);
-+ return;
-+ }
-+
- if (atomic_dec_and_test(&request->info->send_pending))
- wake_up(&request->info->wait_send_pending);
-