Perhaps, but the race is mostly theoretical.
To be honest, I think 950eaaca681c4 needs a comment to explain what
rcu_read_lock() protects, or perhaps we can make it more explicit.
Oleg.
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -931,7 +931,6 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
pgid = pid;
if (pgid < 0)
return -EINVAL;
- rcu_read_lock();
/* From this point forward we keep holding onto the tasklist lock
* so that our parent does not change from under us. -DaveM
@@ -939,7 +938,9 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
write_lock_irq(&tasklist_lock);
err = -ESRCH;
+ rcu_read_lock();
p = find_task_by_vpid(pid);
+ rcu_read_unlock();
if (!p)
goto out;
@@ -968,7 +969,9 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
if (pgid != pid) {
struct task_struct *g;
+ rcu_read_lock();
pgrp = find_vpid(pgid);
+ rcu_read_unlock();
g = pid_task(pgrp, PIDTYPE_PGID);
if (!g || task_session(g) != task_session(group_leader))
goto out;
@@ -985,7 +988,6 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid
out:
/* All paths lead to here, thus we are safe. -DaveM */
write_unlock_irq(&tasklist_lock);
- rcu_read_unlock();
return err;
}
--