if (err < 0)
                goto err_assign;
 
+       err = vlan_proc_init(net);
+       if (err < 0)
+               goto err_proc;
+
        return 0;
 
+err_proc:
+       /* nothing */
 err_assign:
        kfree(vn);
 err_alloc:
        struct vlan_net *vn;
 
        vn = net_generic(net, vlan_net_id);
+       vlan_proc_cleanup(net);
        kfree(vn);
 }
 
        if (err < 0)
                goto err0;
 
-       err = vlan_proc_init();
-       if (err < 0)
-               goto err1;
-
        err = register_netdevice_notifier(&vlan_notifier_block);
        if (err < 0)
                goto err2;
 err3:
        unregister_netdevice_notifier(&vlan_notifier_block);
 err2:
-       vlan_proc_cleanup();
-err1:
        unregister_pernet_gen_device(vlan_net_id, &vlan_net_ops);
 err0:
        return err;
        for (i = 0; i < VLAN_GRP_HASH_SIZE; i++)
                BUG_ON(!hlist_empty(&vlan_group_hash[i]));
 
-       vlan_proc_cleanup();
-
        unregister_pernet_gen_device(vlan_net_id, &vlan_net_ops);
 
        synchronize_net();
 
  *     Clean up /proc/net/vlan entries
  */
 
-void vlan_proc_cleanup(void)
+void vlan_proc_cleanup(struct net *net)
 {
+       if (net != &init_net)
+               return;
+
        if (proc_vlan_conf)
                remove_proc_entry(name_conf, proc_vlan_dir);
 
  *     Create /proc/net/vlan entries
  */
 
-int __init vlan_proc_init(void)
+int vlan_proc_init(struct net *net)
 {
+       if (net != &init_net)
+               return 0;
+
        proc_vlan_dir = proc_mkdir(name_root, init_net.proc_net);
        if (!proc_vlan_dir)
                goto err;
 
 err:
        pr_err("%s: can't create entry in proc filesystem!\n", __func__);
-       vlan_proc_cleanup();
+       vlan_proc_cleanup(net);
        return -ENOBUFS;
 }
 
 
 #define __BEN_VLAN_PROC_INC__
 
 #ifdef CONFIG_PROC_FS
-int vlan_proc_init(void);
+struct net;
+
+int vlan_proc_init(struct net *net);
 int vlan_proc_rem_dev(struct net_device *vlandev);
 int vlan_proc_add_dev(struct net_device *vlandev);
-void vlan_proc_cleanup(void);
+void vlan_proc_cleanup(struct net *net);
 
 #else /* No CONFIG_PROC_FS */
 
-#define vlan_proc_init()       (0)
-#define vlan_proc_cleanup()    do {} while (0)
+#define vlan_proc_init(net)    (0)
+#define vlan_proc_cleanup(net) do {} while (0)
 #define vlan_proc_add_dev(dev) ({(void)(dev), 0; })
 #define vlan_proc_rem_dev(dev) ({(void)(dev), 0; })
 #endif