Skip to content

Commit a21ddfa

Browse files
metze-sambaopsiff
authored andcommitted
smb: client: make sure we call ib_dma_unmap_single() only if we called ib_dma_map_single already
[ Upstream commit 047682c370b6f18fec818b57b0ed8b501bdb79f8 ] 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_receive_buffer() only calls ib_dma_unmap_single() if needed. Cc: Steve French <[email protected]> Cc: Tom Talpey <[email protected]> Cc: Long Li <[email protected]> Cc: [email protected] Cc: [email protected] Fixes: f198186 ("CIFS: SMBD: Establish SMB Direct connection") Signed-off-by: Stefan Metzmacher <[email protected]> Signed-off-by: Steve French <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 83d2a4185f5a75b929a6a45aa1c0b2b9bcb9840e)
1 parent 10f48e1 commit a21ddfa

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

fs/smb/client/smbdirect.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ static int smbd_post_recv(
10411041
if (rc) {
10421042
ib_dma_unmap_single(sc->ib.dev, response->sge.addr,
10431043
response->sge.length, DMA_FROM_DEVICE);
1044+
response->sge.length = 0;
10441045
smbd_disconnect_rdma_connection(info);
10451046
log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc);
10461047
}
@@ -1200,8 +1201,13 @@ static void put_receive_buffer(
12001201
struct smbdirect_socket *sc = &info->socket;
12011202
unsigned long flags;
12021203

1203-
ib_dma_unmap_single(sc->ib.dev, response->sge.addr,
1204-
response->sge.length, DMA_FROM_DEVICE);
1204+
if (likely(response->sge.length != 0)) {
1205+
ib_dma_unmap_single(sc->ib.dev,
1206+
response->sge.addr,
1207+
response->sge.length,
1208+
DMA_FROM_DEVICE);
1209+
response->sge.length = 0;
1210+
}
12051211

12061212
spin_lock_irqsave(&info->receive_queue_lock, flags);
12071213
list_add_tail(&response->list, &info->receive_queue);
@@ -1239,6 +1245,7 @@ static int allocate_receive_buffers(struct smbd_connection *info, int num_buf)
12391245
goto allocate_failed;
12401246

12411247
response->info = info;
1248+
response->sge.length = 0;
12421249
list_add_tail(&response->list, &info->receive_queue);
12431250
info->count_receive_queue++;
12441251
}

0 commit comments

Comments
 (0)