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: 7414dde0a6c3a958e (IB/iser: Fix race between iser connection ...) Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
02816a8b88
commit
8d5944d803
@ -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;
|
||||||
@ -367,8 +368,11 @@ static void iscsi_iser_cleanup_task(struct iscsi_task *task)
|
|||||||
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 {
|
|||||||
* 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 {
|
|||||||
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 + \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user