Module Name: src Committed By: christos Date: Fri Apr 4 18:11:58 UTC 2014
Modified Files: src/sys/kern: tty_bsdpty.c tty_ptm.c tty_pty.c src/sys/sys: param.h pty.h Log Message: Kernel portion of the multiple ptyfs mount support. Protocol changed between kernel and module, so bump. (Ilya Zykov) To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sys/kern/tty_bsdpty.c cvs rdiff -u -r1.31 -r1.32 src/sys/kern/tty_ptm.c cvs rdiff -u -r1.137 -r1.138 src/sys/kern/tty_pty.c cvs rdiff -u -r1.449 -r1.450 src/sys/sys/param.h cvs rdiff -u -r1.9 -r1.10 src/sys/sys/pty.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/tty_bsdpty.c diff -u src/sys/kern/tty_bsdpty.c:1.19 src/sys/kern/tty_bsdpty.c:1.20 --- src/sys/kern/tty_bsdpty.c:1.19 Thu Mar 27 13:31:56 2014 +++ src/sys/kern/tty_bsdpty.c Fri Apr 4 14:11:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_bsdpty.c,v 1.19 2014/03/27 17:31:56 christos Exp $ */ +/* $NetBSD: tty_bsdpty.c,v 1.20 2014/04/04 18:11:58 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_bsdpty.c,v 1.19 2014/03/27 17:31:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_bsdpty.c,v 1.20 2014/04/04 18:11:58 christos Exp $"); #include "opt_ptm.h" @@ -74,12 +74,13 @@ static int pty_makename(struct mount *, static int pty_allocvp(struct mount *, struct lwp *, struct vnode **, dev_t, char); static void pty_getvattr(struct mount *, struct lwp *, struct vattr *); +static int pty__getmp(struct lwp *, struct mount **); struct ptm_pty ptm_bsdpty = { pty_allocvp, pty_makename, pty_getvattr, - NULL + pty__getmp, }; static int @@ -152,5 +153,13 @@ pty_getvattr(struct mount *mp, struct lw vattr->va_gid = TTY_GID; vattr->va_mode = TTY_PERM; } + +static int +pty__getmp(struct lwp *l __unused, struct mount **mpp) +{ + *mpp = 0; + return 0; +} + #endif /* COMPAT_BSDPTY */ #endif /* NO_DEV_PTM */ Index: src/sys/kern/tty_ptm.c diff -u src/sys/kern/tty_ptm.c:1.31 src/sys/kern/tty_ptm.c:1.32 --- src/sys/kern/tty_ptm.c:1.31 Thu Mar 27 13:31:56 2014 +++ src/sys/kern/tty_ptm.c Fri Apr 4 14:11:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_ptm.c,v 1.31 2014/03/27 17:31:56 christos Exp $ */ +/* $NetBSD: tty_ptm.c,v 1.32 2014/04/04 18:11:58 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_ptm.c,v 1.31 2014/03/27 17:31:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_ptm.c,v 1.32 2014/04/04 18:11:58 christos Exp $"); #include "opt_compat_netbsd.h" #include "opt_ptm.h" @@ -90,31 +90,12 @@ static int pty_alloc_slave(struct lwp *, void ptmattach(int); int -ptyfs_getmp(struct lwp *l, struct mount **mpp) { - struct cwdinfo *cwdi = l->l_proc->p_cwdi; - struct mount *mp; - +pty_getmp(struct lwp *l, struct mount **mpp) +{ if (ptm == NULL) return EOPNOTSUPP; - if (ptm->arg == NULL) { /* BSDPTY */ - *mpp = NULL; - return 0; - } - - mp = ptm->arg; /* PTYFS */ - - if (cwdi->cwdi_rdir == NULL) - goto ok; - - if (vn_isunder(mp->mnt_vnodecovered, cwdi->cwdi_rdir, l)) - goto ok; - - *mpp = NULL; - return EOPNOTSUPP; -ok: - *mpp = mp; - return 0; + return (*ptm->getmp)(l, mpp); } dev_t @@ -192,6 +173,22 @@ retry: error = EOPNOTSUPP; goto bad; } + /* + * XXX Since PTYFS has now multiple instance support, if we mounted + * more than one PTYFS we must check here the ptyfs_used_tbl, to find + * out if the ptyfsnode is under the appropriate mount and skip the + * node if not, because the pty could has been released, but + * ptyfs_reclaim didn't get a chance to release the corresponding + * node other mount point yet. + * + * It's important to have only one mount point's ptyfsnode for each + * appropriate device in ptyfs_used_tbl, else we will have a security + * problem, because every entry will have access to this device. + * + * Also we will not have not efficient vnode and memory usage. + * You can test this by changing a_recycle from true to false + * in ptyfs_inactive. + */ if ((error = (*ptm->allocvp)(mp, l, &vp, *dev, 'p')) != 0) { DPRINTF(("pty_allocvp %d\n", error)); goto bad; @@ -355,7 +352,7 @@ ptmopen(dev_t dev, int flag, int mode, s switch(minor(dev)) { case 0: /* /dev/ptmx */ case 2: /* /emul/linux/dev/ptmx */ - if ((error = ptyfs_getmp(l, &mp)) != 0) + if ((error = pty_getmp(l, &mp)) != 0) return error; if ((error = pty_alloc_master(l, &fd, &ttydev, mp)) != 0) return error; @@ -403,7 +400,7 @@ ptmioctl(dev_t dev, u_long cmd, void *da error = 0; switch (cmd) { case TIOCPTMGET: - if ((error = ptyfs_getmp(l, &mp)) != 0) + if ((error = pty_getmp(l, &mp)) != 0) return error; if ((error = pty_alloc_master(l, &cfd, &newdev, mp)) != 0) Index: src/sys/kern/tty_pty.c diff -u src/sys/kern/tty_pty.c:1.137 src/sys/kern/tty_pty.c:1.138 --- src/sys/kern/tty_pty.c:1.137 Fri Mar 28 07:55:09 2014 +++ src/sys/kern/tty_pty.c Fri Apr 4 14:11:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_pty.c,v 1.137 2014/03/28 11:55:09 ozaki-r Exp $ */ +/* $NetBSD: tty_pty.c,v 1.138 2014/04/04 18:11:58 christos Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.137 2014/03/28 11:55:09 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.138 2014/04/04 18:11:58 christos Exp $"); #include "opt_ptm.h" @@ -1075,7 +1075,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da #ifndef NO_DEV_PTM /* Allow getting the name from either the master or the slave */ if (cmd == TIOCPTSNAME) { - if ((error = ptyfs_getmp(l, &mp)) != 0) + if ((error = pty_getmp(l, &mp)) != 0) return error; return pty_fill_ptmget(l, dev, -1, -1, data, mp); } @@ -1086,7 +1086,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da switch (cmd) { #ifndef NO_DEV_PTM case TIOCGRANTPT: - if ((error = ptyfs_getmp(l, &mp)) != 0) + if ((error = pty_getmp(l, &mp)) != 0) return error; return pty_grant_slave(l, dev, mp); #endif Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.449 src/sys/sys/param.h:1.450 --- src/sys/sys/param.h:1.449 Sat Mar 29 20:13:59 2014 +++ src/sys/sys/param.h Fri Apr 4 14:11:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.449 2014/03/30 00:13:59 christos Exp $ */ +/* $NetBSD: param.h,v 1.450 2014/04/04 18:11:58 christos Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -63,7 +63,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 699003900 /* NetBSD 6.99.39 */ +#define __NetBSD_Version__ 699004000 /* NetBSD 6.99.40 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) Index: src/sys/sys/pty.h diff -u src/sys/sys/pty.h:1.9 src/sys/sys/pty.h:1.10 --- src/sys/sys/pty.h:1.9 Thu Mar 27 13:31:56 2014 +++ src/sys/sys/pty.h Fri Apr 4 14:11:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pty.h,v 1.9 2014/03/27 17:31:56 christos Exp $ */ +/* $NetBSD: pty.h,v 1.10 2014/04/04 18:11:58 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ int pty_grant_slave(struct lwp *, dev_t, dev_t pty_makedev(char, int); int pty_vn_open(struct vnode *, struct lwp *); struct ptm_pty *pty_sethandler(struct ptm_pty *); -int ptyfs_getmp(struct lwp *, struct mount **); +int pty_getmp(struct lwp *, struct mount **); /* * Ptm_pty is used for switch ptm{x} driver between BSDPTY, PTYFS. @@ -53,7 +53,7 @@ struct ptm_pty { char); int (*makename)(struct mount *, struct lwp *, char *, size_t, dev_t, char); void (*getvattr)(struct mount *, struct lwp *, struct vattr *); - void *arg; + int (*getmp)(struct lwp *, struct mount **); }; #ifdef COMPAT_BSDPTY