do not attempt to get an interface if PROTO_FLAG_NODEV is set
[project/netifd.git] / device.c
index c02335c..3f83cb4 100644 (file)
--- a/device.c
+++ b/device.c
@@ -261,6 +261,15 @@ void device_add_user(struct device_user *dep, struct device *dev)
        }
 }
 
+static void
+__device_free_unused(struct device *dev)
+{
+       if (!list_empty(&dev->users))
+               return;
+
+       device_free(dev);
+}
+
 void device_remove_user(struct device_user *dep)
 {
        struct device *dev = dep->dev;
@@ -269,24 +278,18 @@ void device_remove_user(struct device_user *dep)
                device_release(dep);
 
        list_del(&dep->list);
-
-       if (list_empty(&dev->users)) {
-               /* all references have gone away, remove this device */
-               device_free(dev);
-       }
-
        dep->dev = NULL;
+       __device_free_unused(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);
 }