-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

On 08/04/11 14:46, Jung-uk Kim wrote:
> On Tuesday 02 August 2011 03:13 pm, Martin Matuska wrote:
>> Author: mm Date: Tue Aug  2 19:13:56 2011 New Revision: 224614 URL:
>> http://svn.freebsd.org/changeset/base/224614
>> 
>> Log: For mount, discover f_mntonname from supplied path argument 
>> using vn_fullpath_global(). This fixes f_mntonname if mounting 
>> inside chroot, jail or with relative path as argument.
>> 
>> For unmount in jail, use vn_fullpath_global() to discover global
>> path from supplied path argument. This fixes unmount in jail.
> 
> It seems fdescfs(5) hangs after this commit if the mount point is
> /dev/fd.

Please find attached kib@'s patch that fixes this issue (david wolfskill
and I have both tested individually).

Cheers,
- -- 
Xin LI <delp...@delphij.net>    https://www.delphij.net/
FreeBSD - The Power to Serve!           Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (FreeBSD)

iQEcBAEBCAAGBQJOOyIBAAoJEATO+BI/yjfB7TAIAMHOQVpyZf8ZwayvMQ0Dnl5L
N9c+ttuSDTlrIApj20Hz8Ezp1Z+u91euwhGizXq61F5KBmD2J1CmjNXIsanLlRn5
DXebrls7KRLwqRAPf6HciIaU8G0d9ktP1Z3cHDRgLbc43cEEJHHi5WuMREtENTF2
RUkQwh8m7PTlzFnyIGVnamTkpF9AC2xK4XSlrdVSn+tEWFMVXPWo8EIvh1vJRwZ3
CKCF/aLyVC/DD2LAi9IWHIx4MQ4x9LoQFzBiOzkhhv63JmL0hd8E6GNei6VQS/yK
rQ+Td8YEwOVttpXF62CiNarYzKmOoMhJ3oaKt922V6uoxIXh3/Dh4xSXt/ZDxV0=
=q2uo
-----END PGP SIGNATURE-----
Index: sys/kern/vfs_mount.c
===================================================================
--- sys/kern/vfs_mount.c        (revision 224652)
+++ sys/kern/vfs_mount.c        (working copy)
@@ -746,13 +746,15 @@ vfs_domount_first(
        struct thread *td,              /* Calling thread. */
        struct vfsconf *vfsp,           /* File system type. */
        struct vnode *vp,               /* Vnode to be covered. */
+       char *ufspath,
        int fsflags,                    /* Flags common to all filesystems. */
        struct vfsoptlist **optlist     /* Options local to the filesystem. */
        )
 {
        struct vattr va;
+       struct nameidata nd;
        struct mount *mp;
-       struct vnode *newdp;
+       struct vnode *newdp, *vp1;
        char *fspath, *fbuf;
        int error;
 
@@ -761,18 +763,47 @@ vfs_domount_first(
        KASSERT((fsflags & MNT_UPDATE) == 0, ("MNT_UPDATE shouldn't be here"));
 
        /* Construct global filesystem path from vp. */
+       VOP_UNLOCK(vp, 0);
        error = vn_fullpath_global(td, vp, &fspath, &fbuf);
        if (error != 0) {
-               vput(vp);
+               vrele(vp);
                return (error);
        }
        if (strlen(fspath) >= MNAMELEN) {
-               vput(vp);
+               vrele(vp);
                free(fbuf, M_TEMP);
                return (ENAMETOOLONG);
        }
+       if ((vp->v_iflag & VI_DOOMED) != 0) {
+               vrele(vp);
+               free(fbuf, M_TEMP);
+               return (EBADF);
+       }
 
        /*
+        * Re-lookup the vnode by path. As a side effect, the vnode is
+        * relocked.  If vnode was renamed, return ENOENT.
+        */
+       NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1,
+           UIO_SYSSPACE, ufspath, td);
+       error = namei(&nd);
+       if (error != 0) {
+               vrele(vp);
+               free(fbuf, M_TEMP);
+               return (error);
+       }
+       if (NDHASGIANT(&nd))
+               mtx_unlock(&Giant);
+       NDFREE(&nd, NDF_ONLY_PNBUF);
+       vp1 = nd.ni_vp;
+       vrele(vp);
+       if (vp1 != vp) {
+               vput(vp1);
+               free(fbuf, M_TEMP);
+               return (ENOENT);
+       }
+
+       /*
         * If the user is not root, ensure that they own the directory
         * onto which we are attempting to mount.
         */
@@ -1084,14 +1115,11 @@ vfs_domount(
        NDFREE(&nd, NDF_ONLY_PNBUF);
        vp = nd.ni_vp;
        if ((fsflags & MNT_UPDATE) == 0)
-               error = vfs_domount_first(td, vfsp, vp, fsflags, optlist);
+               error = vfs_domount_first(td, vfsp, vp, fspath, fsflags, 
optlist);
        else
                error = vfs_domount_update(td, vp, fsflags, optlist);
        mtx_unlock(&Giant);
 
-       ASSERT_VI_UNLOCKED(vp, __func__);
-       ASSERT_VOP_UNLOCKED(vp, __func__);
-
        return (error);
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to