diff options
-rw-r--r-- | kernel/exit.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 3ac6a7a6f857..407b80aaefda 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -210,22 +210,22 @@ struct pid *session_of_pgrp(struct pid *pgrp) | |||
210 | * | 210 | * |
211 | * "I ask you, have you ever known what it is to be an orphan?" | 211 | * "I ask you, have you ever known what it is to be an orphan?" |
212 | */ | 212 | */ |
213 | static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task) | 213 | static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task) |
214 | { | 214 | { |
215 | struct task_struct *p; | 215 | struct task_struct *p; |
216 | int ret = 1; | 216 | int ret = 1; |
217 | 217 | ||
218 | do_each_task_pid(pgrp, PIDTYPE_PGID, p) { | 218 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { |
219 | if (p == ignored_task | 219 | if (p == ignored_task |
220 | || p->exit_state | 220 | || p->exit_state |
221 | || is_init(p->real_parent)) | 221 | || is_init(p->real_parent)) |
222 | continue; | 222 | continue; |
223 | if (process_group(p->real_parent) != pgrp && | 223 | if (task_pgrp(p->real_parent) != pgrp && |
224 | process_session(p->real_parent) == process_session(p)) { | 224 | task_session(p->real_parent) == task_session(p)) { |
225 | ret = 0; | 225 | ret = 0; |
226 | break; | 226 | break; |
227 | } | 227 | } |
228 | } while_each_task_pid(pgrp, PIDTYPE_PGID, p); | 228 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); |
229 | return ret; /* (sighing) "Often!" */ | 229 | return ret; /* (sighing) "Often!" */ |
230 | } | 230 | } |
231 | 231 | ||
@@ -234,23 +234,23 @@ int is_orphaned_pgrp(int pgrp) | |||
234 | int retval; | 234 | int retval; |
235 | 235 | ||
236 | read_lock(&tasklist_lock); | 236 | read_lock(&tasklist_lock); |
237 | retval = will_become_orphaned_pgrp(pgrp, NULL); | 237 | retval = will_become_orphaned_pgrp(find_pid(pgrp), NULL); |
238 | read_unlock(&tasklist_lock); | 238 | read_unlock(&tasklist_lock); |
239 | 239 | ||
240 | return retval; | 240 | return retval; |
241 | } | 241 | } |
242 | 242 | ||
243 | static int has_stopped_jobs(int pgrp) | 243 | static int has_stopped_jobs(struct pid *pgrp) |
244 | { | 244 | { |
245 | int retval = 0; | 245 | int retval = 0; |
246 | struct task_struct *p; | 246 | struct task_struct *p; |
247 | 247 | ||
248 | do_each_task_pid(pgrp, PIDTYPE_PGID, p) { | 248 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { |
249 | if (p->state != TASK_STOPPED) | 249 | if (p->state != TASK_STOPPED) |
250 | continue; | 250 | continue; |
251 | retval = 1; | 251 | retval = 1; |
252 | break; | 252 | break; |
253 | } while_each_task_pid(pgrp, PIDTYPE_PGID, p); | 253 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); |
254 | return retval; | 254 | return retval; |
255 | } | 255 | } |
256 | 256 | ||
@@ -648,14 +648,14 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced) | |||
648 | * than we are, and it was the only connection | 648 | * than we are, and it was the only connection |
649 | * outside, so the child pgrp is now orphaned. | 649 | * outside, so the child pgrp is now orphaned. |
650 | */ | 650 | */ |
651 | if ((process_group(p) != process_group(father)) && | 651 | if ((task_pgrp(p) != task_pgrp(father)) && |
652 | (process_session(p) == process_session(father))) { | 652 | (task_session(p) == task_session(father))) { |
653 | int pgrp = process_group(p); | 653 | struct pid *pgrp = task_pgrp(p); |
654 | 654 | ||
655 | if (will_become_orphaned_pgrp(pgrp, NULL) && | 655 | if (will_become_orphaned_pgrp(pgrp, NULL) && |
656 | has_stopped_jobs(pgrp)) { | 656 | has_stopped_jobs(pgrp)) { |
657 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp); | 657 | __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp); |
658 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp); | 658 | __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp); |
659 | } | 659 | } |
660 | } | 660 | } |
661 | } | 661 | } |
@@ -735,6 +735,7 @@ static void exit_notify(struct task_struct *tsk) | |||
735 | int state; | 735 | int state; |
736 | struct task_struct *t; | 736 | struct task_struct *t; |
737 | struct list_head ptrace_dead, *_p, *_n; | 737 | struct list_head ptrace_dead, *_p, *_n; |
738 | struct pid *pgrp; | ||
738 | 739 | ||
739 | if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT) | 740 | if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT) |
740 | && !thread_group_empty(tsk)) { | 741 | && !thread_group_empty(tsk)) { |
@@ -787,12 +788,13 @@ static void exit_notify(struct task_struct *tsk) | |||
787 | 788 | ||
788 | t = tsk->real_parent; | 789 | t = tsk->real_parent; |
789 | 790 | ||
790 | if ((process_group(t) != process_group(tsk)) && | 791 | pgrp = task_pgrp(tsk); |
791 | (process_session(t) == process_session(tsk)) && | 792 | if ((task_pgrp(t) != pgrp) && |
792 | will_become_orphaned_pgrp(process_group(tsk), tsk) && | 793 | (task_session(t) != task_session(tsk)) && |
793 | has_stopped_jobs(process_group(tsk))) { | 794 | will_become_orphaned_pgrp(pgrp, tsk) && |
794 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk)); | 795 | has_stopped_jobs(pgrp)) { |
795 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, process_group(tsk)); | 796 | __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp); |
797 | __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp); | ||
796 | } | 798 | } |
797 | 799 | ||
798 | /* Let father know we died | 800 | /* Let father know we died |