On Mon, Feb 11, 2019 at 10:05:02AM -0500, Ewan D. Milne wrote:
> The change to use dma_set_mask_and_coherent() incorrectly made a second
> call with the 32 bit DMA mask value when the call with the 64 bit DMA
> mask value succeeded. This resulted in NVMe/FC connections failing due
> to corrupted data buffers, and various other SCSI/FCP I/O errors.
Ooops, sorry.
> /* Set the device DMA mask size */
> - if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) ||
> - dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
> - return error;
> + if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) != 0)
> + if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) !=
> 0)
But this still looks obsfuctating, why not:
error = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (error)
error = dma_set_mask_and_coherent(&pdev->dev,
DMA_BIT_MASK(32)));
if (error)
return error;