diff options
author | Andrey Vagin <avagin@openvz.org> | 2016-09-06 00:47:15 -0700 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2016-09-22 19:59:41 -0500 |
commit | a7306ed8d94af729ecef8b6e37506a1c6fc14788 (patch) | |
tree | 0d45320911d2a339bc0abd6bacd5703c7308c08c /kernel/pid_namespace.c | |
parent | 6786741dbf99e44fb0c0ed85a37582b8a26f1c3b (diff) | |
download | lwn-a7306ed8d94af729ecef8b6e37506a1c6fc14788.tar.gz lwn-a7306ed8d94af729ecef8b6e37506a1c6fc14788.zip |
nsfs: add ioctl to get a parent namespace
Pid and user namepaces are hierarchical. There is no way to discover
parent-child relationships.
In a future we will use this interface to dump and restore nested
namespaces.
Acked-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Andrei Vagin <avagin@openvz.org>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'kernel/pid_namespace.c')
-rw-r--r-- | kernel/pid_namespace.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index c02d744225e1..4fa2d56a936c 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -388,6 +388,24 @@ static int pidns_install(struct nsproxy *nsproxy, struct ns_common *ns) return 0; } +static struct ns_common *pidns_get_parent(struct ns_common *ns) +{ + struct pid_namespace *active = task_active_pid_ns(current); + struct pid_namespace *pid_ns, *p; + + /* See if the parent is in the current namespace */ + pid_ns = p = to_pid_ns(ns)->parent; + for (;;) { + if (!p) + return ERR_PTR(-EPERM); + if (p == active) + break; + p = p->parent; + } + + return &get_pid_ns(pid_ns)->ns; +} + static struct user_namespace *pidns_owner(struct ns_common *ns) { return to_pid_ns(ns)->user_ns; @@ -400,6 +418,7 @@ const struct proc_ns_operations pidns_operations = { .put = pidns_put, .install = pidns_install, .owner = pidns_owner, + .get_parent = pidns_get_parent, }; static __init int pid_namespaces_init(void) |