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;

Reply via email to