Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 36210
b: refs/heads/master
c: c18258c
h: refs/heads/master
v: v3
  • Loading branch information
Eric W. Biederman authored and Linus Torvalds committed Sep 27, 2006
1 parent aadadb8 commit 3f7fd10
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 35fa2048ab13d1be846be612e395c15c200bd51c
refs/heads/master: c18258c6f0848f97e85287f6271c511a092bb784
11 changes: 4 additions & 7 deletions trunk/fs/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -696,23 +696,20 @@ static int de_thread(struct task_struct *tsk)
*/

/* Become a process group leader with the old leader's pid.
* Note: The old leader also uses thispid until release_task
* The old leader becomes a thread of the this thread group.
* Note: The old leader also uses this pid until release_task
* is called. Odd but simple and correct.
*/
detach_pid(current, PIDTYPE_PID);
current->pid = leader->pid;
attach_pid(current, PIDTYPE_PID, current->pid);
attach_pid(current, PIDTYPE_PGID, current->signal->pgrp);
attach_pid(current, PIDTYPE_SID, current->signal->session);
transfer_pid(leader, current, PIDTYPE_PGID);
transfer_pid(leader, current, PIDTYPE_SID);
list_replace_rcu(&leader->tasks, &current->tasks);

current->group_leader = current;
leader->group_leader = current;

/* Reduce leader to a thread */
detach_pid(leader, PIDTYPE_PGID);
detach_pid(leader, PIDTYPE_SID);

current->exit_signal = SIGCHLD;

BUG_ON(leader->exit_state != EXIT_ZOMBIE);
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/pid.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ extern int FASTCALL(attach_pid(struct task_struct *task,
enum pid_type type, int nr));

extern void FASTCALL(detach_pid(struct task_struct *task, enum pid_type));
extern void FASTCALL(transfer_pid(struct task_struct *old,
struct task_struct *new, enum pid_type));

/*
* look up a PID in the hash table. Must be called with the tasklist_lock
Expand Down
9 changes: 9 additions & 0 deletions trunk/kernel/pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,15 @@ void fastcall detach_pid(struct task_struct *task, enum pid_type type)
free_pid(pid);
}

/* transfer_pid is an optimization of attach_pid(new), detach_pid(old) */
void fastcall transfer_pid(struct task_struct *old, struct task_struct *new,
enum pid_type type)
{
new->pids[type].pid = old->pids[type].pid;
hlist_replace_rcu(&old->pids[type].node, &new->pids[type].node);
old->pids[type].pid = NULL;
}

struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type)
{
struct task_struct *result = NULL;
Expand Down

0 comments on commit 3f7fd10

Please sign in to comment.