improve interface for cleaning up unused devices
authorFelix Fietkau <nbd@openwrt.org>
Mon, 5 Sep 2011 01:55:54 +0000 (03:55 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 5 Sep 2011 01:55:54 +0000 (03:55 +0200)
config.c
device.c
device.h

index 1649cee..2fba534 100644 (file)
--- a/config.c
+++ b/config.c
@@ -221,7 +221,7 @@ config_init_interfaces(const char *name)
                if (!strcmp(s->type, "interface"))
                        config_parse_interface(s);
        }
-       device_free_all();
+       device_free_unused(NULL);
        config_init = false;
 
        interface_start_pending();
index c02335c..e206a76 100644 (file)
--- a/device.c
+++ b/device.c
@@ -278,15 +278,23 @@ void device_remove_user(struct device_user *dep)
        dep->dev = NULL;
 }
 
+static void
+__device_free_unused(struct device *dev)
+{
+       if (!list_empty(&dev->users))
+               return;
+
+       device_free(dev);
+}
+
 void
-device_free_all(void)
+device_free_unused(struct device *dev)
 {
-       struct device *dev, *tmp;
+       struct device *tmp;
 
-       avl_for_each_element_safe(&devices, dev, avl, tmp) {
-               if (!list_empty(&dev->users))
-                       continue;
+       if (dev)
+               return __device_free_unused(dev);
 
-               device_free(dev);
-       }
+       avl_for_each_element_safe(&devices, dev, avl, tmp)
+               __device_free_unused(dev);
 }
index 63ffb21..1abd567 100644 (file)
--- a/device.h
+++ b/device.h
@@ -158,7 +158,7 @@ device_free(struct device *dev)
        dev->type->free(dev);
 }
 
-void device_free_all(void);
+void device_free_unused(struct device *dev);
 
 struct device *get_vlan_device_chain(const char *ifname, bool create);