From d6e85a794f5f13e14d0331e575b794d2c552cf89 Mon Sep 17 00:00:00 2001 From: Neil Horman Date: Fri, 24 Sep 2010 09:55:52 +0000 Subject: [PATCH] --- yaml --- r: 211121 b: refs/heads/master c: 2cc6d2bf3d6195fabcf0febc192c01f99519a8f3 h: refs/heads/master i: 211119: 7bf874ff63dcd5316eb60fd6fdef322df4bd6934 v: v3 --- [refs] | 2 +- trunk/include/net/addrconf.h | 1 + trunk/net/ipv6/addrconf.c | 11 ++++++++--- trunk/net/ipv6/addrlabel.c | 5 +++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 2128b86da603..3117a48062da 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bc68580d41b131396054a1a04a7df4948555ed97 +refs/heads/master: 2cc6d2bf3d6195fabcf0febc192c01f99519a8f3 diff --git a/trunk/include/net/addrconf.h b/trunk/include/net/addrconf.h index 45375b41a2a0..4d40c4d0230b 100644 --- a/trunk/include/net/addrconf.h +++ b/trunk/include/net/addrconf.h @@ -121,6 +121,7 @@ static inline int addrconf_finite_timeout(unsigned long timeout) * IPv6 Address Label subsystem (addrlabel.c) */ extern int ipv6_addr_label_init(void); +extern void ipv6_addr_label_cleanup(void); extern void ipv6_addr_label_rtnl_register(void); extern u32 ipv6_addr_label(struct net *net, const struct in6_addr *addr, diff --git a/trunk/net/ipv6/addrconf.c b/trunk/net/ipv6/addrconf.c index ab70a3fbcafa..324fac3b6c16 100644 --- a/trunk/net/ipv6/addrconf.c +++ b/trunk/net/ipv6/addrconf.c @@ -4637,10 +4637,12 @@ int __init addrconf_init(void) if (err < 0) { printk(KERN_CRIT "IPv6 Addrconf:" " cannot initialize default policy table: %d.\n", err); - return err; + goto out; } - register_pernet_subsys(&addrconf_ops); + err = register_pernet_subsys(&addrconf_ops); + if (err < 0) + goto out_addrlabel; /* The addrconf netdev notifier requires that loopback_dev * has it's ipv6 private information allocated and setup @@ -4692,7 +4694,9 @@ int __init addrconf_init(void) unregister_netdevice_notifier(&ipv6_dev_notf); errlo: unregister_pernet_subsys(&addrconf_ops); - +out_addrlabel: + ipv6_addr_label_cleanup(); +out: return err; } @@ -4703,6 +4707,7 @@ void addrconf_cleanup(void) unregister_netdevice_notifier(&ipv6_dev_notf); unregister_pernet_subsys(&addrconf_ops); + ipv6_addr_label_cleanup(); rtnl_lock(); diff --git a/trunk/net/ipv6/addrlabel.c b/trunk/net/ipv6/addrlabel.c index f0e774cea386..8175f802651b 100644 --- a/trunk/net/ipv6/addrlabel.c +++ b/trunk/net/ipv6/addrlabel.c @@ -393,6 +393,11 @@ int __init ipv6_addr_label_init(void) return register_pernet_subsys(&ipv6_addr_label_ops); } +void ipv6_addr_label_cleanup(void) +{ + unregister_pernet_subsys(&ipv6_addr_label_ops); +} + static const struct nla_policy ifal_policy[IFAL_MAX+1] = { [IFAL_ADDRESS] = { .len = sizeof(struct in6_addr), }, [IFAL_LABEL] = { .len = sizeof(u32), },