iommu/vt-d: Unlink device if failed to add to group

If the device fails to be added to the group, make sure to unlink the
reference before returning.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Fixes: 39ab9555c2411 ("iommu: Add sysfs bindings for struct iommu_device")
Acked-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>

authored by Jon Derrick and committed by Joerg Roedel f78947c4 7d4e6ccd

Changed files
+10 -3
drivers
+10 -3
drivers/iommu/intel-iommu.c
··· 5624 5625 group = iommu_group_get_for_dev(dev); 5626 5627 - if (IS_ERR(group)) 5628 - return PTR_ERR(group); 5629 5630 iommu_group_put(group); 5631 ··· 5653 if (!get_private_domain_for_dev(dev)) { 5654 dev_warn(dev, 5655 "Failed to get a private domain.\n"); 5656 - return -ENOMEM; 5657 } 5658 5659 dev_info(dev, ··· 5669 } 5670 5671 return 0; 5672 } 5673 5674 static void intel_iommu_remove_device(struct device *dev)
··· 5624 5625 group = iommu_group_get_for_dev(dev); 5626 5627 + if (IS_ERR(group)) { 5628 + ret = PTR_ERR(group); 5629 + goto unlink; 5630 + } 5631 5632 iommu_group_put(group); 5633 ··· 5651 if (!get_private_domain_for_dev(dev)) { 5652 dev_warn(dev, 5653 "Failed to get a private domain.\n"); 5654 + ret = -ENOMEM; 5655 + goto unlink; 5656 } 5657 5658 dev_info(dev, ··· 5666 } 5667 5668 return 0; 5669 + 5670 + unlink: 5671 + iommu_device_unlink(&iommu->iommu, dev); 5672 + return ret; 5673 } 5674 5675 static void intel_iommu_remove_device(struct device *dev)