Commit 890fccb2 authored by Ralph Campbell's avatar Ralph Campbell Committed by Roland Dreier

IB/ipath: Check return value of dma_map_single()

This fixes an obvious oversight where the return value is not checked
for error.
Signed-off-by: default avatarRalph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent fab01fc5
...@@ -698,10 +698,8 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd, ...@@ -698,10 +698,8 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd,
addr = dma_map_single(&dd->pcidev->dev, tx->txreq.map_addr, addr = dma_map_single(&dd->pcidev->dev, tx->txreq.map_addr,
tx->map_len, DMA_TO_DEVICE); tx->map_len, DMA_TO_DEVICE);
if (dma_mapping_error(&dd->pcidev->dev, addr)) { if (dma_mapping_error(&dd->pcidev->dev, addr))
ret = -EIO; goto ioerr;
goto unlock;
}
dwoffset = tx->map_len >> 2; dwoffset = tx->map_len >> 2;
make_sdma_desc(dd, sdmadesc, (u64) addr, dwoffset, 0); make_sdma_desc(dd, sdmadesc, (u64) addr, dwoffset, 0);
...@@ -741,6 +739,8 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd, ...@@ -741,6 +739,8 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd,
dw = (len + 3) >> 2; dw = (len + 3) >> 2;
addr = dma_map_single(&dd->pcidev->dev, sge->vaddr, dw << 2, addr = dma_map_single(&dd->pcidev->dev, sge->vaddr, dw << 2,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (dma_mapping_error(&dd->pcidev->dev, addr))
goto unmap;
make_sdma_desc(dd, sdmadesc, (u64) addr, dw, dwoffset); make_sdma_desc(dd, sdmadesc, (u64) addr, dw, dwoffset);
/* SDmaUseLargeBuf has to be set in every descriptor */ /* SDmaUseLargeBuf has to be set in every descriptor */
if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_USELARGEBUF) if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_USELARGEBUF)
...@@ -798,7 +798,18 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd, ...@@ -798,7 +798,18 @@ int ipath_sdma_verbs_send(struct ipath_devdata *dd,
list_add_tail(&tx->txreq.list, &dd->ipath_sdma_activelist); list_add_tail(&tx->txreq.list, &dd->ipath_sdma_activelist);
if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_VL15) if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_VL15)
vl15_watchdog_enq(dd); vl15_watchdog_enq(dd);
goto unlock;
unmap:
while (tail != dd->ipath_sdma_descq_tail) {
if (!tail)
tail = dd->ipath_sdma_descq_cnt - 1;
else
tail--;
unmap_desc(dd, tail);
}
ioerr:
ret = -EIO;
unlock: unlock:
spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags);
fail: fail:
......
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