Commit 44c4e1b2 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by Linus Torvalds

pid: Extend/Fix pid_vnr

pid_vnr returns the user space pid with respect to the pid namespace the
struct pid was allocated in.  What we want before we return a pid to user
space is the user space pid with respect to the pid namespace of current.

pid_vnr is a very nice optimization but because it isn't quite what we want
it is easy to use pid_vnr at times when we aren't certain the struct pid
was allocated in our pid namespace.

Currently this describes at least tiocgpgrp and tiocgsid in ttyio.c the
parent process reported in the core dumps and the parent process in
get_signal_to_deliver.

So unless the performance impact is huge having an interface that does what
we want instead of always what we want should be much more reliable and
much less error prone.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Acked-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 161550d7
...@@ -127,9 +127,8 @@ extern void FASTCALL(free_pid(struct pid *pid)); ...@@ -127,9 +127,8 @@ extern void FASTCALL(free_pid(struct pid *pid));
* the helpers to get the pid's id seen from different namespaces * the helpers to get the pid's id seen from different namespaces
* *
* pid_nr() : global id, i.e. the id seen from the init namespace; * pid_nr() : global id, i.e. the id seen from the init namespace;
* pid_vnr() : virtual id, i.e. the id seen from the namespace this pid * pid_vnr() : virtual id, i.e. the id seen from the pid namespace of
* belongs to. this only makes sence when called in the * current.
* context of the task that belongs to the same namespace;
* pid_nr_ns() : id seen from the ns specified. * pid_nr_ns() : id seen from the ns specified.
* *
* see also task_xid_nr() etc in include/linux/sched.h * see also task_xid_nr() etc in include/linux/sched.h
...@@ -144,14 +143,7 @@ static inline pid_t pid_nr(struct pid *pid) ...@@ -144,14 +143,7 @@ static inline pid_t pid_nr(struct pid *pid)
} }
pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns); pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
pid_t pid_vnr(struct pid *pid);
static inline pid_t pid_vnr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->numbers[pid->level].nr;
return nr;
}
#define do_each_pid_task(pid, type, task) \ #define do_each_pid_task(pid, type, task) \
do { \ do { \
......
...@@ -1332,9 +1332,8 @@ struct pid_namespace; ...@@ -1332,9 +1332,8 @@ struct pid_namespace;
* from various namespaces * from various namespaces
* *
* task_xid_nr() : global id, i.e. the id seen from the init namespace; * task_xid_nr() : global id, i.e. the id seen from the init namespace;
* task_xid_vnr() : virtual id, i.e. the id seen from the namespace the task * task_xid_vnr() : virtual id, i.e. the id seen from the pid namespace of
* belongs to. this only makes sence when called in the * current.
* context of the task that belongs to the same namespace;
* task_xid_nr_ns() : id seen from the ns specified; * task_xid_nr_ns() : id seen from the ns specified;
* *
* set_task_vxid() : assigns a virtual id to a task; * set_task_vxid() : assigns a virtual id to a task;
......
...@@ -443,6 +443,12 @@ pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns) ...@@ -443,6 +443,12 @@ pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
return nr; return nr;
} }
pid_t pid_vnr(struct pid *pid)
{
return pid_nr_ns(pid, current->nsproxy->pid_ns);
}
EXPORT_SYMBOL_GPL(pid_vnr);
pid_t task_pid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) pid_t task_pid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)
{ {
return pid_nr_ns(task_pid(tsk), ns); return pid_nr_ns(task_pid(tsk), ns);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment