diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/route.c | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3afc3f4..5d9d293 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -2377,40 +2377,6 @@ static const struct file_operations rt6_stats_seq_fops = { .llseek = seq_lseek, .release = single_release, }; - -static int ipv6_route_proc_init(struct net *net) -{ - int ret = -ENOMEM; - if (!proc_net_fops_create(net, "ipv6_route", - 0, &ipv6_route_proc_fops)) - goto out; - - if (!proc_net_fops_create(net, "rt6_stats", - S_IRUGO, &rt6_stats_seq_fops)) - goto out_ipv6_route; - - ret = 0; -out: - return ret; -out_ipv6_route: - proc_net_remove(net, "ipv6_route"); - goto out; -} - -static void ipv6_route_proc_fini(struct net *net) -{ - proc_net_remove(net, "ipv6_route"); - proc_net_remove(net, "rt6_stats"); -} -#else -static inline int ipv6_route_proc_init(struct net *net) -{ - return 0; -} -static inline void ipv6_route_proc_fini(struct net *net) -{ - return ; -} #endif /* CONFIG_PROC_FS */ #ifdef CONFIG_SYSCTL @@ -2544,6 +2510,28 @@ struct ctl_table *ipv6_route_sysctl_init(struct net *net) } #endif +static int ip6_route_net_init(struct net *net) +{ +#ifdef CONFIG_PROC_FS + proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops); + proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops); +#endif + return 0; +} + +static void ip6_route_net_exit(struct net *net) +{ +#ifdef CONFIG_PROC_FS + proc_net_remove(net, "ipv6_route"); + proc_net_remove(net, "rt6_stats"); +#endif +} + +static struct pernet_operations ip6_route_net_ops = { + .init = ip6_route_net_init, + .exit = ip6_route_net_exit, +}; + int __init ip6_route_init(void) { int ret; @@ -2560,13 +2548,9 @@ int __init ip6_route_init(void) if (ret) goto out_kmem_cache; - ret = ipv6_route_proc_init(&init_net); - if (ret) - goto out_fib6_init; - ret = xfrm6_init(); if (ret) - goto out_proc_init; + goto out_fib6_init; ret = fib6_rules_init(); if (ret) @@ -2578,7 +2562,9 @@ int __init ip6_route_init(void) __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL)) goto fib6_rules_init; - ret = 0; + ret = register_pernet_subsys(&ip6_route_net_ops); + if (ret) + goto fib6_rules_init; out: return ret; @@ -2586,8 +2572,6 @@ fib6_rules_init: fib6_rules_cleanup(); xfrm6_init: xfrm6_fini(); -out_proc_init: - ipv6_route_proc_fini(&init_net); out_fib6_init: rt6_ifdown(&init_net, NULL); fib6_gc_cleanup(); @@ -2598,8 +2582,8 @@ out_kmem_cache: void ip6_route_cleanup(void) { + unregister_pernet_subsys(&ip6_route_net_ops); fib6_rules_cleanup(); - ipv6_route_proc_fini(&init_net); xfrm6_fini(); rt6_ifdown(&init_net, NULL); fib6_gc_cleanup(); |