diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-03-03 20:55:03 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-03-03 20:55:03 +0100 |
commit | f5f78c1eca1fe2df04dae56a4d9f024533066b29 (patch) | |
tree | d224a80554f4ee56a9a4db6547ba808de2d0e494 | |
parent | aff73720b65ca33a487c813f27644f8d5aea0df1 (diff) |
preserve interface main hotplug device on reload
-rw-r--r-- | device.c | 3 | ||||
-rw-r--r-- | interface.c | 9 |
2 files changed, 8 insertions, 4 deletions
@@ -465,6 +465,9 @@ device_set_disabled(struct device *dev, bool value) void device_add_user(struct device_user *dep, struct device *dev) { + if (dep->dev) + device_remove_user(dep); + dep->dev = dev; list_add_tail(&dep->list, &dev->users); if (dep->cb && dev->present) { diff --git a/interface.c b/interface.c index 2404878..6e3feeb 100644 --- a/interface.c +++ b/interface.c @@ -195,7 +195,7 @@ interface_claim_device(struct interface *iface) static void -interface_cleanup(struct interface *iface) +interface_cleanup(struct interface *iface, bool reload) { struct interface_user *dep, *tmp; @@ -205,7 +205,8 @@ interface_cleanup(struct interface *iface) interface_ip_flush(&iface->config_ip); interface_flush_state(iface); interface_clear_errors(iface); - if (iface->main_dev.dev) + if (iface->main_dev.dev && + (!reload || !iface->main_dev.hotplug)) device_remove_user(&iface->main_dev); iface->l3_dev = &iface->main_dev; interface_set_proto_state(iface, NULL); @@ -214,7 +215,7 @@ interface_cleanup(struct interface *iface) static void interface_do_free(struct interface *iface) { - interface_cleanup(iface); + interface_cleanup(iface, false); free(iface->config); netifd_ubus_remove_interface(iface); avl_delete(&interfaces.avl, &iface->node.avl); @@ -224,7 +225,7 @@ interface_do_free(struct interface *iface) static void interface_do_reload(struct interface *iface) { - interface_cleanup(iface); + interface_cleanup(iface, true); proto_init_interface(iface, iface->config); interface_claim_device(iface); } |