diff --git a/src/afs/DARWIN/osi_vm.c b/src/afs/DARWIN/osi_vm.c index 07a5d31e3d..ed845d10e1 100644 --- a/src/afs/DARWIN/osi_vm.c +++ b/src/afs/DARWIN/osi_vm.c @@ -41,6 +41,8 @@ osi_VM_FlushVCache(struct vcache *avc, int *slept) kern_return_t kret; off_t size; + if (!vp) + return 0; AFS_GUNLOCK(); #if 0 if (!(UBCINFOMISSING(vp) || UBCINFORECLAIMED(vp))) { diff --git a/src/afs/afs_osidnlc.c b/src/afs/afs_osidnlc.c index cee9814841..5f050ec272 100644 --- a/src/afs/afs_osidnlc.c +++ b/src/afs/afs_osidnlc.c @@ -239,6 +239,12 @@ osi_dnlc_lookup(struct vcache *adp, char *aname, int locktype) ReleaseReadLock(&afs_xvcache); dnlcstats.misses++; } else { + if (tvc->states & CVInit) { + ReleaseReadLock(&afs_xvcache); + dnlcstats.misses++; + osi_dnlc_remove(adp, aname, tvc); + return 0; + } #ifdef AFS_OSF_ENV VN_HOLD((vnode_t *) tvc); #else diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index e4186ce5d6..a55e59c47c 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -602,6 +602,18 @@ afs_FlushReclaimedVcaches(void) tmpReclaimedVCList = tvc; printf("Reclaim list flush %x failed: %d\n", tvc, code); } + if (tvc->states & (CVInit +#ifdef AFS_DARWIN80_ENV + | CDeadVnode +#endif + )) { + tvc->states &= ~(CVInit +#ifdef AFS_DARWIN80_ENV + | CDeadVnode +#endif + ); + afs_osi_Wakeup(&tvc->states); + } } if (tmpReclaimedVCList) ReclaimedVCList = tmpReclaimedVCList;