Commit 4ab4fcfc authored by Daniel Jordan's avatar Daniel Jordan Committed by Alex Williamson
Browse files

vfio/type1: fix vaddr_get_pfns() return in vfio_pin_page_external()



vaddr_get_pfns() now returns the positive number of pfns successfully
gotten instead of zero.  vfio_pin_page_external() might return 1 to
vfio_iommu_type1_pin_pages(), which will treat it as an error, if
vaddr_get_pfns() is successful but vfio_pin_page_external() doesn't
reach vfio_lock_acct().

Fix it up in vfio_pin_page_external().  Found by inspection.

Fixes: be16c1fd ("vfio/type1: Change success value of vaddr_get_pfn()")
Signed-off-by: default avatarDaniel Jordan <daniel.m.jordan@oracle.com>
Message-Id: <20210308172452.38864-1-daniel.m.jordan@oracle.com>
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent b2b12db5
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -785,7 +785,12 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr,
		return -ENODEV;
		return -ENODEV;


	ret = vaddr_get_pfns(mm, vaddr, 1, dma->prot, pfn_base, pages);
	ret = vaddr_get_pfns(mm, vaddr, 1, dma->prot, pfn_base, pages);
	if (ret == 1 && do_accounting && !is_invalid_reserved_pfn(*pfn_base)) {
	if (ret != 1)
		goto out;

	ret = 0;

	if (do_accounting && !is_invalid_reserved_pfn(*pfn_base)) {
		ret = vfio_lock_acct(dma, 1, true);
		ret = vfio_lock_acct(dma, 1, true);
		if (ret) {
		if (ret) {
			put_pfn(*pfn_base, dma->prot);
			put_pfn(*pfn_base, dma->prot);
@@ -797,6 +802,7 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr,
		}
		}
	}
	}


out:
	mmput(mm);
	mmput(mm);
	return ret;
	return ret;
}
}