summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-28 09:26:17 +0000
committerjeff <jeff@FreeBSD.org>2005-03-28 09:26:17 +0000
commiteb142209f00eb33da0b100cb34139de01a18a9a8 (patch)
treef00108c18331d06895c07ae67a8821eb055d7943 /sys/kern
parentb25a47299357437c7d4212884ceaecdab1369edc (diff)
downloadFreeBSD-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.c25
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
OpenPOWER on IntegriCloud