forked from Minki/linux
[PATCH] procfs: Fix listing of /proc/NOT_A_TGID/task
Listing /proc/PID/task were PID is not a TGID should not result in duplicated entries. [g ~]$ pidof thunderbird-bin 2751 [g ~]$ ls /proc/2751/task 2751 2770 2771 2824 2826 2834 2835 2851 2853 [g ~]$ ls /proc/2770/task 2751 2770 2771 2824 2826 2834 2835 2851 2853 2770 2771 2824 2826 2834 2835 2851 2853 [g ~]$ Signed-off-by: Guillaume Chazarain <guichaz@yahoo.fr> Acked-by: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
432bd6cbf9
commit
7d8952440f
@ -2328,13 +2328,23 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
|
||||
{
|
||||
struct dentry *dentry = filp->f_path.dentry;
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct task_struct *leader = get_proc_task(inode);
|
||||
struct task_struct *leader = NULL;
|
||||
struct task_struct *task;
|
||||
int retval = -ENOENT;
|
||||
ino_t ino;
|
||||
int tid;
|
||||
unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */
|
||||
|
||||
task = get_proc_task(inode);
|
||||
if (!task)
|
||||
goto out_no_task;
|
||||
rcu_read_lock();
|
||||
if (pid_alive(task)) {
|
||||
leader = task->group_leader;
|
||||
get_task_struct(leader);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
put_task_struct(task);
|
||||
if (!leader)
|
||||
goto out_no_task;
|
||||
retval = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user