tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Enhance ptyfs to handle multiple instances.



> | > People did not like that.
> | 
> | Didn't like what "if 1" or "return EBUSY"?
> 
> The return EBUSY...
> 

Ok, but bug will stay in the system, temporarily.

fs/ptyfs/ptyfs_vfsops.c |   16 +++++++++++-----
kern/tty_ptm.c          |    9 ++++++++-
2 files changed, 19 insertions(+), 6 deletions(-)

Ilya.

Index: fs/ptyfs/ptyfs_vfsops.c
===================================================================
RCS file: /cvsil/nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 ptyfs_vfsops.c
--- fs/ptyfs/ptyfs_vfsops.c     4 Mar 2014 18:16:03 -0000       1.1.1.1
+++ fs/ptyfs/ptyfs_vfsops.c     19 Mar 2014 17:36:48 -0000
@@ -109,14 +109,16 @@ ptyfs__getpath(struct lwp *l, const stru
        buf = malloc(MAXBUF, M_TEMP, M_WAITOK);
        bp = buf + MAXBUF;
        *--bp = '\0';
-       error = getcwd_common(cwdi->cwdi_rdir, rootvnode, &bp,
+       error = getcwd_common(mp->mnt_vnodecovered, cwdi->cwdi_rdir, &bp,
            buf, MAXBUF / 2, 0, l);
-       if (error)      /* XXX */
+       if (error) {    /* Mount point is out of rdir */
+               rv = NULL;
                goto out;
+       }
 
        len = strlen(bp);
        if (len < sizeof(mp->mnt_stat.f_mntonname))     /* XXX */
-               rv += len;
+               rv += strlen(rv) - len;
 out:
        free(buf, M_TEMP);
        return rv;
@@ -128,6 +130,7 @@ ptyfs__makename(struct ptm_pty *pt, stru
 {
        struct mount *mp = pt->arg;
        size_t len;
+       const char *np;
 
        switch (ms) {
        case 'p':
@@ -135,8 +138,11 @@ ptyfs__makename(struct ptm_pty *pt, stru
                len = snprintf(tbuf, bufsiz, "/dev/null");
                break;
        case 't':
-               len = snprintf(tbuf, bufsiz, "%s/%llu", ptyfs__getpath(l, mp),
-                   (unsigned long long)minor(dev));
+               np = ptyfs__getpath(l, mp);
+               if (np == NULL)
+                       return EOPNOTSUPP;
+               len = snprintf(tbuf, bufsiz, "%s/%llu", np,
+                       (unsigned long long)minor(dev));
                break;
        default:
                return EINVAL;
Index: kern/tty_ptm.c
===================================================================
RCS file: /cvsil/nbcur/src/sys/kern/tty_ptm.c,v
retrieving revision 1.1.1.2
diff -u -p -r1.1.1.2 tty_ptm.c
--- kern/tty_ptm.c      17 Mar 2014 11:46:10 -0000      1.1.1.2
+++ kern/tty_ptm.c      19 Mar 2014 17:36:48 -0000
@@ -381,7 +381,9 @@ ptmioctl(dev_t dev, u_long cmd, void *da
                        goto bad;
 
                /* now, put the indices and names into struct ptmget */
-               return pty_fill_ptmget(l, newdev, cfd, sfd, data);
+               if ((error = pty_fill_ptmget(l, newdev, cfd, sfd, data)) != 0)
+                       break;  /* goto bad2 */
+               return 0;
        default:
 #ifdef COMPAT_60
                error = compat_60_ptmioctl(dev, cmd, data, flag, l);
@@ -391,6 +393,11 @@ ptmioctl(dev_t dev, u_long cmd, void *da
                DPRINTF(("ptmioctl EINVAL\n"));
                return EINVAL;
        }
+/* bad2: close sfd too */
+       fp = fd_getfile(sfd);
+       if (fp != NULL) {
+               fd_close(sfd);
+       }
  bad:
        fp = fd_getfile(cfd);
        if (fp != NULL) {


Home | Main Index | Thread Index | Old Index