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