summaryrefslogtreecommitdiff
path: root/sys/kern/vfs_cache.c
diff options
context:
space:
mode:
authorBoris Popov <bp@FreeBSD.org>2000-09-17 07:26:42 +0000
committerBoris Popov <bp@FreeBSD.org>2000-09-17 07:26:42 +0000
commit3ff1a2f43e00ec4764f5e6192d3ac43204dc2b87 (patch)
tree31cc99d9e845f0a7f889ef0bec1b1f70ddcf5bee /sys/kern/vfs_cache.c
parentb5a1cc3a5c46afe7af69741bd221c09e4446be4b (diff)
Notes
Diffstat (limited to 'sys/kern/vfs_cache.c')
-rw-r--r--sys/kern/vfs_cache.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index 5cc4f1cabefc..976f85e2badf 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -458,18 +458,24 @@ 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, p);
+ cnp->cn_flags |= PDIRUNLOCK;
error = vget(vp, LK_EXCLUSIVE, p);
- if (!error && lockparent && (flags & ISLASTCN))
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
+ if (!error && lockparent && (flags & ISLASTCN)) {
+ if ((error = vn_lock(dvp, LK_EXCLUSIVE, p)) == 0)
+ cnp->cn_flags &= ~PDIRUNLOCK;
+ }
} else {
error = vget(vp, LK_EXCLUSIVE, p);
- if (!lockparent || error || !(flags & ISLASTCN))
+ if (!lockparent || error || !(flags & ISLASTCN)) {
VOP_UNLOCK(dvp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
}
/*
* Check that the capability number did not change
@@ -479,12 +485,17 @@ vfs_cache_lookup(ap)
if (vpid == vp->v_id)
return (0);
vput(vp);
- if (lockparent && dvp != vp && (flags & ISLASTCN))
+ if (lockparent && dvp != vp && (flags & ISLASTCN)) {
VOP_UNLOCK(dvp, 0, p);
+ cnp->cn_flags |= PDIRUNLOCK;
+ }
+ }
+ if (cnp->cn_flags & PDIRUNLOCK) {
+ error = vn_lock(dvp, LK_EXCLUSIVE, p);
+ if (error)
+ return (error);
+ cnp->cn_flags &= ~PDIRUNLOCK;
}
- error = vn_lock(dvp, LK_EXCLUSIVE, p);
- if (error)
- return (error);
return (VOP_CACHEDLOOKUP(dvp, vpp, cnp));
}