浏览代码

[PATCH] add process_session() helper routine: deprecate old field

Add an anonymous union and ((deprecated)) to catch direct usage of the
session field.

[akpm@osdl.org: fix various missed conversions]
[jdike@addtoit.com: fix UML bug]
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Cedric Le Goater <clg@fr.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Cedric Le Goater 18 年之前
父节点
当前提交
1ec320afdc
共有 6 个文件被更改,包括 27 次插入11 次删除
  1. 1 1
      drivers/char/tty_io.c
  2. 1 1
      fs/proc/array.c
  3. 6 5
      include/linux/init_task.h
  4. 17 2
      include/linux/sched.h
  5. 1 1
      kernel/exit.c
  6. 1 1
      kernel/fork.c

+ 1 - 1
drivers/char/tty_io.c

@@ -3855,7 +3855,7 @@ EXPORT_SYMBOL(proc_clear_tty);
 void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
 void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
 {
 {
 	if (tty) {
 	if (tty) {
-		tty->session = tsk->signal->session;
+		tty->session = process_session(tsk);
 		tty->pgrp = process_group(tsk);
 		tty->pgrp = process_group(tsk);
 	}
 	}
 	tsk->signal->tty = tty;
 	tsk->signal->tty = tty;

+ 1 - 1
fs/proc/array.c

@@ -381,7 +381,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole)
 			stime = cputime_add(stime, sig->stime);
 			stime = cputime_add(stime, sig->stime);
 		}
 		}
 
 
-		sid = sig->session;
+		sid = signal_session(sig);
 		pgid = process_group(task);
 		pgid = process_group(task);
 		ppid = rcu_dereference(task->real_parent)->tgid;
 		ppid = rcu_dereference(task->real_parent)->tgid;
 
 

+ 6 - 5
include/linux/init_task.h

@@ -57,17 +57,18 @@
 	.cpu_vm_mask	= CPU_MASK_ALL,				\
 	.cpu_vm_mask	= CPU_MASK_ALL,				\
 }
 }
 
 
-#define INIT_SIGNALS(sig) {	\
-	.count		= ATOMIC_INIT(1), 		\
+#define INIT_SIGNALS(sig) {						\
+	.count		= ATOMIC_INIT(1), 				\
 	.wait_chldexit	= __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
 	.wait_chldexit	= __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
-	.shared_pending	= { 				\
+	.shared_pending	= { 						\
 		.list = LIST_HEAD_INIT(sig.shared_pending.list),	\
 		.list = LIST_HEAD_INIT(sig.shared_pending.list),	\
-		.signal =  {{0}}}, \
+		.signal =  {{0}}},					\
 	.posix_timers	 = LIST_HEAD_INIT(sig.posix_timers),		\
 	.posix_timers	 = LIST_HEAD_INIT(sig.posix_timers),		\
 	.cpu_timers	= INIT_CPU_TIMERS(sig.cpu_timers),		\
 	.cpu_timers	= INIT_CPU_TIMERS(sig.cpu_timers),		\
 	.rlim		= INIT_RLIMITS,					\
 	.rlim		= INIT_RLIMITS,					\
 	.pgrp		= 1,						\
 	.pgrp		= 1,						\
-	.session	= 1,						\
+	.tty_old_pgrp   = 0,						\
+	{ .__session      = 1},						\
 }
 }
 
 
 extern struct nsproxy init_nsproxy;
 extern struct nsproxy init_nsproxy;

+ 17 - 2
include/linux/sched.h

@@ -436,7 +436,12 @@ struct signal_struct {
 	/* job control IDs */
 	/* job control IDs */
 	pid_t pgrp;
 	pid_t pgrp;
 	pid_t tty_old_pgrp;
 	pid_t tty_old_pgrp;
-	pid_t session;
+
+	union {
+		pid_t session __deprecated;
+		pid_t __session;
+	};
+
 	/* boolean value for session group leader */
 	/* boolean value for session group leader */
 	int leader;
 	int leader;
 
 
@@ -1047,9 +1052,19 @@ static inline pid_t process_group(struct task_struct *tsk)
 	return tsk->signal->pgrp;
 	return tsk->signal->pgrp;
 }
 }
 
 
+static inline pid_t signal_session(struct signal_struct *sig)
+{
+	return sig->__session;
+}
+
 static inline pid_t process_session(struct task_struct *tsk)
 static inline pid_t process_session(struct task_struct *tsk)
 {
 {
-	return tsk->signal->session;
+	return signal_session(tsk->signal);
+}
+
+static inline void set_signal_session(struct signal_struct *sig, pid_t session)
+{
+	sig->__session = session;
 }
 }
 
 
 static inline struct pid *task_pid(struct task_struct *task)
 static inline struct pid *task_pid(struct task_struct *task)

+ 1 - 1
kernel/exit.c

@@ -304,7 +304,7 @@ void __set_special_pids(pid_t session, pid_t pgrp)
 
 
 	if (process_session(curr) != session) {
 	if (process_session(curr) != session) {
 		detach_pid(curr, PIDTYPE_SID);
 		detach_pid(curr, PIDTYPE_SID);
-		curr->signal->session = session;
+		set_signal_session(curr->signal, session);
 		attach_pid(curr, PIDTYPE_SID, session);
 		attach_pid(curr, PIDTYPE_SID, session);
 	}
 	}
 	if (process_group(curr) != pgrp) {
 	if (process_group(curr) != pgrp) {

+ 1 - 1
kernel/fork.c

@@ -1259,7 +1259,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
 		if (thread_group_leader(p)) {
 		if (thread_group_leader(p)) {
 			p->signal->tty = current->signal->tty;
 			p->signal->tty = current->signal->tty;
 			p->signal->pgrp = process_group(current);
 			p->signal->pgrp = process_group(current);
-			p->signal->session = process_session(current);
+			set_signal_session(p->signal, process_session(current));
 			attach_pid(p, PIDTYPE_PGID, process_group(p));
 			attach_pid(p, PIDTYPE_PGID, process_group(p));
 			attach_pid(p, PIDTYPE_SID, process_session(p));
 			attach_pid(p, PIDTYPE_SID, process_session(p));