projects
/
project
/
netifd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
aff7372
)
preserve interface main hotplug device on reload
author
Felix Fietkau
<nbd@openwrt.org>
Sat, 3 Mar 2012 19:55:03 +0000
(20:55 +0100)
committer
Felix Fietkau
<nbd@openwrt.org>
Sat, 3 Mar 2012 19:55:03 +0000
(20:55 +0100)
device.c
patch
|
blob
|
history
interface.c
patch
|
blob
|
history
diff --git
a/device.c
b/device.c
index
489c660
..
8f0e823
100644
(file)
--- 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)
{
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) {
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
(file)
--- a/
interface.c
+++ b/
interface.c
@@
-195,7
+195,7
@@
interface_claim_device(struct interface *iface)
static void
static void
-interface_cleanup(struct interface *iface)
+interface_cleanup(struct interface *iface
, bool reload
)
{
struct interface_user *dep, *tmp;
{
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);
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);
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)
{
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);
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)
{
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);
}
proto_init_interface(iface, iface->config);
interface_claim_device(iface);
}