tech-kern archive

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

Re: Enhance ptyfs to handle multiple instances.



On Mar 19,  6:09pm, netbsd%izyk.ru@localhost (Ilya Zykov) wrote:
-- Subject: Re: Enhance ptyfs to handle multiple instances.

| Index: nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c
| diff -u nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c:1.1.1.1 
nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c:1.7
| --- nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c:1.1.1.1     Tue Mar  4 22:16:03 2014
| +++ nbcur/src/sys/fs/ptyfs/ptyfs_vfsops.c     Wed Mar 19 15:41:47 2014
| @@ -109,14 +109,16 @@
|       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);

Might as well pass NULL for cwdi->cwdi_rdir, since it does the same.

| -     if (error)      /* XXX */
| +     if (error) {    /* Mount point is out of rdir */
| +             rv = NULL;
|               goto out;
| +     }

Ok, error is better in this case.

|       len = strlen(bp);
|       if (len < sizeof(mp->mnt_stat.f_mntonname))     /* XXX */
| -             rv += len;
| +             rv += strlen(rv) - len;

Ok.

|  out:
|       free(buf, M_TEMP);
|       return rv;
| @@ -128,6 +130,7 @@
|  {
|       struct mount *mp = pt->arg;
|       size_t len;
| +     const char *np;
|  
|       switch (ms) {
|       case 'p':
| @@ -135,9 +138,13 @@
|               len = snprintf(tbuf, bufsiz, "/dev/null");
|               break;
|       case 't':
| -             len = snprintf(tbuf, bufsiz, "%s/%llu", ptyfs__getpath(l, mp),
| -                 (unsigned long long)minor(dev));
| -             break;
| +             np = ptyfs__getpath(l, mp);
| +             if ( np ) {

Whitespace. I would flip the logic (it reduces the diff too).

                if (np == NULL)
                        return EOPNOTSUPP;

                len = snprintf(tbuf, bufsiz, "%s/%llu", np,
                    (unsigned long long)minor(dev));
                break;
|       default:
|               return EINVAL;
|       }
| @@ -241,7 +248,7 @@
|               return 0;
|       }
|  
| -#if 0
| +#if 1
|       /* Don't allow more than one mount */
|       if (ptyfs_count)
|               return EBUSY;

People did not like that.

| Index: nbcur/src/sys/kern/tty_ptm.c
| diff -u nbcur/src/sys/kern/tty_ptm.c:1.1.1.2 nbcur/src/sys/kern/tty_ptm.c:1.2
| --- nbcur/src/sys/kern/tty_ptm.c:1.1.1.2      Mon Mar 17 15:46:10 2014
| +++ nbcur/src/sys/kern/tty_ptm.c      Wed Mar 19 12:59:47 2014
| @@ -381,7 +381,9 @@
|                       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 )

Whitespace.

| +                     break;  /* goto bad2 */
| +             return 0;
|       default:
|  #ifdef COMPAT_60
|               error = compat_60_ptmioctl(dev, cmd, data, flag, l);
| @@ -391,6 +393,11 @@
|               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) {

Yes, this is correct.

christos


Home | Main Index | Thread Index | Old Index