mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
smb: server: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
[ Upstream commit afb4108c92898350e66b9a009692230bcdd2ac73 ]
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: 0626e6641f ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
28db0cb8a0
commit
e67aff5047
@@ -264,8 +264,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);
|
||||
@@ -637,6 +642,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;
|
||||
}
|
||||
@@ -1818,6 +1824,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;
|
||||
|
||||
Reference in New Issue
Block a user