Commit f9fb860f67b9542cd78d1558dec7058092b57d8e
Committed by
Linus Torvalds
1 parent
6af866af34
Exists in
master
and in
4 other branches
pid: implement ns_of_pid
A current problem with the pid namespace is that it is easy to do pid related work after exit_task_namespaces which drops the nsproxy pointer. However if we are doing pid namespace related work we are always operating on some struct pid which retains the pid_namespace pointer of the pid namespace it was allocated in. So provide ns_of_pid which allows us to find the pid namespace a pid was allocated in. Using this we have the needed infrastructure to do pid namespace related work at anytime we have a struct pid, removing the chance of accidentally having a NULL pointer dereference when accessing current->nsproxy. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Roland McGrath <roland@redhat.com> Cc: Bastian Blank <bastian@waldi.eu.org> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Nadia Derbey <Nadia.Derbey@bull.net> Acked-by: Serge Hallyn <serue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 18 additions and 0 deletions Side-by-side Diff
include/linux/pid.h
... | ... | @@ -123,6 +123,24 @@ |
123 | 123 | extern void free_pid(struct pid *pid); |
124 | 124 | |
125 | 125 | /* |
126 | + * ns_of_pid() returns the pid namespace in which the specified pid was | |
127 | + * allocated. | |
128 | + * | |
129 | + * NOTE: | |
130 | + * ns_of_pid() is expected to be called for a process (task) that has | |
131 | + * an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid | |
132 | + * is expected to be non-NULL. If @pid is NULL, caller should handle | |
133 | + * the resulting NULL pid-ns. | |
134 | + */ | |
135 | +static inline struct pid_namespace *ns_of_pid(struct pid *pid) | |
136 | +{ | |
137 | + struct pid_namespace *ns = NULL; | |
138 | + if (pid) | |
139 | + ns = pid->numbers[pid->level].ns; | |
140 | + return ns; | |
141 | +} | |
142 | + | |
143 | +/* | |
126 | 144 | * the helpers to get the pid's id seen from different namespaces |
127 | 145 | * |
128 | 146 | * pid_nr() : global id, i.e. the id seen from the init namespace; |