diff options
author | mm <mm@FreeBSD.org> | 2011-08-08 14:02:08 +0000 |
---|---|---|
committer | mm <mm@FreeBSD.org> | 2011-08-08 14:02:08 +0000 |
commit | ad65ea8db85e83137a189c98ba78a16dd4590163 (patch) | |
tree | 33f2560f0c7b53d9183b1c75fc08716d17b5fade /sys/kern/vfs_mount.c | |
parent | 8250e2bd5e997e10703a973b17921088072e32cc (diff) | |
download | FreeBSD-src-ad65ea8db85e83137a189c98ba78a16dd4590163.zip FreeBSD-src-ad65ea8db85e83137a189c98ba78a16dd4590163.tar.gz |
Revert r224655 and r224614 because vn_fullpath* does not always work
on nullfs mounts.
Change shall be reconsidered after 9.0 is released.
Requested by: re (kib)
Approved by: re (kib)
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r-- | sys/kern/vfs_mount.c | 86 |
1 files changed, 7 insertions, 79 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 8f7b18f..5d6892c 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -362,60 +362,6 @@ vfs_mergeopts(struct vfsoptlist *toopts, struct vfsoptlist *oldopts) } /* - * Verify vnode's global path - */ -static int -vfs_verify_global_path(struct thread *td, struct vnode *vp, char *fspath) -{ - struct nameidata nd; - struct vnode *vp1; - char *rpath, *fbuf; - int error; - - ASSERT_VOP_ELOCKED(vp, __func__); - - /* Construct global filesystem path from vp. */ - VOP_UNLOCK(vp, 0); - error = vn_fullpath_global(td, vp, &rpath, &fbuf); - if (error != 0) { - vrele(vp); - return (error); - } - if (strlen(rpath) >= MNAMELEN) { - vrele(vp); - error = ENAMETOOLONG; - goto out; - } - - /* - * 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, fspath, td); - error = namei(&nd); - if (error != 0) { - vrele(vp); - goto out; - } - if (NDHASGIANT(&nd)) - mtx_unlock(&Giant); - NDFREE(&nd, NDF_ONLY_PNBUF); - vp1 = nd.ni_vp; - vrele(vp); - if (vp1 != vp) { - vput(vp1); - error = ENOENT; - goto out; - } - - strlcpy(fspath,rpath,MNAMELEN); -out: - free(fbuf, M_TEMP); - return (error); -} - -/* * Mount a filesystem. */ int @@ -1124,14 +1070,16 @@ vfs_domount( NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; if ((fsflags & MNT_UPDATE) == 0) { - error = vfs_verify_global_path(td, vp, fspath); - if (error == 0) - error = vfs_domount_first(td, vfsp, fspath, vp, - fsflags, optlist); - } else + error = vfs_domount_first(td, vfsp, fspath, vp, 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); } @@ -1157,7 +1105,6 @@ unmount(td, uap) } */ *uap; { struct mount *mp; - struct nameidata nd; char *pathbuf; int error, id0, id1; @@ -1193,25 +1140,6 @@ unmount(td, uap) mtx_unlock(&mountlist_mtx); } else { AUDIT_ARG_UPATH1(td, pathbuf); - /* - * If we are jailed and this is not a root jail try to find - * global path for path argument. - */ - if (jailed(td->td_ucred) && - td->td_ucred->cr_prison->pr_root != rootvnode) { - NDINIT(&nd, LOOKUP, - FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, - UIO_SYSSPACE, pathbuf, td); - if (namei(&nd) == 0) { - if (NDHASGIANT(&nd)) - mtx_unlock(&Giant); - NDFREE(&nd, NDF_ONLY_PNBUF); - error = vfs_verify_global_path(td, nd.ni_vp, - pathbuf); - if (error == 0) - vput(nd.ni_vp); - } - } mtx_lock(&mountlist_mtx); TAILQ_FOREACH_REVERSE(mp, &mountlist, mntlist, mnt_list) { if (strcmp(mp->mnt_stat.f_mntonname, pathbuf) == 0) |