When the PID namespace gets initialized, a directory called 'pid' is added to 'namespacesfs'. This directory represents the main PID namespace and also serves as a trunk (parent) of all child PID namespaces. Every time when a new PID namespace is created a corresponding directory is added to 'namespacefs/pid/parent/hierarchy/'. The 'inum' of the new namespace gives the name of its directory. When the PID namespace is destroyed the corresponding directory is removed. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@xxxxxxxxx> --- fs/namespacefs/inode.c | 21 +++++++++++++++++++++ kernel/pid_namespace.c | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/fs/namespacefs/inode.c b/fs/namespacefs/inode.c index 012c1c43b44d..55d71733164c 100644 --- a/fs/namespacefs/inode.c +++ b/fs/namespacefs/inode.c @@ -11,7 +11,9 @@ #include <linux/fsnotify.h> #include <linux/magic.h> #include <linux/idr.h> +#include <linux/proc_ns.h> #include <linux/seq_file.h> +#include <linux/pid_namespace.h> static struct vfsmount *namespacefs_mount; static int namespacefs_mount_count; @@ -307,6 +309,19 @@ void namespacefs_remove_pid_ns_dir(struct pid_namespace *ns) namespacefs_remove_dir(ns->ns.dentry); } +static int add_ns_dentry(struct ns_common *ns) +{ + struct dentry *dentry = + namespacefs_create_dir(ns->ops->name, NULL, &init_user_ns); + + if (IS_ERR(dentry)) + return PTR_ERR(dentry); + + ns->dentry = dentry; + + return 0; +} + #define _NS_MOUNT_DIR "namespaces" static int __init namespacefs_init(void) @@ -321,8 +336,14 @@ static int __init namespacefs_init(void) if (err) goto rm_mount; + err = add_ns_dentry(&init_pid_ns.ns); + if (err) + goto unreg; + return 0; + unreg: + unregister_filesystem(&namespacefs_fs_type); rm_mount: sysfs_remove_mount_point(fs_kobj, _NS_MOUNT_DIR); fail: diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index a46a3723bc66..1690b2c87661 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -12,6 +12,7 @@ #include <linux/pid.h> #include <linux/pid_namespace.h> #include <linux/user_namespace.h> +#include <linux/namespacefs.h> #include <linux/syscalls.h> #include <linux/cred.h> #include <linux/err.h> @@ -101,6 +102,7 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns err = ns_alloc_inum(&ns->ns); if (err) goto out_free_idr; + ns->ns.ops = &pidns_operations; refcount_set(&ns->ns.count, 1); @@ -110,8 +112,14 @@ static struct pid_namespace *create_pid_namespace(struct user_namespace *user_ns ns->ucounts = ucounts; ns->pid_allocated = PIDNS_ADDING; + err = namespacefs_create_pid_ns_dir(ns); + if (err) + goto out_free_inum; + return ns; +out_free_inum: + ns_free_inum(&ns->ns); out_free_idr: idr_destroy(&ns->idr); kmem_cache_free(pid_ns_cachep, ns); @@ -133,6 +141,7 @@ static void delayed_free_pidns(struct rcu_head *p) static void destroy_pid_namespace(struct pid_namespace *ns) { + namespacefs_remove_pid_ns_dir(ns); ns_free_inum(&ns->ns); idr_destroy(&ns->idr); -- 2.33.1