vfio_find_dma_valid is defined to return WAITED on success if it was necessary to wait. However, the loop forgets the WAITED value returned by vfio_wait() and returns 0 in a later iteration. Fix it.
Unified · Split
| @@ -612,17 +612,17 @@ static int vfio_wait(struct vfio_iommu *iommu) · 611 unmodified lines | |||
| 612 | static int vfio_find_dma_valid(struct vfio_iommu *iommu, dma_addr_t start, | 612 | static int vfio_find_dma_valid(struct vfio_iommu *iommu, dma_addr_t start, |
| 613 | size_t size, struct vfio_dma **dma_p) | 613 | size_t size, struct vfio_dma **dma_p) |
| 614 | { | 614 | { |
| 615 | int ret; | 615 | int ret = 0; |
| 616 | 616 | ||
| 617 | do { | 617 | do { |
| 618 | *dma_p = vfio_find_dma(iommu, start, size); | 618 | *dma_p = vfio_find_dma(iommu, start, size); |
| 619 | if (!*dma_p) | 619 | if (!*dma_p) |
| 620 | ret = -EINVAL; | 620 | return -EINVAL; |
| 621 | else if (!(*dma_p)->vaddr_invalid) | 621 | else if (!(*dma_p)->vaddr_invalid) |
| 622 | ret = 0; | 622 | return ret; |
| 623 | else | 623 | else |
| 624 | ret = vfio_wait(iommu); | 624 | ret = vfio_wait(iommu); |
| 625 | } while (ret > 0); | 625 | } while (ret == WAITED); |
| 626 | 626 | ||
| 627 | return ret; | 627 | return ret; |
| 628 | } | 628 | } |