From 88e5ad5a2fd8fd5cf74ba75155e2b856afb3923a Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Wed, 30 Apr 2008 00:54:29 -0700 Subject: [PATCH] --- yaml --- r: 95254 b: refs/heads/master c: 12a3de0a965826096d8adc593bcf4392a7d5b459 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/sys.c | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/[refs] b/[refs] index 2f4ccdc31389..8bf231711861 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1dd768c0815334d2319d6377f0750ace075b6142 +refs/heads/master: 12a3de0a965826096d8adc593bcf4392a7d5b459 diff --git a/trunk/kernel/sys.c b/trunk/kernel/sys.c index ddd28e261f3a..895d2d4c9493 100644 --- a/trunk/kernel/sys.c +++ b/trunk/kernel/sys.c @@ -991,31 +991,37 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) asmlinkage long sys_getpgid(pid_t pid) { + struct task_struct *p; + struct pid *grp; + int retval; + + rcu_read_lock(); if (!pid) - return task_pgrp_vnr(current); + grp = task_pgrp(current); else { - int retval; - struct task_struct *p; - - read_lock(&tasklist_lock); - p = find_task_by_vpid(pid); retval = -ESRCH; - if (p) { - retval = security_task_getpgid(p); - if (!retval) - retval = task_pgrp_vnr(p); - } - read_unlock(&tasklist_lock); - return retval; + p = find_task_by_vpid(pid); + if (!p) + goto out; + grp = task_pgrp(p); + if (!grp) + goto out; + + retval = security_task_getpgid(p); + if (retval) + goto out; } + retval = pid_vnr(grp); +out: + rcu_read_unlock(); + return retval; } #ifdef __ARCH_WANT_SYS_GETPGRP asmlinkage long sys_getpgrp(void) { - /* SMP - assuming writes are word atomic this is fine */ - return task_pgrp_vnr(current); + return sys_getpgid(0); } #endif