summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_cache.c
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2009-04-17 18:11:11 +0000
committerkan <kan@FreeBSD.org>2009-04-17 18:11:11 +0000
commitfebc8407e1d693cb307c53533bbec43dc1484df4 (patch)
treeed29b13a5e53d2bdcaba667481ec5d31788356cb /sys/kern/vfs_cache.c
parent1fdfdc46b714ca5b209949a73902bd95b6b312be (diff)
downloadFreeBSD-src-febc8407e1d693cb307c53533bbec43dc1484df4.zip
FreeBSD-src-febc8407e1d693cb307c53533bbec43dc1484df4.tar.gz
More fallout from negative dotdot caching. Negative entries should
be removed from and reinserted to proper ncneg list. Reported by: pho Submitted by: kib
Diffstat (limited to 'sys/kern/vfs_cache.c')
-rw-r--r--sys/kern/vfs_cache.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index a541d76..01c5e4c 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -630,18 +630,23 @@ cache_enter(dvp, vp, cnp)
* to new parent vnode, otherwise continue with new
* namecache entry allocation.
*/
- if ((ncp = dvp->v_cache_dd) != NULL) {
- if (ncp->nc_flag & NCF_ISDOTDOT) {
- KASSERT(ncp->nc_dvp == dvp,
- ("wrong isdotdot parent"));
+ if ((ncp = dvp->v_cache_dd) != NULL &&
+ ncp->nc_flag & NCF_ISDOTDOT) {
+ KASSERT(ncp->nc_dvp == dvp,
+ ("wrong isdotdot parent"));
+ if (ncp->nc_vp != NULL)
TAILQ_REMOVE(&ncp->nc_vp->v_cache_dst,
ncp, nc_dst);
+ else
+ TAILQ_REMOVE(&ncneg, ncp, nc_dst);
+ if (vp != NULL)
TAILQ_INSERT_HEAD(&vp->v_cache_dst,
ncp, nc_dst);
- ncp->nc_vp = vp;
- CACHE_WUNLOCK();
- return;
- }
+ else
+ TAILQ_INSERT_TAIL(&ncneg, ncp, nc_dst);
+ ncp->nc_vp = vp;
+ CACHE_WUNLOCK();
+ return;
}
dvp->v_cache_dd = NULL;
SDT_PROBE(vfs, namecache, enter, done, dvp, "..", vp,
OpenPOWER on IntegriCloud