diff options
Diffstat (limited to 'sys/kern/vfs_lookup.c')
-rw-r--r-- | sys/kern/vfs_lookup.c | 61 |
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. */ |