projects/linux·commit 2ceb8693

[PATCH] de_thread: fix lockless do_each_thread

2ceb8693 · Oleg Nesterov <[email protected]> · 2006-06-26 00:26:04 -07:00

We should keep the value of old_leader->tasks.next in de_thread, otherwise
we can't do for_each_process/do_each_thread without tasklist_lock held.

Signed-off-by: Oleg Nesterov <[email protected]>
Cc: "Eric W. Biederman" <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Commit
2ceb8693ef63ae3d154ce1a05d275f2bb20a5e4c
Parents
42c3e03e

Changes

1 files changed · +1 −2

FileStatusAddDelContent
fs/exec.cmodified+1−2View file

fs/exec.c

View file
diff --git a/fs/exec.c b/fs/exec.c
index 8c51960..fffea1e 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -707,7 +707,7 @@ static int de_thread(struct task_struct *tsk)
attach_pid(current, PIDTYPE_PID, current->pid);
attach_pid(current, PIDTYPE_PGID, current->signal->pgrp);
attach_pid(current, PIDTYPE_SID, current->signal->session);
- list_add_tail_rcu(&current->tasks, &init_task.tasks);
+ list_replace_rcu(&leader->tasks, &current->tasks);
current->group_leader = current;
leader->group_leader = current;
@@ -715,7 +715,6 @@ static int de_thread(struct task_struct *tsk)
/* Reduce leader to a thread */
detach_pid(leader, PIDTYPE_PGID);
detach_pid(leader, PIDTYPE_SID);
- list_del_init(&leader->tasks);
current->exit_signal = SIGCHLD;