]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
iommu/vt-d: Unlink device if failed to add to group
authorJon Derrick <jonathan.derrick@intel.com>
Tue, 31 Dec 2019 20:24:20 +0000 (13:24 -0700)
committerPaolo Pisati <paolo.pisati@canonical.com>
Thu, 30 Jan 2020 15:24:23 +0000 (16:24 +0100)
BugLink: https://bugs.launchpad.net/bugs/1861085
commit f78947c409204138a4bc0609f98e07ef9d01ac0a upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
drivers/iommu/intel-iommu.c

index 67aa317de6dbbe1f4a728064a0eb4955b353c3b4..e84c5dfe146f70a39f07fc846679f4cb3204644a 100644 (file)
@@ -5593,8 +5593,10 @@ static int intel_iommu_add_device(struct device *dev)
 
        group = iommu_group_get_for_dev(dev);
 
-       if (IS_ERR(group))
-               return PTR_ERR(group);
+       if (IS_ERR(group)) {
+               ret = PTR_ERR(group);
+               goto unlink;
+       }
 
        iommu_group_put(group);
 
@@ -5620,7 +5622,8 @@ static int intel_iommu_add_device(struct device *dev)
                                if (!get_private_domain_for_dev(dev)) {
                                        dev_warn(dev,
                                                 "Failed to get a private domain.\n");
-                                       return -ENOMEM;
+                                       ret = -ENOMEM;
+                                       goto unlink;
                                }
 
                                dev_info(dev,
@@ -5635,6 +5638,10 @@ static int intel_iommu_add_device(struct device *dev)
        }
 
        return 0;
+
+unlink:
+       iommu_device_unlink(&iommu->iommu, dev);
+       return ret;
 }
 
 static void intel_iommu_remove_device(struct device *dev)