1f74ca6daSChristian Brauner // SPDX-License-Identifier: GPL-2.0-only 2f74ca6daSChristian Brauner 3f74ca6daSChristian Brauner #include <linux/ns_common.h> 45612ff3eSChristian Brauner #include <linux/proc_ns.h> 5*5890f504SChristian Brauner #include <linux/vfsdebug.h> 6*5890f504SChristian Brauner 7*5890f504SChristian Brauner #ifdef CONFIG_DEBUG_VFS 8*5890f504SChristian Brauner static void ns_debug(struct ns_common *ns, const struct proc_ns_operations *ops) 9*5890f504SChristian Brauner { 10*5890f504SChristian Brauner switch (ns->ops->type) { 11*5890f504SChristian Brauner #ifdef CONFIG_CGROUPS 12*5890f504SChristian Brauner case CLONE_NEWCGROUP: 13*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &cgroupns_operations); 14*5890f504SChristian Brauner break; 15*5890f504SChristian Brauner #endif 16*5890f504SChristian Brauner #ifdef CONFIG_IPC_NS 17*5890f504SChristian Brauner case CLONE_NEWIPC: 18*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &ipcns_operations); 19*5890f504SChristian Brauner break; 20*5890f504SChristian Brauner #endif 21*5890f504SChristian Brauner case CLONE_NEWNS: 22*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &mntns_operations); 23*5890f504SChristian Brauner break; 24*5890f504SChristian Brauner #ifdef CONFIG_NET_NS 25*5890f504SChristian Brauner case CLONE_NEWNET: 26*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &netns_operations); 27*5890f504SChristian Brauner break; 28*5890f504SChristian Brauner #endif 29*5890f504SChristian Brauner #ifdef CONFIG_PID_NS 30*5890f504SChristian Brauner case CLONE_NEWPID: 31*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &pidns_operations); 32*5890f504SChristian Brauner break; 33*5890f504SChristian Brauner #endif 34*5890f504SChristian Brauner #ifdef CONFIG_TIME_NS 35*5890f504SChristian Brauner case CLONE_NEWTIME: 36*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &timens_operations); 37*5890f504SChristian Brauner break; 38*5890f504SChristian Brauner #endif 39*5890f504SChristian Brauner #ifdef CONFIG_USER_NS 40*5890f504SChristian Brauner case CLONE_NEWUSER: 41*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &userns_operations); 42*5890f504SChristian Brauner break; 43*5890f504SChristian Brauner #endif 44*5890f504SChristian Brauner #ifdef CONFIG_UTS_NS 45*5890f504SChristian Brauner case CLONE_NEWUTS: 46*5890f504SChristian Brauner VFS_WARN_ON_ONCE(ops != &utsns_operations); 47*5890f504SChristian Brauner break; 48*5890f504SChristian Brauner #endif 49*5890f504SChristian Brauner default: 50*5890f504SChristian Brauner VFS_WARN_ON_ONCE(true); 51*5890f504SChristian Brauner } 52*5890f504SChristian Brauner } 53*5890f504SChristian Brauner #endif 54f74ca6daSChristian Brauner 555612ff3eSChristian Brauner int __ns_common_init(struct ns_common *ns, const struct proc_ns_operations *ops, int inum) 56f74ca6daSChristian Brauner { 57024596a4SChristian Brauner refcount_set(&ns->__ns_ref, 1); 58f74ca6daSChristian Brauner ns->stashed = NULL; 59f74ca6daSChristian Brauner ns->ops = ops; 60f74ca6daSChristian Brauner ns->ns_id = 0; 61f74ca6daSChristian Brauner RB_CLEAR_NODE(&ns->ns_tree_node); 62f74ca6daSChristian Brauner INIT_LIST_HEAD(&ns->ns_list_node); 635612ff3eSChristian Brauner 64*5890f504SChristian Brauner #ifdef CONFIG_DEBUG_VFS 65*5890f504SChristian Brauner ns_debug(ns, ops); 66*5890f504SChristian Brauner #endif 67*5890f504SChristian Brauner 685612ff3eSChristian Brauner if (inum) { 695612ff3eSChristian Brauner ns->inum = inum; 70f74ca6daSChristian Brauner return 0; 71f74ca6daSChristian Brauner } 725612ff3eSChristian Brauner return proc_alloc_inum(&ns->inum); 735612ff3eSChristian Brauner } 74be5f21d3SChristian Brauner 75be5f21d3SChristian Brauner void __ns_common_free(struct ns_common *ns) 76be5f21d3SChristian Brauner { 77be5f21d3SChristian Brauner proc_free_inum(ns->inum); 78be5f21d3SChristian Brauner } 79