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>
 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);
 
        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;
 
        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;
        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
        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));
 }
 
 
 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 */
 
 
        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
 }
 
        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())
 proc_misc6_fail:
        udplite6_proc_exit();
 proc_udplite6_fail:
-       tcp6_proc_exit();
-proc_tcp6_fail:
        raw6_proc_exit();
 proc_raw6_fail:
 #endif
        ac6_proc_exit();
        ipv6_misc_proc_exit();
        udplite6_proc_exit();
-       tcp6_proc_exit();
        raw6_proc_exit();
 #endif
        ipv6_netfilter_fini();
 
        .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