svn commit: r224614 - head/sys/kern
Xin LI
delphij at delphij.net
Thu Aug 4 22:49:41 UTC 2011
-----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 <delphij at 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-----
-------------- next part --------------
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);
}
More information about the svn-src-head
mailing list