summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_lookup.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-10-22 17:50:54 +0000
committerkib <kib@FreeBSD.org>2012-10-22 17:50:54 +0000
commit560aa751e0f5cfef868bdf3fab01cdbc5169ef82 (patch)
tree6e9ef0a47c5e91d26227820c50c9767e84550821 /sys/kern/vfs_lookup.c
parentca71b68ea40c83f641d6485e027368568f244197 (diff)
downloadFreeBSD-src-560aa751e0f5cfef868bdf3fab01cdbc5169ef82.zip
FreeBSD-src-560aa751e0f5cfef868bdf3fab01cdbc5169ef82.tar.gz
Remove the support for using non-mpsafe filesystem modules.
In particular, do not lock Giant conditionally when calling into the filesystem module, remove the VFS_LOCK_GIANT() and related macros. Stop handling buffers belonging to non-mpsafe filesystems. The VFS_VERSION is bumped to indicate the interface change which does not result in the interface signatures changes. Conducted and reviewed by: attilio Tested by: pho
Diffstat (limited to 'sys/kern/vfs_lookup.c')
-rw-r--r--sys/kern/vfs_lookup.c61
1 files changed, 4 insertions, 57 deletions
diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c
index d53dbd0..cbb1855 100644
--- a/sys/kern/vfs_lookup.c
+++ b/sys/kern/vfs_lookup.c
@@ -133,10 +133,7 @@ namei(struct nameidata *ndp)
struct componentname *cnp = &ndp->ni_cnd;
struct thread *td = cnp->cn_thread;
struct proc *p = td->td_proc;
- int vfslocked;
- KASSERT((cnp->cn_flags & MPSAFE) != 0 || mtx_owned(&Giant) != 0,
- ("NOT MPSAFE and Giant not held"));
ndp->ni_cnd.cn_cred = ndp->ni_cnd.cn_thread->td_ucred;
KASSERT(cnp->cn_cred && p, ("namei: bad cred/proc"));
KASSERT((cnp->cn_nameiop & (~OPMASK)) == 0,
@@ -249,9 +246,7 @@ namei(struct nameidata *ndp)
if (error != 0 || dp != NULL) {
FILEDESC_SUNLOCK(fdp);
if (error == 0 && dp->v_type != VDIR) {
- vfslocked = VFS_LOCK_GIANT(dp->v_mount);
vrele(dp);
- VFS_UNLOCK_GIANT(vfslocked);
error = ENOTDIR;
}
}
@@ -268,15 +263,11 @@ namei(struct nameidata *ndp)
dp = fdp->fd_cdir;
VREF(dp);
FILEDESC_SUNLOCK(fdp);
- if (ndp->ni_startdir != NULL) {
- vfslocked = VFS_LOCK_GIANT(ndp->ni_startdir->v_mount);
+ if (ndp->ni_startdir != NULL)
vrele(ndp->ni_startdir);
- VFS_UNLOCK_GIANT(vfslocked);
- }
}
SDT_PROBE(vfs, namei, lookup, entry, dp, cnp->cn_pnbuf,
cnp->cn_flags, 0, 0);
- vfslocked = VFS_LOCK_GIANT(dp->v_mount);
for (;;) {
/*
* Check if root directory should replace current directory.
@@ -285,7 +276,6 @@ namei(struct nameidata *ndp)
cnp->cn_nameptr = cnp->cn_pnbuf;
if (*(cnp->cn_nameptr) == '/') {
vrele(dp);
- VFS_UNLOCK_GIANT(vfslocked);
if (ndp->ni_strictrelative != 0) {
#ifdef KTRACE
if (KTRPOINT(curthread, KTR_CAPFAIL))
@@ -298,11 +288,8 @@ namei(struct nameidata *ndp)
ndp->ni_pathlen--;
}
dp = ndp->ni_rootdir;
- vfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
}
- if (vfslocked)
- ndp->ni_cnd.cn_flags |= GIANTHELD;
ndp->ni_startdir = dp;
error = lookup(ndp);
if (error) {
@@ -315,8 +302,6 @@ namei(struct nameidata *ndp)
0, 0);
return (error);
}
- vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0;
- ndp->ni_cnd.cn_flags &= ~GIANTHELD;
/*
* If not a symbolic link, we're done.
*/
@@ -330,10 +315,6 @@ namei(struct nameidata *ndp)
} else
cnp->cn_flags |= HASBUF;
- if ((cnp->cn_flags & MPSAFE) == 0) {
- VFS_UNLOCK_GIANT(vfslocked);
- } else if (vfslocked)
- ndp->ni_cnd.cn_flags |= GIANTHELD;
SDT_PROBE(vfs, namei, lookup, return, 0, ndp->ni_vp,
0, 0, 0);
return (0);
@@ -400,7 +381,6 @@ namei(struct nameidata *ndp)
vput(ndp->ni_vp);
ndp->ni_vp = NULL;
vrele(ndp->ni_dvp);
- VFS_UNLOCK_GIANT(vfslocked);
SDT_PROBE(vfs, namei, lookup, return, error, NULL, 0, 0, 0);
return (error);
}
@@ -506,19 +486,13 @@ lookup(struct nameidata *ndp)
int error = 0;
int dpunlocked = 0; /* dp has already been unlocked */
struct componentname *cnp = &ndp->ni_cnd;
- int vfslocked; /* VFS Giant state for child */
- int dvfslocked; /* VFS Giant state for parent */
- int tvfslocked;
int lkflags_save;
int ni_dvp_unlocked;
/*
* Setup: break out flag bits into variables.
*/
- dvfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0;
- vfslocked = 0;
ni_dvp_unlocked = 0;
- ndp->ni_cnd.cn_flags &= ~GIANTHELD;
wantparent = cnp->cn_flags & (LOCKPARENT | WANTPARENT);
KASSERT(cnp->cn_nameiop == LOOKUP || wantparent,
("CREATE, DELETE, RENAME require LOCKPARENT or WANTPARENT."));
@@ -684,7 +658,6 @@ dirloop:
(cnp->cn_flags & NOCROSSMOUNT) != 0)) {
ndp->ni_dvp = dp;
ndp->ni_vp = dp;
- vfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
goto nextname;
}
@@ -696,11 +669,8 @@ dirloop:
}
tdp = dp;
dp = dp->v_mount->mnt_vnodecovered;
- tvfslocked = dvfslocked;
- dvfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
vput(tdp);
- VFS_UNLOCK_GIANT(tvfslocked);
vn_lock(dp,
compute_cn_lkflags(dp->v_mount, cnp->cn_lkflags |
LK_RETRY, ISDOTDOT));
@@ -722,7 +692,6 @@ unionlookup:
ndp->ni_dvp = dp;
ndp->ni_vp = NULL;
ASSERT_VOP_LOCKED(dp, "lookup");
- VNASSERT(vfslocked == 0, dp, ("lookup: vfslocked %d", vfslocked));
/*
* If we have a shared lock we may need to upgrade the lock for the
* last operation.
@@ -754,11 +723,8 @@ unionlookup:
(dp->v_mount->mnt_flag & MNT_UNION)) {
tdp = dp;
dp = dp->v_mount->mnt_vnodecovered;
- tvfslocked = dvfslocked;
- dvfslocked = VFS_LOCK_GIANT(dp->v_mount);
VREF(dp);
vput(tdp);
- VFS_UNLOCK_GIANT(tvfslocked);
vn_lock(dp,
compute_cn_lkflags(dp->v_mount, cnp->cn_lkflags |
LK_RETRY, cnp->cn_flags));
@@ -812,7 +778,6 @@ unionlookup:
}
dp = ndp->ni_vp;
- vfslocked = VFS_LOCK_GIANT(dp->v_mount);
/*
* Check to see if the vnode has been mounted on;
@@ -823,14 +788,10 @@ unionlookup:
if (vfs_busy(mp, 0))
continue;
vput(dp);
- VFS_UNLOCK_GIANT(vfslocked);
- vfslocked = VFS_LOCK_GIANT(mp);
if (dp != ndp->ni_dvp)
vput(ndp->ni_dvp);
else
vrele(ndp->ni_dvp);
- VFS_UNLOCK_GIANT(dvfslocked);
- dvfslocked = 0;
vref(vp_crossmp);
ndp->ni_dvp = vp_crossmp;
error = VFS_ROOT(mp, compute_cn_lkflags(mp, cnp->cn_lkflags,
@@ -891,9 +852,6 @@ nextname:
vput(ndp->ni_dvp);
else
vrele(ndp->ni_dvp);
- VFS_UNLOCK_GIANT(dvfslocked);
- dvfslocked = vfslocked; /* dp becomes dvp in dirloop */
- vfslocked = 0;
goto dirloop;
}
/*
@@ -922,8 +880,6 @@ nextname:
vput(ndp->ni_dvp);
else
vrele(ndp->ni_dvp);
- VFS_UNLOCK_GIANT(dvfslocked);
- dvfslocked = 0;
} else if ((cnp->cn_flags & LOCKPARENT) == 0 && ndp->ni_dvp != dp) {
VOP_UNLOCK(ndp->ni_dvp, 0);
ni_dvp_unlocked = 1;
@@ -949,10 +905,6 @@ success:
goto bad2;
}
}
- if (vfslocked && dvfslocked)
- VFS_UNLOCK_GIANT(dvfslocked); /* Only need one */
- if (vfslocked || dvfslocked)
- ndp->ni_cnd.cn_flags |= GIANTHELD;
return (0);
bad2:
@@ -965,9 +917,6 @@ bad2:
bad:
if (!dpunlocked)
vput(dp);
- VFS_UNLOCK_GIANT(vfslocked);
- VFS_UNLOCK_GIANT(dvfslocked);
- ndp->ni_cnd.cn_flags &= ~GIANTHELD;
ndp->ni_vp = NULL;
return (error);
}
@@ -1230,13 +1179,13 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path,
for (cp = &ptr[len] - 1; *cp != '/'; cp--);
*cp = '\0';
- NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, buf, td);
error = namei(&nd);
*cp = '/';
if (error != 0)
goto keeporig;
} else {
- NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, buf, td);
+ NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, buf, td);
error = namei(&nd);
if (error != 0)
@@ -1250,7 +1199,7 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path,
* root directory and never finding it, because "/" resolves
* to the emulation root directory. This is expensive :-(
*/
- NDINIT(&ndroot, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, prefix,
+ NDINIT(&ndroot, LOOKUP, FOLLOW, UIO_SYSSPACE, prefix,
td);
/* We shouldn't ever get an error from this namei(). */
@@ -1261,13 +1210,11 @@ kern_alternate_path(struct thread *td, const char *prefix, const char *path,
NDFREE(&ndroot, NDF_ONLY_PNBUF);
vrele(ndroot.ni_vp);
- VFS_UNLOCK_GIANT(NDHASGIANT(&ndroot));
}
}
NDFREE(&nd, NDF_ONLY_PNBUF);
vrele(nd.ni_vp);
- VFS_UNLOCK_GIANT(NDHASGIANT(&nd));
keeporig:
/* If there was an error, use the original path name. */
OpenPOWER on IntegriCloud