Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71448
b: refs/heads/master
c: 7af5729
h: refs/heads/master
v: v3
  • Loading branch information
Pavel Emelyanov authored and Linus Torvalds committed Oct 19, 2007
1 parent ea78ba4 commit 1a486c6
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8ef047aaaeb811247a5639c92e2f2ae1221a28dd
refs/heads/master: 7af5729474b5b8ad385adadab78d6e723e7655a3
24 changes: 23 additions & 1 deletion trunk/include/linux/pid.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,11 +114,33 @@ extern struct pid *find_ge_pid(int nr);
extern struct pid *alloc_pid(struct pid_namespace *ns);
extern void FASTCALL(free_pid(struct pid *pid));

/*
* 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_vnr() : virtual id, i.e. the id seen from the namespace this pid
* belongs to. this only makes sence when called in the
* context of the task that belongs to the same namespace;
* pid_nr_ns() : id seen from the ns specified.
*
* see also task_xid_nr() etc in include/linux/sched.h
*/

static inline pid_t pid_nr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->nr;
nr = pid->numbers[0].nr;
return nr;
}

pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);

static inline pid_t pid_vnr(struct pid *pid)
{
pid_t nr = 0;
if (pid)
nr = pid->numbers[pid->level].nr;
return nr;
}

Expand Down
108 changes: 98 additions & 10 deletions trunk/include/linux/sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -1188,16 +1188,6 @@ static inline int rt_task(struct task_struct *p)
return rt_prio(p->prio);
}

static inline pid_t task_pgrp_nr(struct task_struct *tsk)
{
return tsk->signal->pgrp;
}

static inline pid_t task_session_nr(struct task_struct *tsk)
{
return tsk->signal->__session;
}

static inline void set_task_session(struct task_struct *tsk, pid_t session)
{
tsk->signal->__session = session;
Expand All @@ -1223,6 +1213,104 @@ static inline struct pid *task_session(struct task_struct *task)
return task->group_leader->pids[PIDTYPE_SID].pid;
}

struct pid_namespace;

/*
* the helpers to get the task's different pids as they are seen
* from various namespaces
*
* 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
* belongs to. this only makes sence when called in the
* context of the task that belongs to the same namespace;
* task_xid_nr_ns() : id seen from the ns specified;
*
* set_task_vxid() : assigns a virtual id to a task;
*
* task_ppid_nr_ns() : the parent's id as seen from the namespace specified.
* the result depends on the namespace and whether the
* task in question is the namespace's init. e.g. for the
* namespace's init this will return 0 when called from
* the namespace of this init, or appropriate id otherwise.
*
*
* see also pid_nr() etc in include/linux/pid.h
*/

static inline pid_t task_pid_nr(struct task_struct *tsk)
{
return tsk->pid;
}

static inline pid_t task_pid_nr_ns(struct task_struct *tsk,
struct pid_namespace *ns)
{
return pid_nr_ns(task_pid(tsk), ns);
}

static inline pid_t task_pid_vnr(struct task_struct *tsk)
{
return pid_vnr(task_pid(tsk));
}


static inline pid_t task_tgid_nr(struct task_struct *tsk)
{
return tsk->tgid;
}

static inline pid_t task_tgid_nr_ns(struct task_struct *tsk,
struct pid_namespace *ns)
{
return pid_nr_ns(task_tgid(tsk), ns);
}

static inline pid_t task_tgid_vnr(struct task_struct *tsk)
{
return pid_vnr(task_tgid(tsk));
}


static inline pid_t task_pgrp_nr(struct task_struct *tsk)
{
return tsk->signal->pgrp;
}

static inline pid_t task_pgrp_nr_ns(struct task_struct *tsk,
struct pid_namespace *ns)
{
return pid_nr_ns(task_pgrp(tsk), ns);
}

static inline pid_t task_pgrp_vnr(struct task_struct *tsk)
{
return pid_vnr(task_pgrp(tsk));
}


static inline pid_t task_session_nr(struct task_struct *tsk)
{
return tsk->signal->__session;
}

static inline pid_t task_session_nr_ns(struct task_struct *tsk,
struct pid_namespace *ns)
{
return pid_nr_ns(task_session(tsk), ns);
}

static inline pid_t task_session_vnr(struct task_struct *tsk)
{
return pid_vnr(task_session(tsk));
}


static inline pid_t task_ppid_nr_ns(struct task_struct *tsk,
struct pid_namespace *ns)
{
return pid_nr_ns(task_pid(rcu_dereference(tsk->real_parent)), ns);
}

/**
* pid_alive - check that a task structure is not stale
* @p: Task structure to be checked.
Expand Down
13 changes: 13 additions & 0 deletions trunk/kernel/pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,19 @@ struct pid *find_get_pid(pid_t nr)
return pid;
}

pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
{
struct upid *upid;
pid_t nr = 0;

if (pid && ns->level <= pid->level) {
upid = &pid->numbers[ns->level];
if (upid->ns == ns)
nr = upid->nr;
}
return nr;
}

/*
* Used by proc to find the first pid that is greater then or equal to nr.
*
Expand Down

0 comments on commit 1a486c6

Please sign in to comment.