diff options
author | kan <kan@FreeBSD.org> | 2009-04-17 18:11:11 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2009-04-17 18:11:11 +0000 |
commit | febc8407e1d693cb307c53533bbec43dc1484df4 (patch) | |
tree | ed29b13a5e53d2bdcaba667481ec5d31788356cb /sys/kern/vfs_cache.c | |
parent | 1fdfdc46b714ca5b209949a73902bd95b6b312be (diff) | |
download | FreeBSD-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.c | 21 |
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, |