diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-03-28 19:11:03 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-28 21:36:40 -0500 |
commit | d73d65293e3e2de7e916a89c8da30be0948afab7 (patch) | |
tree | 62b0ca76e3099c927f2960856dd060b136a8ccef /fs | |
parent | 652486fb84a07ed750f1c11639518f55808bf555 (diff) |
[PATCH] pidhash: kill switch_exec_pids
switch_exec_pids is only called from de_thread by way of exec, and it is
only called when we are exec'ing from a non thread group leader.
Currently switch_exec_pids gives the leader the pid of the thread and
unhashes and rehashes all of the process groups. The leader is already in
the EXIT_DEAD state so no one cares about it's pids. The only concern for
the leader is that __unhash_process called from release_task will function
correctly. If we don't touch the leader at all we know that
__unhash_process will work fine so there is no need to touch the leader.
For the task becomming the thread group leader, we just need to give it the
pid of the old thread group leader, add it to the task list, and attach it
to the session and the process group of the thread group.
Currently de_thread is also adding the task to the task list which is just
silly.
Currently the only leader of __detach_pid besides detach_pid is
switch_exec_pids because of the ugly extra work that was being
performed.
So this patch removes switch_exec_pids because it is doing too much, it is
creating an unnecessary special case in pid.c, duing work duplicated in
de_thread, and generally obscuring what it is going on.
The necessary work is added to de_thread, and it seems to be a little
clearer there what is going on.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Kirill Korotaev <dev@sw.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/exec.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -708,7 +708,17 @@ static int de_thread(struct task_struct *tsk) | |||
708 | remove_parent(current); | 708 | remove_parent(current); |
709 | remove_parent(leader); | 709 | remove_parent(leader); |
710 | 710 | ||
711 | switch_exec_pids(leader, current); | 711 | |
712 | /* Become a process group leader with the old leader's pid. | ||
713 | * Note: The old leader also uses thispid until release_task | ||
714 | * is called. Odd but simple and correct. | ||
715 | */ | ||
716 | detach_pid(current, PIDTYPE_PID); | ||
717 | current->pid = leader->pid; | ||
718 | attach_pid(current, PIDTYPE_PID, current->pid); | ||
719 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); | ||
720 | attach_pid(current, PIDTYPE_SID, current->signal->session); | ||
721 | list_add_tail(¤t->tasks, &init_task.tasks); | ||
712 | 722 | ||
713 | current->parent = current->real_parent = leader->real_parent; | 723 | current->parent = current->real_parent = leader->real_parent; |
714 | leader->parent = leader->real_parent = child_reaper; | 724 | leader->parent = leader->real_parent = child_reaper; |
@@ -722,8 +732,6 @@ static int de_thread(struct task_struct *tsk) | |||
722 | __ptrace_link(current, parent); | 732 | __ptrace_link(current, parent); |
723 | } | 733 | } |
724 | 734 | ||
725 | list_del(¤t->tasks); | ||
726 | list_add_tail(¤t->tasks, &init_task.tasks); | ||
727 | current->exit_signal = SIGCHLD; | 735 | current->exit_signal = SIGCHLD; |
728 | 736 | ||
729 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); | 737 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); |