[NETNS][IPV6] route6 - create route6 proc files for the namespace
authorDaniel Lezcano <dlezcano@fr.ibm.com>
Tue, 4 Mar 2008 21:45:33 +0000 (13:45 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Mar 2008 21:45:33 +0000 (13:45 -0800)
Make /proc/net/ipv6_route and /proc/net/rt6_stats to be per namespace.
These proc files are now created when the network namespace is
initialized.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/route.c

index 3afc3f41f2d5a9af8e6a35e9d5eff99b26a87a3c..5d9d293156cd861f4795446b47593e8d735767bf 100644 (file)
@@ -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();