aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/tty_io.c2
-rw-r--r--fs/proc/array.c2
-rw-r--r--include/linux/init_task.h11
-rw-r--r--include/linux/sched.h19
-rw-r--r--kernel/exit.c2
-rw-r--r--kernel/fork.c2
6 files changed, 27 insertions, 11 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 4ebba7ca1dc9..48cee2004e97 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -3855,7 +3855,7 @@ EXPORT_SYMBOL(proc_clear_tty);
3855void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty) 3855void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
3856{ 3856{
3857 if (tty) { 3857 if (tty) {
3858 tty->session = tsk->signal->session; 3858 tty->session = process_session(tsk);
3859 tty->pgrp = process_group(tsk); 3859 tty->pgrp = process_group(tsk);
3860 } 3860 }
3861 tsk->signal->tty = tty; 3861 tsk->signal->tty = tty;
diff --git a/fs/proc/array.c b/fs/proc/array.c
index b0cd014a39bd..70e4fab117b1 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -381,7 +381,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole)
381 stime = cputime_add(stime, sig->stime); 381 stime = cputime_add(stime, sig->stime);
382 } 382 }
383 383
384 sid = sig->session; 384 sid = signal_session(sig);
385 pgid = process_group(task); 385 pgid = process_group(task);
386 ppid = rcu_dereference(task->real_parent)->tgid; 386 ppid = rcu_dereference(task->real_parent)->tgid;
387 387
diff --git a/include/linux/init_task.h b/include/linux/init_task.h
index 733790d4f7db..848a68af3d42 100644
--- a/include/linux/init_task.h
+++ b/include/linux/init_task.h
@@ -57,17 +57,18 @@
57 .cpu_vm_mask = CPU_MASK_ALL, \ 57 .cpu_vm_mask = CPU_MASK_ALL, \
58} 58}
59 59
60#define INIT_SIGNALS(sig) { \ 60#define INIT_SIGNALS(sig) { \
61 .count = ATOMIC_INIT(1), \ 61 .count = ATOMIC_INIT(1), \
62 .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\ 62 .wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
63 .shared_pending = { \ 63 .shared_pending = { \
64 .list = LIST_HEAD_INIT(sig.shared_pending.list), \ 64 .list = LIST_HEAD_INIT(sig.shared_pending.list), \
65 .signal = {{0}}}, \ 65 .signal = {{0}}}, \
66 .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \ 66 .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \
67 .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \ 67 .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \
68 .rlim = INIT_RLIMITS, \ 68 .rlim = INIT_RLIMITS, \
69 .pgrp = 1, \ 69 .pgrp = 1, \
70 .session = 1, \ 70 .tty_old_pgrp = 0, \
71 { .__session = 1}, \
71} 72}
72 73
73extern struct nsproxy init_nsproxy; 74extern struct nsproxy init_nsproxy;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 270d864a8ff1..6fec1d419714 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -436,7 +436,12 @@ struct signal_struct {
436 /* job control IDs */ 436 /* job control IDs */
437 pid_t pgrp; 437 pid_t pgrp;
438 pid_t tty_old_pgrp; 438 pid_t tty_old_pgrp;
439 pid_t session; 439
440 union {
441 pid_t session __deprecated;
442 pid_t __session;
443 };
444
440 /* boolean value for session group leader */ 445 /* boolean value for session group leader */
441 int leader; 446 int leader;
442 447
@@ -1047,9 +1052,19 @@ static inline pid_t process_group(struct task_struct *tsk)
1047 return tsk->signal->pgrp; 1052 return tsk->signal->pgrp;
1048} 1053}
1049 1054
1055static inline pid_t signal_session(struct signal_struct *sig)
1056{
1057 return sig->__session;
1058}
1059
1050static inline pid_t process_session(struct task_struct *tsk) 1060static inline pid_t process_session(struct task_struct *tsk)
1051{ 1061{
1052 return tsk->signal->session; 1062 return signal_session(tsk->signal);
1063}
1064
1065static inline void set_signal_session(struct signal_struct *sig, pid_t session)
1066{
1067 sig->__session = session;
1053} 1068}
1054 1069
1055static inline struct pid *task_pid(struct task_struct *task) 1070static inline struct pid *task_pid(struct task_struct *task)
diff --git a/kernel/exit.c b/kernel/exit.c
index 8d289bfc13d1..6267a6cc6113 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -304,7 +304,7 @@ void __set_special_pids(pid_t session, pid_t pgrp)
304 304
305 if (process_session(curr) != 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 set_signal_session(curr->signal, session);
308 attach_pid(curr, PIDTYPE_SID, session); 308 attach_pid(curr, PIDTYPE_SID, session);
309 } 309 }
310 if (process_group(curr) != pgrp) { 310 if (process_group(curr) != pgrp) {
diff --git a/kernel/fork.c b/kernel/fork.c
index 298c4d6ab512..60d2644bfe85 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1259,7 +1259,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
1259 if (thread_group_leader(p)) { 1259 if (thread_group_leader(p)) {
1260 p->signal->tty = current->signal->tty; 1260 p->signal->tty = current->signal->tty;
1261 p->signal->pgrp = process_group(current); 1261 p->signal->pgrp = process_group(current);
1262 p->signal->session = process_session(current); 1262 set_signal_session(p->signal, process_session(current));
1263 attach_pid(p, PIDTYPE_PGID, process_group(p)); 1263 attach_pid(p, PIDTYPE_PGID, process_group(p));
1264 attach_pid(p, PIDTYPE_SID, process_session(p)); 1264 attach_pid(p, PIDTYPE_SID, process_session(p));
1265 1265