diff options
| author | Boris Popov <bp@FreeBSD.org> | 2000-09-17 07:26:42 +0000 |
|---|---|---|
| committer | Boris Popov <bp@FreeBSD.org> | 2000-09-17 07:26:42 +0000 |
| commit | 3ff1a2f43e00ec4764f5e6192d3ac43204dc2b87 (patch) | |
| tree | 31cc99d9e845f0a7f889ef0bec1b1f70ddcf5bee /sys/kern/vfs_cache.c | |
| parent | b5a1cc3a5c46afe7af69741bd221c09e4446be4b (diff) | |
Notes
Diffstat (limited to 'sys/kern/vfs_cache.c')
| -rw-r--r-- | sys/kern/vfs_cache.c | 25 |
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)); } |
