aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/ip6_fib.h2
-rw-r--r--net/ipv6/ip6_fib.c18
-rw-r--r--net/ipv6/route.c16
3 files changed, 24 insertions, 12 deletions
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 0ae759a6c76e..209af13b0336 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -271,6 +271,8 @@ extern void fib6_run_gc(unsigned long expires,
271extern void fib6_gc_cleanup(void); 271extern void fib6_gc_cleanup(void);
272 272
273extern int fib6_init(void); 273extern int fib6_init(void);
274extern int fib6_init_late(void);
275extern void fib6_cleanup_late(void);
274 276
275#ifdef CONFIG_IPV6_MULTIPLE_TABLES 277#ifdef CONFIG_IPV6_MULTIPLE_TABLES
276extern int fib6_rules_init(void); 278extern int fib6_rules_init(void);
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 74c21b924a79..fbd4afff05fa 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1692,21 +1692,25 @@ int __init fib6_init(void)
1692 ret = register_pernet_subsys(&fib6_net_ops); 1692 ret = register_pernet_subsys(&fib6_net_ops);
1693 if (ret) 1693 if (ret)
1694 goto out_kmem_cache_create; 1694 goto out_kmem_cache_create;
1695
1696 ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib,
1697 NULL);
1698 if (ret)
1699 goto out_unregister_subsys;
1700out: 1695out:
1701 return ret; 1696 return ret;
1702 1697
1703out_unregister_subsys:
1704 unregister_pernet_subsys(&fib6_net_ops);
1705out_kmem_cache_create: 1698out_kmem_cache_create:
1706 kmem_cache_destroy(fib6_node_kmem); 1699 kmem_cache_destroy(fib6_node_kmem);
1707 goto out; 1700 goto out;
1708} 1701}
1709 1702
1703int __init fib6_init_late(void)
1704{
1705 return __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib,
1706 NULL);
1707}
1708
1709void fib6_cleanup_late(void)
1710{
1711 rtnl_unregister(PF_INET6, RTM_GETROUTE);
1712}
1713
1710void fib6_gc_cleanup(void) 1714void fib6_gc_cleanup(void)
1711{ 1715{
1712 unregister_pernet_subsys(&fib6_net_ops); 1716 unregister_pernet_subsys(&fib6_net_ops);
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 999a982ad3fd..dc60bf585966 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -3018,10 +3018,14 @@ int __init ip6_route_init(void)
3018 if (ret) 3018 if (ret)
3019 goto out_kmem_cache; 3019 goto out_kmem_cache;
3020 3020
3021 ret = register_pernet_subsys(&ip6_route_net_ops); 3021 ret = fib6_init();
3022 if (ret) 3022 if (ret)
3023 goto out_dst_entries; 3023 goto out_dst_entries;
3024 3024
3025 ret = register_pernet_subsys(&ip6_route_net_ops);
3026 if (ret)
3027 goto out_fib6_init;
3028
3025 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep; 3029 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
3026 3030
3027 /* Registering of the loopback is done before this portion of code, 3031 /* Registering of the loopback is done before this portion of code,
@@ -3035,13 +3039,13 @@ int __init ip6_route_init(void)
3035 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; 3039 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
3036 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); 3040 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3037 #endif 3041 #endif
3038 ret = fib6_init(); 3042 ret = fib6_init_late();
3039 if (ret) 3043 if (ret)
3040 goto out_register_subsys; 3044 goto out_register_subsys;
3041 3045
3042 ret = xfrm6_init(); 3046 ret = xfrm6_init();
3043 if (ret) 3047 if (ret)
3044 goto out_fib6_init; 3048 goto out_fib6_init_late;
3045 3049
3046 ret = fib6_rules_init(); 3050 ret = fib6_rules_init();
3047 if (ret) 3051 if (ret)
@@ -3064,10 +3068,12 @@ fib6_rules_init:
3064 fib6_rules_cleanup(); 3068 fib6_rules_cleanup();
3065xfrm6_init: 3069xfrm6_init:
3066 xfrm6_fini(); 3070 xfrm6_fini();
3067out_fib6_init: 3071out_fib6_init_late:
3068 fib6_gc_cleanup(); 3072 fib6_cleanup_late();
3069out_register_subsys: 3073out_register_subsys:
3070 unregister_pernet_subsys(&ip6_route_net_ops); 3074 unregister_pernet_subsys(&ip6_route_net_ops);
3075out_fib6_init:
3076 fib6_gc_cleanup();
3071out_dst_entries: 3077out_dst_entries:
3072 dst_entries_destroy(&ip6_dst_blackhole_ops); 3078 dst_entries_destroy(&ip6_dst_blackhole_ops);
3073out_kmem_cache: 3079out_kmem_cache: