OSDN Git Service

greybus: bundle: fix gb_bundle_destroy()
authorAlex Elder <elder@linaro.org>
Fri, 12 Jun 2015 15:21:11 +0000 (10:21 -0500)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 12 Jun 2015 19:14:24 +0000 (12:14 -0700)
Currently gb_bundle_destroy() takes an interface as an argument,
and really doesn't do what a function by that name should do.

What it now does is delete all bundles associated with a given
interface.  What it should do is destroy a single bundle.

Move the looping logic out of gb_bundle_destroy() and into its
caller, gb_interface_destroy().  Pass each bundle in an interface to
gb_bundle_destroy(), which will do what's required to destroy a
single bundle (including removing it from its interface's bundle
list under protection of the lock).

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/bundle.c
drivers/staging/greybus/bundle.h
drivers/staging/greybus/interface.c

index 89568b2..8d0e86f 100644 (file)
@@ -215,24 +215,14 @@ struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
 /*
  * Tear down a previously set up bundle.
  */
-void gb_bundle_destroy(struct gb_interface *intf)
+void gb_bundle_destroy(struct gb_bundle *bundle)
 {
-       LIST_HEAD(list);
-       struct gb_bundle *bundle;
-       struct gb_bundle *temp;
-
-       if (WARN_ON(!intf))
-               return;
-
        spin_lock_irq(&gb_bundles_lock);
-       list_splice_init(&intf->bundles, &list);
+       list_del(&bundle->links);
        spin_unlock_irq(&gb_bundles_lock);
 
-       list_for_each_entry_safe(bundle, temp, &list, links) {
-               list_del(&bundle->links);
-               gb_bundle_connections_exit(bundle);
-               device_unregister(&bundle->dev);
-       }
+       gb_bundle_connections_exit(bundle);
+       device_unregister(&bundle->dev);
 }
 
 int gb_bundle_init(struct gb_bundle *bundle, u8 device_id)
index 5c12c72..887883d 100644 (file)
@@ -31,7 +31,7 @@ struct gb_bundle {
 /* Greybus "private" definitions" */
 struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
                                   u8 class);
-void gb_bundle_destroy(struct gb_interface *intf);
+void gb_bundle_destroy(struct gb_bundle *bundle);
 int gb_bundle_init(struct gb_bundle *bundle, u8 device_id);
 int gb_bundles_init(struct gb_interface *intf, u8 device_id);
 
index 3483f84..5b1621c 100644 (file)
@@ -141,6 +141,8 @@ put_module:
 static void gb_interface_destroy(struct gb_interface *intf)
 {
        struct gb_module *module;
+       struct gb_bundle *bundle;
+       struct gb_bundle *next;
 
        if (WARN_ON(!intf))
                return;
@@ -149,11 +151,11 @@ static void gb_interface_destroy(struct gb_interface *intf)
        list_del(&intf->links);
        spin_unlock_irq(&gb_interfaces_lock);
 
-       gb_bundle_destroy(intf);
+       list_for_each_entry_safe(bundle, next, &intf->bundles, links)
+               gb_bundle_destroy(bundle);
 
        kfree(intf->product_string);
        kfree(intf->vendor_string);
-       /* kref_put(module->hd); */
 
        module = intf->module;
        device_unregister(&intf->dev);