xref: /linux/kernel/nscommon.c (revision 18b19abc3709b109676ffd1f48dcd332c2e477d4)
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>
55890f504SChristian Brauner #include <linux/vfsdebug.h>
65890f504SChristian Brauner 
75890f504SChristian Brauner #ifdef CONFIG_DEBUG_VFS
ns_debug(struct ns_common * ns,const struct proc_ns_operations * ops)85890f504SChristian Brauner static void ns_debug(struct ns_common *ns, const struct proc_ns_operations *ops)
95890f504SChristian Brauner {
10*4055526dSChristian Brauner 	switch (ns->ns_type) {
115890f504SChristian Brauner #ifdef CONFIG_CGROUPS
125890f504SChristian Brauner 	case CLONE_NEWCGROUP:
135890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &cgroupns_operations);
145890f504SChristian Brauner 		break;
155890f504SChristian Brauner #endif
165890f504SChristian Brauner #ifdef CONFIG_IPC_NS
175890f504SChristian Brauner 	case CLONE_NEWIPC:
185890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &ipcns_operations);
195890f504SChristian Brauner 		break;
205890f504SChristian Brauner #endif
215890f504SChristian Brauner 	case CLONE_NEWNS:
225890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &mntns_operations);
235890f504SChristian Brauner 		break;
245890f504SChristian Brauner #ifdef CONFIG_NET_NS
255890f504SChristian Brauner 	case CLONE_NEWNET:
265890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &netns_operations);
275890f504SChristian Brauner 		break;
285890f504SChristian Brauner #endif
295890f504SChristian Brauner #ifdef CONFIG_PID_NS
305890f504SChristian Brauner 	case CLONE_NEWPID:
315890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &pidns_operations);
325890f504SChristian Brauner 		break;
335890f504SChristian Brauner #endif
345890f504SChristian Brauner #ifdef CONFIG_TIME_NS
355890f504SChristian Brauner 	case CLONE_NEWTIME:
365890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &timens_operations);
375890f504SChristian Brauner 		break;
385890f504SChristian Brauner #endif
395890f504SChristian Brauner #ifdef CONFIG_USER_NS
405890f504SChristian Brauner 	case CLONE_NEWUSER:
415890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &userns_operations);
425890f504SChristian Brauner 		break;
435890f504SChristian Brauner #endif
445890f504SChristian Brauner #ifdef CONFIG_UTS_NS
455890f504SChristian Brauner 	case CLONE_NEWUTS:
465890f504SChristian Brauner 		VFS_WARN_ON_ONCE(ops != &utsns_operations);
475890f504SChristian Brauner 		break;
485890f504SChristian Brauner #endif
495890f504SChristian Brauner 	}
505890f504SChristian Brauner }
515890f504SChristian Brauner #endif
52f74ca6daSChristian Brauner 
__ns_common_init(struct ns_common * ns,u32 ns_type,const struct proc_ns_operations * ops,int inum)53*4055526dSChristian Brauner int __ns_common_init(struct ns_common *ns, u32 ns_type, const struct proc_ns_operations *ops, int inum)
54f74ca6daSChristian Brauner {
55024596a4SChristian Brauner 	refcount_set(&ns->__ns_ref, 1);
56f74ca6daSChristian Brauner 	ns->stashed = NULL;
57f74ca6daSChristian Brauner 	ns->ops = ops;
58f74ca6daSChristian Brauner 	ns->ns_id = 0;
59*4055526dSChristian Brauner 	ns->ns_type = ns_type;
60f74ca6daSChristian Brauner 	RB_CLEAR_NODE(&ns->ns_tree_node);
61f74ca6daSChristian Brauner 	INIT_LIST_HEAD(&ns->ns_list_node);
625612ff3eSChristian Brauner 
635890f504SChristian Brauner #ifdef CONFIG_DEBUG_VFS
645890f504SChristian Brauner 	ns_debug(ns, ops);
655890f504SChristian Brauner #endif
665890f504SChristian Brauner 
675612ff3eSChristian Brauner 	if (inum) {
685612ff3eSChristian Brauner 		ns->inum = inum;
69f74ca6daSChristian Brauner 		return 0;
70f74ca6daSChristian Brauner 	}
715612ff3eSChristian Brauner 	return proc_alloc_inum(&ns->inum);
725612ff3eSChristian Brauner }
73be5f21d3SChristian Brauner 
__ns_common_free(struct ns_common * ns)74be5f21d3SChristian Brauner void __ns_common_free(struct ns_common *ns)
75be5f21d3SChristian Brauner {
76be5f21d3SChristian Brauner 	proc_free_inum(ns->inum);
77be5f21d3SChristian Brauner }
78