summaryrefslogtreecommitdiff
path: root/drivers/iommu
diff options
context:
space:
mode:
authorHiroshi Doyu <hdoyu@nvidia.com>2013-10-10 10:13:24 +0300
committerHiroshi Doyu <hdoyu@nvidia.com>2013-10-13 23:22:04 -0700
commiteb8d5e2acd4a5c9bf9de6c8d2411c39b7f5bd178 (patch)
treeccd491a94cf6b36b73c1edab33a53f687de8e758 /drivers/iommu
parent6a32c3e687f883f2c66e2365ae8287c076388153 (diff)
iommu/core: Error rewinding for map_{pages,sg}()
Similiar with other IOMMU API, add clean up at error. Bug 1375251 Change-Id: Ie5461eb557b3d4ad7dd0605f37afba9ffc038d6b Signed-off-by: Hiroshi Doyu <hdoyu@nvidia.com> Reviewed-on: http://git-master/r/288845 Reviewed-on: http://git-master/r/289611 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/iommu.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index b1fe611f9e7c..35bad4047206 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -835,14 +835,26 @@ EXPORT_SYMBOL_GPL(iommu_map);
int iommu_map_pages(struct iommu_domain *domain, unsigned long iova,
struct page **pages, size_t count, int prot)
{
- return domain->ops->map_pages(domain, iova, pages, count, prot);
+ int err;
+
+ err = domain->ops->map_pages(domain, iova, pages, count, prot);
+ if (err)
+ iommu_unmap(domain, iova, count << PAGE_SHIFT);
+
+ return err;
}
EXPORT_SYMBOL_GPL(iommu_map_pages);
int iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
struct scatterlist *sgl, int nents, int prot)
{
- return domain->ops->map_sg(domain, iova, sgl, nents, prot);
+ int err;
+
+ err = domain->ops->map_sg(domain, iova, sgl, nents, prot);
+ if (err)
+ iommu_unmap(domain, iova, sgl->length);
+
+ return err;
}
size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)