Commit 8d5944d8 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Doug Ledford

IB/iser: Fix possible bogus DMA unmapping

If iser_initialize_task_headers() routine failed before
dma mapping, we should not attempt to unmap in cleanup_task().

Fixes: 7414dde0 (IB/iser: Fix race between iser connection ...)
Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 02816a8b
...@@ -200,6 +200,7 @@ iser_initialize_task_headers(struct iscsi_task *task, ...@@ -200,6 +200,7 @@ iser_initialize_task_headers(struct iscsi_task *task,
goto out; goto out;
} }
tx_desc->mapped = true;
tx_desc->dma_addr = dma_addr; tx_desc->dma_addr = dma_addr;
tx_desc->tx_sg[0].addr = tx_desc->dma_addr; tx_desc->tx_sg[0].addr = tx_desc->dma_addr;
tx_desc->tx_sg[0].length = ISER_HEADERS_LEN; tx_desc->tx_sg[0].length = ISER_HEADERS_LEN;
...@@ -359,16 +360,19 @@ iscsi_iser_task_xmit(struct iscsi_task *task) ...@@ -359,16 +360,19 @@ iscsi_iser_task_xmit(struct iscsi_task *task)
static void iscsi_iser_cleanup_task(struct iscsi_task *task) static void iscsi_iser_cleanup_task(struct iscsi_task *task)
{ {
struct iscsi_iser_task *iser_task = task->dd_data; struct iscsi_iser_task *iser_task = task->dd_data;
struct iser_tx_desc *tx_desc = &iser_task->desc; struct iser_tx_desc *tx_desc = &iser_task->desc;
struct iser_conn *iser_conn = task->conn->dd_data; struct iser_conn *iser_conn = task->conn->dd_data;
struct iser_device *device = iser_conn->ib_conn.device; struct iser_device *device = iser_conn->ib_conn.device;
/* DEVICE_REMOVAL event might have already released the device */ /* DEVICE_REMOVAL event might have already released the device */
if (!device) if (!device)
return; return;
ib_dma_unmap_single(device->ib_device, if (likely(tx_desc->mapped)) {
tx_desc->dma_addr, ISER_HEADERS_LEN, DMA_TO_DEVICE); ib_dma_unmap_single(device->ib_device, tx_desc->dma_addr,
ISER_HEADERS_LEN, DMA_TO_DEVICE);
tx_desc->mapped = false;
}
/* mgmt tasks do not need special cleanup */ /* mgmt tasks do not need special cleanup */
if (!task->sc) if (!task->sc)
......
...@@ -270,6 +270,7 @@ enum iser_desc_type { ...@@ -270,6 +270,7 @@ enum iser_desc_type {
* sg[1] optionally points to either of immediate data * sg[1] optionally points to either of immediate data
* unsolicited data-out or control * unsolicited data-out or control
* @num_sge: number sges used on this TX task * @num_sge: number sges used on this TX task
* @mapped: Is the task header mapped
*/ */
struct iser_tx_desc { struct iser_tx_desc {
struct iser_hdr iser_header; struct iser_hdr iser_header;
...@@ -278,6 +279,7 @@ struct iser_tx_desc { ...@@ -278,6 +279,7 @@ struct iser_tx_desc {
u64 dma_addr; u64 dma_addr;
struct ib_sge tx_sg[2]; struct ib_sge tx_sg[2];
int num_sge; int num_sge;
bool mapped;
}; };
#define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \ #define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment