[NETNS][IPV6] tcp6 - make proc per namespace
authorDaniel Lezcano <dlezcano@fr.ibm.com>
Fri, 21 Mar 2008 11:14:45 +0000 (04:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Mar 2008 11:14:45 +0000 (04:14 -0700)
Make the proc for tcp6 to be per namespace.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ipv6.h
include/net/tcp.h
net/ipv4/tcp_ipv4.c
net/ipv6/af_inet6.c
net/ipv6/tcp_ipv6.c

index e01a563132e8dad9e2ec1d35c62ab733450af757..e82f1814d96bbc34fcd6eb20035ef4558a5a1206 100644 (file)
@@ -595,8 +595,8 @@ extern int  ac6_proc_init(void);
 extern void ac6_proc_exit(void);
 extern int  raw6_proc_init(void);
 extern void raw6_proc_exit(void);
-extern int  tcp6_proc_init(void);
-extern void tcp6_proc_exit(void);
+extern int  tcp6_proc_init(struct net *net);
+extern void tcp6_proc_exit(struct net *net);
 extern int  udp6_proc_init(struct net *net);
 extern void udp6_proc_exit(struct net *net);
 extern int  udplite6_proc_init(void);
index 6b08dab1b1fab6446ec9417d83aef30425934a68..847e1634e1f4b0db17c21687bb7f473257b511bc 100644 (file)
@@ -1336,8 +1336,8 @@ struct tcp_iter_state {
        struct seq_operations   seq_ops;
 };
 
-extern int tcp_proc_register(struct tcp_seq_afinfo *afinfo);
-extern void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo);
+extern int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
+extern void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
 
 extern struct request_sock_ops tcp_request_sock_ops;
 extern struct request_sock_ops tcp6_request_sock_ops;
index f9b30dc3bd6cedf422467ff46520c582c328feba..744bc9d6cebc111c28e708ec536e6c068afa14c7 100644 (file)
@@ -2253,7 +2253,7 @@ static int tcp_seq_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-int tcp_proc_register(struct tcp_seq_afinfo *afinfo)
+int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo)
 {
        int rc = 0;
        struct proc_dir_entry *p;
@@ -2266,7 +2266,7 @@ int tcp_proc_register(struct tcp_seq_afinfo *afinfo)
        afinfo->seq_fops->llseek        = seq_lseek;
        afinfo->seq_fops->release       = tcp_seq_release;
 
-       p = proc_net_fops_create(&init_net, afinfo->name, S_IRUGO, afinfo->seq_fops);
+       p = proc_net_fops_create(net, afinfo->name, S_IRUGO, afinfo->seq_fops);
        if (p)
                p->data = afinfo;
        else
@@ -2274,11 +2274,11 @@ int tcp_proc_register(struct tcp_seq_afinfo *afinfo)
        return rc;
 }
 
-void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo)
+void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo)
 {
        if (!afinfo)
                return;
-       proc_net_remove(&init_net, afinfo->name);
+       proc_net_remove(net, afinfo->name);
        memset(afinfo->seq_fops, 0, sizeof(*afinfo->seq_fops));
 }
 
@@ -2419,12 +2419,12 @@ static struct tcp_seq_afinfo tcp4_seq_afinfo = {
 
 int __init tcp4_proc_init(void)
 {
-       return tcp_proc_register(&tcp4_seq_afinfo);
+       return tcp_proc_register(&init_net, &tcp4_seq_afinfo);
 }
 
 void tcp4_proc_exit(void)
 {
-       tcp_proc_unregister(&tcp4_seq_afinfo);
+       tcp_proc_unregister(&init_net, &tcp4_seq_afinfo);
 }
 #endif /* CONFIG_PROC_FS */
 
index e3e09147d13403d2ed757ab480ff3d0e6cca3f27..f52bdaed8a1b246c98a24e0faa6ba16853a7aebb 100644 (file)
@@ -859,15 +859,25 @@ static int inet6_net_init(struct net *net)
        err = udp6_proc_init(net);
        if (err)
                goto out;
+       err = tcp6_proc_init(net);
+       if (err)
+               goto proc_tcp6_fail;
 out:
 #endif
        return err;
+
+#ifdef CONFIG_PROC_FS
+proc_tcp6_fail:
+       udp6_proc_exit(net);
+       goto out;
+#endif
 }
 
 static void inet6_net_exit(struct net *net)
 {
 #ifdef CONFIG_PROC_FS
        udp6_proc_exit(net);
+       tcp6_proc_exit(net);
 #endif
 }
 
@@ -951,8 +961,6 @@ static int __init inet6_init(void)
        err = -ENOMEM;
        if (raw6_proc_init())
                goto proc_raw6_fail;
-       if (tcp6_proc_init())
-               goto proc_tcp6_fail;
        if (udplite6_proc_init())
                goto proc_udplite6_fail;
        if (ipv6_misc_proc_init())
@@ -1037,8 +1045,6 @@ proc_anycast6_fail:
 proc_misc6_fail:
        udplite6_proc_exit();
 proc_udplite6_fail:
-       tcp6_proc_exit();
-proc_tcp6_fail:
        raw6_proc_exit();
 proc_raw6_fail:
 #endif
@@ -1098,7 +1104,6 @@ static void __exit inet6_exit(void)
        ac6_proc_exit();
        ipv6_misc_proc_exit();
        udplite6_proc_exit();
-       tcp6_proc_exit();
        raw6_proc_exit();
 #endif
        ipv6_netfilter_fini();
index caf0cc1c00e1675482c3f39a83f417a95cad3ff1..56d0cea7d578cd211b049f01a139c5dc55926d2d 100644 (file)
@@ -2129,14 +2129,14 @@ static struct tcp_seq_afinfo tcp6_seq_afinfo = {
        .seq_fops       = &tcp6_seq_fops,
 };
 
-int __init tcp6_proc_init(void)
+int tcp6_proc_init(struct net *net)
 {
-       return tcp_proc_register(&tcp6_seq_afinfo);
+       return tcp_proc_register(net, &tcp6_seq_afinfo);
 }
 
-void tcp6_proc_exit(void)
+void tcp6_proc_exit(struct net *net)
 {
-       tcp_proc_unregister(&tcp6_seq_afinfo);
+       tcp_proc_unregister(net, &tcp6_seq_afinfo);
 }
 #endif