aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tty_io.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2007-02-12 03:52:56 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-12 12:48:31 -0500
commit04a2e6a5cbf84e85fe86de0a18f6509b147e1d89 (patch)
tree67dd67d2c4c18e5c36654dfe569e3085bd262ba5 /drivers/char/tty_io.c
parent8d42db189ca99703f0f4f91c477cb54808c8eaaa (diff)
[PATCH] pid: make session_of_pgrp use struct pid instead of pid_t
To properly implement a pid namespace I need to deal exclusively in terms of struct pid, because pid_t values become ambiguous. To this end session_of_pgrp is transformed to take and return a struct pid pointer. To avoid the need to worry about reference counting I now require my caller to hold the appropriate locks. Leaving callers repsonsible for increasing the reference count if they need access to the result outside of the locks. Since session_of_pgrp currently only has one caller and that caller simply uses only test the result for equality with another process group, the locking change means I don't actually have to acquire the tasklist_lock at all. tiocspgrp is also modified to take and release the lock. The logic there is a little more complicated but nothing I won't need when I convert pgrp of a tty to a struct pid pointer. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/tty_io.c')
-rw-r--r--drivers/char/tty_io.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index abfe24d28c51..95f3596189cf 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -2990,7 +2990,8 @@ static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
2990 2990
2991static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) 2991static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
2992{ 2992{
2993 pid_t pgrp; 2993 struct pid *pgrp;
2994 pid_t pgrp_nr;
2994 int retval = tty_check_change(real_tty); 2995 int retval = tty_check_change(real_tty);
2995 2996
2996 if (retval == -EIO) 2997 if (retval == -EIO)
@@ -3001,14 +3002,23 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
3001 (current->signal->tty != real_tty) || 3002 (current->signal->tty != real_tty) ||
3002 (real_tty->session != process_session(current))) 3003 (real_tty->session != process_session(current)))
3003 return -ENOTTY; 3004 return -ENOTTY;
3004 if (get_user(pgrp, p)) 3005 if (get_user(pgrp_nr, p))
3005 return -EFAULT; 3006 return -EFAULT;
3006 if (pgrp < 0) 3007 if (pgrp_nr < 0)
3007 return -EINVAL; 3008 return -EINVAL;
3008 if (session_of_pgrp(pgrp) != process_session(current)) 3009 rcu_read_lock();
3009 return -EPERM; 3010 pgrp = find_pid(pgrp_nr);
3010 real_tty->pgrp = pgrp; 3011 retval = -ESRCH;
3011 return 0; 3012 if (!pgrp)
3013 goto out_unlock;
3014 retval = -EPERM;
3015 if (session_of_pgrp(pgrp) != task_session(current))
3016 goto out_unlock;
3017 retval = 0;
3018 real_tty->pgrp = pgrp_nr;
3019out_unlock:
3020 rcu_read_unlock();
3021 return retval;
3012} 3022}
3013 3023
3014/** 3024/**