diff options
author | Vivek Gautam <vivek.gautam@codeaurora.org> | 2017-07-06 05:37:00 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2017-07-20 05:30:28 -0400 |
commit | c54451a5e2415948274bc71f469e5349469addcc (patch) | |
tree | 0318cee60c8394a7bb616d58f8a21034fd580eda | |
parent | 2984f7f3bb5a82df763c2d81444573ed86f36eb8 (diff) |
iommu/arm-smmu: Fix the error path in arm_smmu_add_device
fwspec->iommu_priv is available only after arm_smmu_master_cfg
instance has been allocated. We shouldn't free it before that.
Also it's logical to free the master cfg itself without
checking for fwspec.
Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org>
[will: remove redundant assignment to fwspec]
Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r-- | drivers/iommu/arm-smmu.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 98ff462b5992..b97188acc4f1 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -1519,7 +1519,6 @@ static int arm_smmu_add_device(struct device *dev) | |||
1519 | 1519 | ||
1520 | if (using_legacy_binding) { | 1520 | if (using_legacy_binding) { |
1521 | ret = arm_smmu_register_legacy_master(dev, &smmu); | 1521 | ret = arm_smmu_register_legacy_master(dev, &smmu); |
1522 | fwspec = dev->iommu_fwspec; | ||
1523 | if (ret) | 1522 | if (ret) |
1524 | goto out_free; | 1523 | goto out_free; |
1525 | } else if (fwspec && fwspec->ops == &arm_smmu_ops) { | 1524 | } else if (fwspec && fwspec->ops == &arm_smmu_ops) { |
@@ -1558,15 +1557,15 @@ static int arm_smmu_add_device(struct device *dev) | |||
1558 | 1557 | ||
1559 | ret = arm_smmu_master_alloc_smes(dev); | 1558 | ret = arm_smmu_master_alloc_smes(dev); |
1560 | if (ret) | 1559 | if (ret) |
1561 | goto out_free; | 1560 | goto out_cfg_free; |
1562 | 1561 | ||
1563 | iommu_device_link(&smmu->iommu, dev); | 1562 | iommu_device_link(&smmu->iommu, dev); |
1564 | 1563 | ||
1565 | return 0; | 1564 | return 0; |
1566 | 1565 | ||
1566 | out_cfg_free: | ||
1567 | kfree(cfg); | ||
1567 | out_free: | 1568 | out_free: |
1568 | if (fwspec) | ||
1569 | kfree(fwspec->iommu_priv); | ||
1570 | iommu_fwspec_free(dev); | 1569 | iommu_fwspec_free(dev); |
1571 | return ret; | 1570 | return ret; |
1572 | } | 1571 | } |