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 | 612 | static int vfio_find_dma_valid(struct vfio_iommu *iommu, dma_addr_t start, |
| 613 | 613 | size_t size, struct vfio_dma **dma_p) |
| 614 | 614 | { |
| 615 | − int ret; | |
| 615 | + int ret = 0; | |
| 616 | 616 | |
| 617 | 617 | do { |
| 618 | 618 | *dma_p = vfio_find_dma(iommu, start, size); |
| 619 | 619 | if (!*dma_p) |
| 620 | − ret = -EINVAL; | |
| 620 | + return -EINVAL; | |
| 621 | 621 | else if (!(*dma_p)->vaddr_invalid) |
| 622 | − ret = 0; | |
| 622 | + return ret; | |
| 623 | 623 | else |
| 624 | 624 | ret = vfio_wait(iommu); |
| 625 | − } while (ret > 0); | |
| 625 | + } while (ret == WAITED); | |
| 626 | 626 | |
| 627 | 627 | return ret; |
| 628 | 628 | } |