Skip to content

Commit afb4108

Browse files
metze-sambasmfrench
authored andcommitted
smb: server: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
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 <[email protected]> Cc: Steve French <[email protected]> Cc: Tom Talpey <[email protected]> Cc: [email protected] Cc: [email protected] Fixes: 0626e66 ("cifsd: add server handler for central processing and tranport layers") Signed-off-by: Stefan Metzmacher <[email protected]> Acked-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent 01027a6 commit afb4108

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

fs/smb/server/transport_rdma.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,13 @@ smb_direct_recvmsg *get_free_recvmsg(struct smb_direct_transport *t)
265265
static void put_recvmsg(struct smb_direct_transport *t,
266266
struct smb_direct_recvmsg *recvmsg)
267267
{
268-
ib_dma_unmap_single(t->cm_id->device, recvmsg->sge.addr,
269-
recvmsg->sge.length, DMA_FROM_DEVICE);
268+
if (likely(recvmsg->sge.length != 0)) {
269+
ib_dma_unmap_single(t->cm_id->device,
270+
recvmsg->sge.addr,
271+
recvmsg->sge.length,
272+
DMA_FROM_DEVICE);
273+
recvmsg->sge.length = 0;
274+
}
270275

271276
spin_lock(&t->recvmsg_queue_lock);
272277
list_add(&recvmsg->list, &t->recvmsg_queue);
@@ -638,6 +643,7 @@ static int smb_direct_post_recv(struct smb_direct_transport *t,
638643
ib_dma_unmap_single(t->cm_id->device,
639644
recvmsg->sge.addr, recvmsg->sge.length,
640645
DMA_FROM_DEVICE);
646+
recvmsg->sge.length = 0;
641647
smb_direct_disconnect_rdma_connection(t);
642648
return ret;
643649
}
@@ -1819,6 +1825,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
18191825
if (!recvmsg)
18201826
goto err;
18211827
recvmsg->transport = t;
1828+
recvmsg->sge.length = 0;
18221829
list_add(&recvmsg->list, &t->recvmsg_queue);
18231830
}
18241831
t->count_avail_recvmsg = t->recv_credit_max;

0 commit comments

Comments
 (0)