diff options
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index fa0495e167e9..8d289bfc13d1 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -193,14 +193,14 @@ int session_of_pgrp(int pgrp) | |||
193 | 193 | ||
194 | read_lock(&tasklist_lock); | 194 | read_lock(&tasklist_lock); |
195 | do_each_task_pid(pgrp, PIDTYPE_PGID, p) { | 195 | do_each_task_pid(pgrp, PIDTYPE_PGID, p) { |
196 | if (p->signal->session > 0) { | 196 | if (process_session(p) > 0) { |
197 | sid = p->signal->session; | 197 | sid = process_session(p); |
198 | goto out; | 198 | goto out; |
199 | } | 199 | } |
200 | } while_each_task_pid(pgrp, PIDTYPE_PGID, p); | 200 | } while_each_task_pid(pgrp, PIDTYPE_PGID, p); |
201 | p = find_task_by_pid(pgrp); | 201 | p = find_task_by_pid(pgrp); |
202 | if (p) | 202 | if (p) |
203 | sid = p->signal->session; | 203 | sid = process_session(p); |
204 | out: | 204 | out: |
205 | read_unlock(&tasklist_lock); | 205 | read_unlock(&tasklist_lock); |
206 | 206 | ||
@@ -225,8 +225,8 @@ static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task) | |||
225 | || p->exit_state | 225 | || p->exit_state |
226 | || is_init(p->real_parent)) | 226 | || is_init(p->real_parent)) |
227 | continue; | 227 | continue; |
228 | if (process_group(p->real_parent) != pgrp | 228 | if (process_group(p->real_parent) != pgrp && |
229 | && p->real_parent->signal->session == p->signal->session) { | 229 | process_session(p->real_parent) == process_session(p)) { |
230 | ret = 0; | 230 | ret = 0; |
231 | break; | 231 | break; |
232 | } | 232 | } |
@@ -302,7 +302,7 @@ void __set_special_pids(pid_t session, pid_t pgrp) | |||
302 | { | 302 | { |
303 | struct task_struct *curr = current->group_leader; | 303 | struct task_struct *curr = current->group_leader; |
304 | 304 | ||
305 | if (curr->signal->session != session) { | 305 | if (process_session(curr) != session) { |
306 | detach_pid(curr, PIDTYPE_SID); | 306 | detach_pid(curr, PIDTYPE_SID); |
307 | curr->signal->session = session; | 307 | curr->signal->session = session; |
308 | attach_pid(curr, PIDTYPE_SID, session); | 308 | attach_pid(curr, PIDTYPE_SID, session); |
@@ -647,10 +647,11 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced) | |||
647 | * outside, so the child pgrp is now orphaned. | 647 | * outside, so the child pgrp is now orphaned. |
648 | */ | 648 | */ |
649 | if ((process_group(p) != process_group(father)) && | 649 | if ((process_group(p) != process_group(father)) && |
650 | (p->signal->session == father->signal->session)) { | 650 | (process_session(p) == process_session(father))) { |
651 | int pgrp = process_group(p); | 651 | int pgrp = process_group(p); |
652 | 652 | ||
653 | if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) { | 653 | if (will_become_orphaned_pgrp(pgrp, NULL) && |
654 | has_stopped_jobs(pgrp)) { | ||
654 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp); | 655 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp); |
655 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp); | 656 | __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp); |
656 | } | 657 | } |
@@ -784,7 +785,7 @@ static void exit_notify(struct task_struct *tsk) | |||
784 | t = tsk->real_parent; | 785 | t = tsk->real_parent; |
785 | 786 | ||
786 | if ((process_group(t) != process_group(tsk)) && | 787 | if ((process_group(t) != process_group(tsk)) && |
787 | (t->signal->session == tsk->signal->session) && | 788 | (process_session(t) == process_session(tsk)) && |
788 | will_become_orphaned_pgrp(process_group(tsk), tsk) && | 789 | will_become_orphaned_pgrp(process_group(tsk), tsk) && |
789 | has_stopped_jobs(process_group(tsk))) { | 790 | has_stopped_jobs(process_group(tsk))) { |
790 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk)); | 791 | __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk)); |