]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: server: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_sin...
authorStefan Metzmacher <metze@samba.org>
Mon, 4 Aug 2025 12:15:51 +0000 (14:15 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 6 Aug 2025 19:09:57 +0000 (14:09 -0500)
In case of failures either ib_dma_map_single() might not be called yet
or ib_dma_unmap_single() was already called.

We should make sure put_recvmsg() only calls ib_dma_unmap_single() if needed.

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
Fixes: 0626e6641f6b ("cifsd: add server handler for central processing and tranport layers")
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/transport_rdma.c

index 393254109fc41521c982870f98b39e60d2efd341..fac82e60ff805166722e4b28e1770729e1945131 100644 (file)
@@ -265,8 +265,13 @@ smb_direct_recvmsg *get_free_recvmsg(struct smb_direct_transport *t)
 static void put_recvmsg(struct smb_direct_transport *t,
                        struct smb_direct_recvmsg *recvmsg)
 {
-       ib_dma_unmap_single(t->cm_id->device, recvmsg->sge.addr,
-                           recvmsg->sge.length, DMA_FROM_DEVICE);
+       if (likely(recvmsg->sge.length != 0)) {
+               ib_dma_unmap_single(t->cm_id->device,
+                                   recvmsg->sge.addr,
+                                   recvmsg->sge.length,
+                                   DMA_FROM_DEVICE);
+               recvmsg->sge.length = 0;
+       }
 
        spin_lock(&t->recvmsg_queue_lock);
        list_add(&recvmsg->list, &t->recvmsg_queue);
@@ -638,6 +643,7 @@ static int smb_direct_post_recv(struct smb_direct_transport *t,
                ib_dma_unmap_single(t->cm_id->device,
                                    recvmsg->sge.addr, recvmsg->sge.length,
                                    DMA_FROM_DEVICE);
+               recvmsg->sge.length = 0;
                smb_direct_disconnect_rdma_connection(t);
                return ret;
        }
@@ -1819,6 +1825,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
                if (!recvmsg)
                        goto err;
                recvmsg->transport = t;
+               recvmsg->sge.length = 0;
                list_add(&recvmsg->list, &t->recvmsg_queue);
        }
        t->count_avail_recvmsg = t->recv_credit_max;