diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-04 21:39:31 -0500 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-04 21:39:31 -0500 |
| commit | c2cc87ca9561ddfe744d446789cc10f507e87db9 (patch) | |
| tree | d505fc0110eb1a3d8750ba2f67648c131f0d9aca /kernel/exit.c | |
| parent | ce1eeb95fc4eb25109c00bea3e83a87eeff6b07d (diff) | |
| parent | 7015faa7df829876a0f931cd18aa6d7c24a1b581 (diff) | |
Merge branch 'master'
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 79f52b85d6ed..537394b25e8d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -547,7 +547,7 @@ static inline void reparent_thread(task_t *p, task_t *father, int traced) | |||
| 547 | 547 | ||
| 548 | if (p->pdeath_signal) | 548 | if (p->pdeath_signal) |
| 549 | /* We already hold the tasklist_lock here. */ | 549 | /* We already hold the tasklist_lock here. */ |
| 550 | group_send_sig_info(p->pdeath_signal, (void *) 0, p); | 550 | group_send_sig_info(p->pdeath_signal, SEND_SIG_NOINFO, p); |
| 551 | 551 | ||
| 552 | /* Move the child from its dying parent to the new one. */ | 552 | /* Move the child from its dying parent to the new one. */ |
| 553 | if (unlikely(traced)) { | 553 | if (unlikely(traced)) { |
| @@ -591,8 +591,8 @@ static inline void reparent_thread(task_t *p, task_t *father, int traced) | |||
| 591 | int pgrp = process_group(p); | 591 | int pgrp = process_group(p); |
| 592 | 592 | ||
| 593 | if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) { | 593 | if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) { |
| 594 | __kill_pg_info(SIGHUP, (void *)1, pgrp); | 594 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp); |
| 595 | __kill_pg_info(SIGCONT, (void *)1, pgrp); | 595 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp); |
| 596 | } | 596 | } |
| 597 | } | 597 | } |
| 598 | } | 598 | } |
| @@ -727,8 +727,8 @@ static void exit_notify(struct task_struct *tsk) | |||
| 727 | (t->signal->session == tsk->signal->session) && | 727 | (t->signal->session == tsk->signal->session) && |
| 728 | will_become_orphaned_pgrp(process_group(tsk), tsk) && | 728 | will_become_orphaned_pgrp(process_group(tsk), tsk) && |
| 729 | has_stopped_jobs(process_group(tsk))) { | 729 | has_stopped_jobs(process_group(tsk))) { |
| 730 | __kill_pg_info(SIGHUP, (void *)1, process_group(tsk)); | 730 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk)); |
| 731 | __kill_pg_info(SIGCONT, (void *)1, process_group(tsk)); | 731 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, process_group(tsk)); |
| 732 | } | 732 | } |
| 733 | 733 | ||
| 734 | /* Let father know we died | 734 | /* Let father know we died |
| @@ -783,10 +783,6 @@ static void exit_notify(struct task_struct *tsk) | |||
| 783 | /* If the process is dead, release it - nobody will wait for it */ | 783 | /* If the process is dead, release it - nobody will wait for it */ |
| 784 | if (state == EXIT_DEAD) | 784 | if (state == EXIT_DEAD) |
| 785 | release_task(tsk); | 785 | release_task(tsk); |
| 786 | |||
| 787 | /* PF_DEAD causes final put_task_struct after we schedule. */ | ||
| 788 | preempt_disable(); | ||
| 789 | tsk->flags |= PF_DEAD; | ||
| 790 | } | 786 | } |
| 791 | 787 | ||
| 792 | fastcall NORET_TYPE void do_exit(long code) | 788 | fastcall NORET_TYPE void do_exit(long code) |
| @@ -873,7 +869,11 @@ fastcall NORET_TYPE void do_exit(long code) | |||
| 873 | tsk->mempolicy = NULL; | 869 | tsk->mempolicy = NULL; |
| 874 | #endif | 870 | #endif |
| 875 | 871 | ||
| 876 | BUG_ON(!(current->flags & PF_DEAD)); | 872 | /* PF_DEAD causes final put_task_struct after we schedule. */ |
| 873 | preempt_disable(); | ||
| 874 | BUG_ON(tsk->flags & PF_DEAD); | ||
| 875 | tsk->flags |= PF_DEAD; | ||
| 876 | |||
| 877 | schedule(); | 877 | schedule(); |
| 878 | BUG(); | 878 | BUG(); |
| 879 | /* Avoid "noreturn function does return". */ | 879 | /* Avoid "noreturn function does return". */ |
| @@ -1383,6 +1383,15 @@ repeat: | |||
| 1383 | 1383 | ||
| 1384 | switch (p->state) { | 1384 | switch (p->state) { |
| 1385 | case TASK_TRACED: | 1385 | case TASK_TRACED: |
| 1386 | /* | ||
| 1387 | * When we hit the race with PTRACE_ATTACH, | ||
| 1388 | * we will not report this child. But the | ||
| 1389 | * race means it has not yet been moved to | ||
| 1390 | * our ptrace_children list, so we need to | ||
| 1391 | * set the flag here to avoid a spurious ECHILD | ||
| 1392 | * when the race happens with the only child. | ||
| 1393 | */ | ||
| 1394 | flag = 1; | ||
| 1386 | if (!my_ptrace_child(p)) | 1395 | if (!my_ptrace_child(p)) |
| 1387 | continue; | 1396 | continue; |
| 1388 | /*FALLTHROUGH*/ | 1397 | /*FALLTHROUGH*/ |
