]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/3.19.2/ib-iser-use-correct-dma-direction-when-unmapping-sgs.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.19.2 / ib-iser-use-correct-dma-direction-when-unmapping-sgs.patch
1 From c6c95ef4cec680f7a10aa425a9970744b35b6489 Mon Sep 17 00:00:00 2001
2 From: Roi Dayan <roid@mellanox.com>
3 Date: Sun, 28 Dec 2014 14:26:11 +0200
4 Subject: IB/iser: Use correct dma direction when unmapping SGs
5
6 From: Roi Dayan <roid@mellanox.com>
7
8 commit c6c95ef4cec680f7a10aa425a9970744b35b6489 upstream.
9
10 We always unmap SGs with the same direction instead of unmapping
11 with the direction the mapping was done, fix that.
12
13 Fixes: 9a8b08fad2ef ("IB/iser: Generalize iser_unmap_task_data and [...]")
14 Signed-off-by: Roi Dayan <roid@mellanox.com>
15 Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
16 Signed-off-by: Roland Dreier <roland@purestorage.com>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18
19 ---
20 drivers/infiniband/ulp/iser/iscsi_iser.h | 4 +++-
21 drivers/infiniband/ulp/iser/iser_initiator.c | 12 ++++++++----
22 drivers/infiniband/ulp/iser/iser_memory.c | 9 ++++++---
23 3 files changed, 17 insertions(+), 8 deletions(-)
24
25 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h
26 +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
27 @@ -654,7 +654,9 @@ int iser_dma_map_task_data(struct iscsi_
28 enum dma_data_direction dma_dir);
29
30 void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
31 - struct iser_data_buf *data);
32 + struct iser_data_buf *data,
33 + enum dma_data_direction dir);
34 +
35 int iser_initialize_task_headers(struct iscsi_task *task,
36 struct iser_tx_desc *tx_desc);
37 int iser_alloc_rx_descriptors(struct iser_conn *iser_conn,
38 --- a/drivers/infiniband/ulp/iser/iser_initiator.c
39 +++ b/drivers/infiniband/ulp/iser/iser_initiator.c
40 @@ -710,19 +710,23 @@ void iser_task_rdma_finalize(struct iscs
41 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_IN);
42 if (is_rdma_data_aligned)
43 iser_dma_unmap_task_data(iser_task,
44 - &iser_task->data[ISER_DIR_IN]);
45 + &iser_task->data[ISER_DIR_IN],
46 + DMA_FROM_DEVICE);
47 if (prot_count && is_rdma_prot_aligned)
48 iser_dma_unmap_task_data(iser_task,
49 - &iser_task->prot[ISER_DIR_IN]);
50 + &iser_task->prot[ISER_DIR_IN],
51 + DMA_FROM_DEVICE);
52 }
53
54 if (iser_task->dir[ISER_DIR_OUT]) {
55 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_OUT);
56 if (is_rdma_data_aligned)
57 iser_dma_unmap_task_data(iser_task,
58 - &iser_task->data[ISER_DIR_OUT]);
59 + &iser_task->data[ISER_DIR_OUT],
60 + DMA_TO_DEVICE);
61 if (prot_count && is_rdma_prot_aligned)
62 iser_dma_unmap_task_data(iser_task,
63 - &iser_task->prot[ISER_DIR_OUT]);
64 + &iser_task->prot[ISER_DIR_OUT],
65 + DMA_TO_DEVICE);
66 }
67 }
68 --- a/drivers/infiniband/ulp/iser/iser_memory.c
69 +++ b/drivers/infiniband/ulp/iser/iser_memory.c
70 @@ -332,12 +332,13 @@ int iser_dma_map_task_data(struct iscsi_
71 }
72
73 void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,
74 - struct iser_data_buf *data)
75 + struct iser_data_buf *data,
76 + enum dma_data_direction dir)
77 {
78 struct ib_device *dev;
79
80 dev = iser_task->iser_conn->ib_conn.device->ib_device;
81 - ib_dma_unmap_sg(dev, data->buf, data->size, DMA_FROM_DEVICE);
82 + ib_dma_unmap_sg(dev, data->buf, data->size, dir);
83 }
84
85 static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,
86 @@ -357,7 +358,9 @@ static int fall_to_bounce_buf(struct isc
87 iser_data_buf_dump(mem, ibdev);
88
89 /* unmap the command data before accessing it */
90 - iser_dma_unmap_task_data(iser_task, mem);
91 + iser_dma_unmap_task_data(iser_task, mem,
92 + (cmd_dir == ISER_DIR_OUT) ?
93 + DMA_TO_DEVICE : DMA_FROM_DEVICE);
94
95 /* allocate copy buf, if we are writing, copy the */
96 /* unaligned scatterlist, dma map the copy */