From f5f78c1eca1fe2df04dae56a4d9f024533066b29 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 3 Mar 2012 20:55:03 +0100 Subject: preserve interface main hotplug device on reload --- device.c | 3 +++ interface.c | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/device.c b/device.c index 489c660..8f0e823 100644 --- a/device.c +++ b/device.c @@ -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); } -- cgit v1.2.3