diff options
author | jeff <jeff@FreeBSD.org> | 2005-03-28 09:26:17 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-03-28 09:26:17 +0000 |
commit | eb142209f00eb33da0b100cb34139de01a18a9a8 (patch) | |
tree | f00108c18331d06895c07ae67a8821eb055d7943 /sys/kern | |
parent | b25a47299357437c7d4212884ceaecdab1369edc (diff) | |
download | FreeBSD-src-eb142209f00eb33da0b100cb34139de01a18a9a8.zip FreeBSD-src-eb142209f00eb33da0b100cb34139de01a18a9a8.tar.gz |
- We no longer have to bother with PDIRUNLOCK, lookup() handles it for us.
Sponsored by: Isilon Systems, Inc.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_cache.c | 25 |
1 files changed, 4 insertions, 21 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 9d32ca6..b54126a 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -666,24 +666,19 @@ vfs_cache_lookup(ap) vp = *vpp; vpid = vp->v_id; - cnp->cn_flags &= ~PDIRUNLOCK; if (dvp == vp) { /* lookup on "." */ VREF(vp); error = 0; } else if (flags & ISDOTDOT) { VOP_UNLOCK(dvp, 0, td); - cnp->cn_flags |= PDIRUNLOCK; #ifdef LOOKUP_SHARED if ((flags & ISLASTCN) && (flags & LOCKSHARED)) error = vget(vp, LK_SHARED, td); else #endif error = vget(vp, LK_EXCLUSIVE, td); - - if (!error && lockparent && (flags & ISLASTCN)) { - if ((error = vn_lock(dvp, LK_EXCLUSIVE, td)) == 0) - cnp->cn_flags &= ~PDIRUNLOCK; - } + if (error) + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); } else { #ifdef LOOKUP_SHARED if ((flags & ISLASTCN) && (flags & LOCKSHARED)) @@ -691,10 +686,6 @@ vfs_cache_lookup(ap) else #endif error = vget(vp, LK_EXCLUSIVE, td); - if (!lockparent || error || !(flags & ISLASTCN)) { - VOP_UNLOCK(dvp, 0, td); - cnp->cn_flags |= PDIRUNLOCK; - } } /* * Check that the capability number did not change @@ -704,16 +695,8 @@ vfs_cache_lookup(ap) if (vpid == vp->v_id) return (0); vput(vp); - if (lockparent && dvp != vp && (flags & ISLASTCN)) { - VOP_UNLOCK(dvp, 0, td); - cnp->cn_flags |= PDIRUNLOCK; - } - } - if (cnp->cn_flags & PDIRUNLOCK) { - error = vn_lock(dvp, LK_EXCLUSIVE, td); - if (error) - return (error); - cnp->cn_flags &= ~PDIRUNLOCK; + if (flags & ISDOTDOT) + vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, td); } error = VOP_CACHEDLOOKUP(dvp, vpp, cnp); #ifdef LOOKUP_SHARED |