xref: /linux/kernel/nscommon.c (revision 5890f504ef543190beae2a4e244bbfa7c3e0b57c)
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