| 2247 | } |
| 2248 | |
| 2249 | static void __noinline |
| 2250 | cache_enter_dotdot_prep(struct vnode *dvp, struct vnode *vp, |
| 2251 | struct componentname *cnp) |
| 2252 | { |
| 2253 | struct celockstate cel; |
| 2254 | struct namecache *ncp; |
| 2255 | uint32_t hash; |
| 2256 | int len; |
| 2257 | |
| 2258 | if (atomic_load_ptr(&dvp->v_cache_dd) == NULL) |
| 2259 | return; |
| 2260 | len = cnp->cn_namelen; |
| 2261 | cache_celockstate_init(&cel); |
| 2262 | hash = cache_get_hash(cnp->cn_nameptr, len, dvp); |
| 2263 | cache_enter_lock_dd(&cel, dvp, vp, hash); |
| 2264 | ncp = dvp->v_cache_dd; |
| 2265 | if (ncp != NULL && (ncp->nc_flag & NCF_ISDOTDOT)) { |
| 2266 | KASSERT(ncp->nc_dvp == dvp, ("wrong isdotdot parent")); |
| 2267 | cache_zap_locked(ncp); |
| 2268 | } else { |
| 2269 | ncp = NULL; |
| 2270 | } |
| 2271 | atomic_store_ptr(&dvp->v_cache_dd, NULL); |
| 2272 | cache_enter_unlock(&cel); |
| 2273 | if (ncp != NULL) |
| 2274 | cache_free(ncp); |
| 2275 | } |
| 2276 | |
| 2277 | /* |
| 2278 | * Add an entry to the cache. |
no test coverage detected