From: Joerg Roedel <[email protected]>

Make sure we call the ->remove_device call-back on all
devices already initialized with ->add_device when the bus
initialization fails.

Signed-off-by: Joerg Roedel <[email protected]>
---
 drivers/iommu/iommu.c | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 9c9336a..f0e0a23 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -753,6 +753,17 @@ static int add_iommu_group(struct device *dev, void *data)
        return ops->add_device(dev);
 }
 
+static int remove_iommu_group(struct device *dev, void *data)
+{
+       struct iommu_callback_data *cb = data;
+       const struct iommu_ops *ops = cb->ops;
+
+       if (ops->remove_device && dev->iommu_group)
+               ops->remove_device(dev);
+
+       return 0;
+}
+
 static int iommu_bus_notifier(struct notifier_block *nb,
                              unsigned long action, void *data)
 {
@@ -821,19 +832,25 @@ static int iommu_bus_init(struct bus_type *bus, const 
struct iommu_ops *ops)
        nb->notifier_call = iommu_bus_notifier;
 
        err = bus_register_notifier(bus, nb);
-       if (err) {
-               kfree(nb);
-               return err;
-       }
+       if (err)
+               goto out_free;
 
        err = bus_for_each_dev(bus, NULL, &cb, add_iommu_group);
-       if (err) {
-               bus_unregister_notifier(bus, nb);
-               kfree(nb);
-               return err;
-       }
+       if (err)
+               goto out_err;
+
 
        return 0;
+
+out_err:
+       /* Clean up */
+       bus_for_each_dev(bus, NULL, &cb, remove_iommu_group);
+       bus_unregister_notifier(bus, nb);
+
+out_free:
+       kfree(nb);
+
+       return err;
 }
 
 /**
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to