X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=device.c;h=0a33f67f3de1b4eafb4c760883a157e495dbae63;hp=11363807b834b69985204e02e7b52266affad082;hb=d16871c7a55370174eb672edee24feade74cd37e;hpb=ccca61c97d460d73f29750abdf38cea20ac440f3 diff --git a/device.c b/device.c index 1136380..0a33f67 100644 --- a/device.c +++ b/device.c @@ -41,6 +41,20 @@ const struct config_param_list device_attr_list = { .params = dev_attrs, }; +static int __devlock = 0; + +void device_lock(void) +{ + __devlock++; +} + +void device_unlock(void) +{ + __devlock--; + if (!__devlock) + device_free_unused(NULL); +} + static struct device * simple_device_create(const char *name, struct blob_attr *attr) { @@ -172,6 +186,8 @@ alias_notify_device(const char *name, struct device *dev) { struct alias_device *alias; + device_lock(); + alias = avl_find_element(&aliases, name, alias, avl); if (!alias) return; @@ -189,6 +205,8 @@ alias_notify_device(const char *name, struct device *dev) if (!dev && alias->dep.dev && !alias->dep.dev->active) device_remove_user(&alias->dep); + + device_unlock(); } static int set_device_state(struct device *dev, bool state) @@ -398,6 +416,7 @@ void device_remove_user(struct device_user *dep) if (!dep->dev) return; + dep->hotplug = false; if (dep->claimed) device_release(dep);