aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/nvme/host/rdma.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 2aba03876d84..7cd4199db225 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -1189,21 +1189,38 @@ static int nvme_rdma_map_data(struct nvme_rdma_queue *queue,
1189 count = ib_dma_map_sg(ibdev, req->sg_table.sgl, req->nents, 1189 count = ib_dma_map_sg(ibdev, req->sg_table.sgl, req->nents,
1190 rq_data_dir(rq) == WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 1190 rq_data_dir(rq) == WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
1191 if (unlikely(count <= 0)) { 1191 if (unlikely(count <= 0)) {
1192 sg_free_table_chained(&req->sg_table, true); 1192 ret = -EIO;
1193 return -EIO; 1193 goto out_free_table;
1194 } 1194 }
1195 1195
1196 if (count == 1) { 1196 if (count == 1) {
1197 if (rq_data_dir(rq) == WRITE && nvme_rdma_queue_idx(queue) && 1197 if (rq_data_dir(rq) == WRITE && nvme_rdma_queue_idx(queue) &&
1198 blk_rq_payload_bytes(rq) <= 1198 blk_rq_payload_bytes(rq) <=
1199 nvme_rdma_inline_data_size(queue)) 1199 nvme_rdma_inline_data_size(queue)) {
1200 return nvme_rdma_map_sg_inline(queue, req, c); 1200 ret = nvme_rdma_map_sg_inline(queue, req, c);
1201 goto out;
1202 }
1201 1203
1202 if (dev->pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY) 1204 if (dev->pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY) {
1203 return nvme_rdma_map_sg_single(queue, req, c); 1205 ret = nvme_rdma_map_sg_single(queue, req, c);
1206 goto out;
1207 }
1204 } 1208 }
1205 1209
1206 return nvme_rdma_map_sg_fr(queue, req, c, count); 1210 ret = nvme_rdma_map_sg_fr(queue, req, c, count);
1211out:
1212 if (unlikely(ret))
1213 goto out_unmap_sg;
1214
1215 return 0;
1216
1217out_unmap_sg:
1218 ib_dma_unmap_sg(ibdev, req->sg_table.sgl,
1219 req->nents, rq_data_dir(rq) ==
1220 WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
1221out_free_table:
1222 sg_free_table_chained(&req->sg_table, true);
1223 return ret;
1207} 1224}
1208 1225
1209static void nvme_rdma_send_done(struct ib_cq *cq, struct ib_wc *wc) 1226static void nvme_rdma_send_done(struct ib_cq *cq, struct ib_wc *wc)