#endif
 
 #ifdef CONFIG_XFRM_STATISTICS
-extern int xfrm_proc_init(void);
+extern int xfrm_proc_init(struct net *net);
+extern void xfrm_proc_fini(struct net *net);
 #endif
 
 extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
 
 #ifdef CONFIG_XFRM_STATISTICS
 static int __net_init xfrm_statistics_init(struct net *net)
 {
+       int rv;
+
        if (snmp_mib_init((void **)net->mib.xfrm_statistics,
                          sizeof(struct linux_xfrm_mib)) < 0)
                return -ENOMEM;
-       return 0;
+       rv = xfrm_proc_init(net);
+       if (rv < 0)
+               snmp_mib_free((void **)net->mib.xfrm_statistics);
+       return rv;
 }
 
 static void xfrm_statistics_fini(struct net *net)
 {
+       xfrm_proc_fini(net);
        snmp_mib_free((void **)net->mib.xfrm_statistics);
 }
 #else
 {
        register_pernet_subsys(&xfrm_net_ops);
        xfrm_input_init();
-#ifdef CONFIG_XFRM_STATISTICS
-       xfrm_proc_init();
-#endif
 }
 
 #ifdef CONFIG_AUDITSYSCALL
 
 
 static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
 {
+       struct net *net = seq->private;
        int i;
        for (i=0; xfrm_mib_list[i].name; i++)
                seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name,
-                          fold_field((void **)init_net.mib.xfrm_statistics,
+                          fold_field((void **)net->mib.xfrm_statistics,
                                      xfrm_mib_list[i].entry));
        return 0;
 }
 
 static int xfrm_statistics_seq_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, xfrm_statistics_seq_show, NULL);
+       return single_open_net(inode, file, xfrm_statistics_seq_show);
 }
 
 static struct file_operations xfrm_statistics_seq_fops = {
        .open    = xfrm_statistics_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
-       .release = single_release,
+       .release = single_release_net,
 };
 
-int __init xfrm_proc_init(void)
+int __net_init xfrm_proc_init(struct net *net)
 {
-       int rc = 0;
-
-       if (!proc_net_fops_create(&init_net, "xfrm_stat", S_IRUGO,
+       if (!proc_net_fops_create(net, "xfrm_stat", S_IRUGO,
                                  &xfrm_statistics_seq_fops))
-               goto stat_fail;
-
- out:
-       return rc;
+               return -ENOMEM;
+       return 0;
+}
 
- stat_fail:
-       rc = -ENOMEM;
-       goto out;
+void xfrm_proc_fini(struct net *net)
+{
+       proc_net_remove(net, "xfrm_stat");
 }