This patch moves initialization of IPv6 sysctl stuff at the end of
IPv6 initialization.
This will be helpful for network namespaces where some sysctl entries
depend on per-namespace variables, that need to be allocated and
initialized before they are referenced by sysctl.
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        err = register_pernet_subsys(&inet6_net_ops);
        if (err)
                goto register_pernet_fail;
-
-#ifdef CONFIG_SYSCTL
-       err = ipv6_sysctl_register();
-       if (err)
-               goto sysctl_fail;
-#endif
        err = icmpv6_init();
        if (err)
                goto icmp_fail;
        err = ipv6_packet_init();
        if (err)
                goto ipv6_packet_fail;
+
+#ifdef CONFIG_SYSCTL
+       err = ipv6_sysctl_register();
+       if (err)
+               goto sysctl_fail;
+#endif
 out:
        return err;
 
+#ifdef CONFIG_SYSCTL
+sysctl_fail:
+       ipv6_packet_cleanup();
+#endif
 ipv6_packet_fail:
        tcpv6_exit();
 tcpv6_fail:
 ndisc_fail:
        icmpv6_cleanup();
 icmp_fail:
-#ifdef CONFIG_SYSCTL
-       ipv6_sysctl_unregister();
-sysctl_fail:
-#endif
        unregister_pernet_subsys(&inet6_net_ops);
 register_pernet_fail:
        cleanup_ipv6_mibs();
        /* Disallow any further netlink messages */
        rtnl_unregister_all(PF_INET6);
 
+#ifdef CONFIG_SYSCTL
+       ipv6_sysctl_unregister();
+#endif
        udpv6_exit();
 #ifdef CONFIG_IP_UDPLITE
        udplitev6_exit();
        ndisc_cleanup();
        icmpv6_cleanup();
        rawv6_exit();
-#ifdef CONFIG_SYSCTL
-       ipv6_sysctl_unregister();
-#endif
+
        unregister_pernet_subsys(&inet6_net_ops);
        cleanup_ipv6_mibs();
        proto_unregister(&rawv6_prot);