|
@@ -1937,14 +1937,14 @@ static int proc_self_readlink(struct dentry *dentry, char __user *buffer,
|
|
|
int buflen)
|
|
|
{
|
|
|
char tmp[PROC_NUMBUF];
|
|
|
- sprintf(tmp, "%d", current->tgid);
|
|
|
+ sprintf(tmp, "%d", task_tgid_vnr(current));
|
|
|
return vfs_readlink(dentry,buffer,buflen,tmp);
|
|
|
}
|
|
|
|
|
|
static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
|
|
|
{
|
|
|
char tmp[PROC_NUMBUF];
|
|
|
- sprintf(tmp, "%d", current->tgid);
|
|
|
+ sprintf(tmp, "%d", task_tgid_vnr(current));
|
|
|
return ERR_PTR(vfs_follow_link(nd,tmp));
|
|
|
}
|
|
|
|
|
@@ -2316,6 +2316,7 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct
|
|
|
struct dentry *result = ERR_PTR(-ENOENT);
|
|
|
struct task_struct *task;
|
|
|
unsigned tgid;
|
|
|
+ struct pid_namespace *ns;
|
|
|
|
|
|
result = proc_base_lookup(dir, dentry);
|
|
|
if (!IS_ERR(result) || PTR_ERR(result) != -ENOENT)
|
|
@@ -2325,8 +2326,9 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct
|
|
|
if (tgid == ~0U)
|
|
|
goto out;
|
|
|
|
|
|
+ ns = dentry->d_sb->s_fs_info;
|
|
|
rcu_read_lock();
|
|
|
- task = find_task_by_pid(tgid);
|
|
|
+ task = find_task_by_pid_ns(tgid, ns);
|
|
|
if (task)
|
|
|
get_task_struct(task);
|
|
|
rcu_read_unlock();
|
|
@@ -2343,7 +2345,8 @@ out:
|
|
|
* Find the first task with tgid >= tgid
|
|
|
*
|
|
|
*/
|
|
|
-static struct task_struct *next_tgid(unsigned int tgid)
|
|
|
+static struct task_struct *next_tgid(unsigned int tgid,
|
|
|
+ struct pid_namespace *ns)
|
|
|
{
|
|
|
struct task_struct *task;
|
|
|
struct pid *pid;
|
|
@@ -2351,9 +2354,9 @@ static struct task_struct *next_tgid(unsigned int tgid)
|
|
|
rcu_read_lock();
|
|
|
retry:
|
|
|
task = NULL;
|
|
|
- pid = find_ge_pid(tgid, &init_pid_ns);
|
|
|
+ pid = find_ge_pid(tgid, ns);
|
|
|
if (pid) {
|
|
|
- tgid = pid->nr + 1;
|
|
|
+ tgid = pid_nr_ns(pid, ns) + 1;
|
|
|
task = pid_task(pid, PIDTYPE_PID);
|
|
|
/* What we to know is if the pid we have find is the
|
|
|
* pid of a thread_group_leader. Testing for task
|
|
@@ -2393,6 +2396,7 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
|
|
struct task_struct *reaper = get_proc_task(filp->f_path.dentry->d_inode);
|
|
|
struct task_struct *task;
|
|
|
int tgid;
|
|
|
+ struct pid_namespace *ns;
|
|
|
|
|
|
if (!reaper)
|
|
|
goto out_no_task;
|
|
@@ -2403,11 +2407,12 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ ns = filp->f_dentry->d_sb->s_fs_info;
|
|
|
tgid = filp->f_pos - TGID_OFFSET;
|
|
|
- for (task = next_tgid(tgid);
|
|
|
+ for (task = next_tgid(tgid, ns);
|
|
|
task;
|
|
|
- put_task_struct(task), task = next_tgid(tgid + 1)) {
|
|
|
- tgid = task->pid;
|
|
|
+ put_task_struct(task), task = next_tgid(tgid + 1, ns)) {
|
|
|
+ tgid = task_pid_nr_ns(task, ns);
|
|
|
filp->f_pos = tgid + TGID_OFFSET;
|
|
|
if (proc_pid_fill_cache(filp, dirent, filldir, task, tgid) < 0) {
|
|
|
put_task_struct(task);
|
|
@@ -2531,6 +2536,7 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry
|
|
|
struct task_struct *task;
|
|
|
struct task_struct *leader = get_proc_task(dir);
|
|
|
unsigned tid;
|
|
|
+ struct pid_namespace *ns;
|
|
|
|
|
|
if (!leader)
|
|
|
goto out_no_task;
|
|
@@ -2539,8 +2545,9 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry
|
|
|
if (tid == ~0U)
|
|
|
goto out;
|
|
|
|
|
|
+ ns = dentry->d_sb->s_fs_info;
|
|
|
rcu_read_lock();
|
|
|
- task = find_task_by_pid(tid);
|
|
|
+ task = find_task_by_pid_ns(tid, ns);
|
|
|
if (task)
|
|
|
get_task_struct(task);
|
|
|
rcu_read_unlock();
|
|
@@ -2571,14 +2578,14 @@ out_no_task:
|
|
|
* threads past it.
|
|
|
*/
|
|
|
static struct task_struct *first_tid(struct task_struct *leader,
|
|
|
- int tid, int nr)
|
|
|
+ int tid, int nr, struct pid_namespace *ns)
|
|
|
{
|
|
|
struct task_struct *pos;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
/* Attempt to start with the pid of a thread */
|
|
|
if (tid && (nr > 0)) {
|
|
|
- pos = find_task_by_pid(tid);
|
|
|
+ pos = find_task_by_pid_ns(tid, ns);
|
|
|
if (pos && (pos->group_leader == leader))
|
|
|
goto found;
|
|
|
}
|
|
@@ -2647,6 +2654,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
|
|
|
ino_t ino;
|
|
|
int tid;
|
|
|
unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */
|
|
|
+ struct pid_namespace *ns;
|
|
|
|
|
|
task = get_proc_task(inode);
|
|
|
if (!task)
|
|
@@ -2680,12 +2688,13 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
|
|
|
/* f_version caches the tgid value that the last readdir call couldn't
|
|
|
* return. lseek aka telldir automagically resets f_version to 0.
|
|
|
*/
|
|
|
+ ns = filp->f_dentry->d_sb->s_fs_info;
|
|
|
tid = (int)filp->f_version;
|
|
|
filp->f_version = 0;
|
|
|
- for (task = first_tid(leader, tid, pos - 2);
|
|
|
+ for (task = first_tid(leader, tid, pos - 2, ns);
|
|
|
task;
|
|
|
task = next_tid(task), pos++) {
|
|
|
- tid = task->pid;
|
|
|
+ tid = task_pid_nr_ns(task, ns);
|
|
|
if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) {
|
|
|
/* returning this tgid failed, save it as the first
|
|
|
* pid for the next readir call */
|