tvc->states |= CUBCinit;
#endif
#ifdef AFS_DARWIN80_ENV
+ osi_Assert((tvc->states & CVInit) == 0);
if (tvc->states & CDeadVnode)
osi_Assert(!vnode_isinuse(vp, 1));
- osi_Assert((tvc->states & CVInit) == 0);
#endif
if (haveGlock) AFS_GUNLOCK();
return;
#endif
}
- vnode_ref(vp);
+ if (vnode_ref(vp)) {
+#if 1
+ panic("vn_hold on terminating vnode");
+#else
+ vnode_put(vp);
+ if (haveGlock) AFS_GLOCK();
+ return;
+#endif
+ }
vnode_put(vp);
#else
/* vget needed for 0 ref'd vnode in GetVCache to not panic in vref.
ReleaseReadLock(&afs_xvcache); /* could be read lock */
if (retry)
goto reskip;
-#ifdef AFS_DARWIN80_ENV
- vnode_get(AFSTOV(lruvcp));
-#endif
/* otherwise, merge in the info. We have to be quite careful here,
* since we need to ensure that we don't merge old info over newer
char *ts = aname;
struct nc *tnc, *tnc1 = 0;
int safety;
+#ifdef AFS_DARWIN80_ENV
+ vnode_t tvp;
+#endif
if (!afs_usednlc)
return 0;
VN_HOLD((vnode_t *) tvc);
#else
#ifdef AFS_DARWIN80_ENV
- if (vnode_get(tvc->v)) {
+ tvp = AFSTOV(tvc);
+ if (vnode_get(tvp)) {
ReleaseReadLock(&afs_xvcache);
dnlcstats.misses++;
- osi_dnlc_remove(adp, aname, tvc);
- return 0;
- }
-#endif
+ osi_dnlc_remove(adp, aname, tvc);
+ return 0;
+ }
+ if (vnode_ref(tvp)) {
+ ReleaseReadLock(&afs_xvcache);
+ AFS_GUNLOCK();
+ vnode_put(tvp);
+ AFS_GLOCK();
+ dnlcstats.misses++;
+ osi_dnlc_remove(adp, aname, tvc);
+ return 0;
+ }
+#else
osi_vnhold(tvc, 0);
#endif
+#endif
ReleaseReadLock(&afs_xvcache);
#ifdef notdef
register struct volume *tv;
afs_int32 cell, volume;
struct afs_q *tq, *uq;
+#ifdef AFS_DARWIN80_ENV
+ vnode_t vp;
+#endif
AFS_STATCNT(PFlushVolumeData);
if (!avc)
#if defined(AFS_SGI_ENV) || defined(AFS_OSF_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
VN_HOLD(AFSTOV(tvc));
#else
-#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
#ifdef AFS_DARWIN80_ENV
- if (vnode_get(AFSTOV(tvc)))
- continue;
-#endif
+ vp = AFSTOV(tvc);
+ if (vnode_get(vp))
+ continue;
+ if (vnode_ref(vp)) {
+ AFS_GUNLOCK();
+ vnode_put(vp);
+ AFS_GLOCK();
+ continue;
+ }
+#else
+#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
osi_vnhold(tvc, 0);
#else
VREFCOUNT_INC(tvc); /* AIX, apparently */
#endif
#endif
+#endif
ReleaseReadLock(&afs_xvcache);
#ifdef AFS_BOZONLOCK_ENV
afs_BozonLock(&tvc->pvnLock, tvc); /* Since afs_TryToSmush will do a pvn_vptrunc */
#ifdef AFS_OSF_ENV
int vg;
#endif
+#ifdef AFS_DARWIN80_ENV
+ vnode_t tvp;
+#endif
start = osi_Time();
afs_osi_Sleep(&tvc->states);
goto rootvc_loop;
}
- if (vnode_get(AFSTOV(tvc))) /* this bumps ref count */
- continue;
+ tvp = AFSTOV(tvc);
+ if (vnode_get(tvp)) /* this bumps ref count */
+ continue;
+ if (vnode_ref(tvp)) {
+ AFS_GUNLOCK();
+ /* AFSTOV(tvc) may be NULL */
+ vnode_put(tvp);
+ AFS_GLOCK();
+ continue;
+ }
#endif
break;
}
if (tvc) {
AFS_GUNLOCK();
vnode_put(AFSTOV(tvc));
+ vnode_rele(AFSTOV(tvc));
AFS_GLOCK();
}
#endif
if (cached)
*cached = 1;
afs_stats_cmperf.vcacheHits++;
-#ifdef AFS_OSF_ENV
+#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN80_ENV)
/* we already bumped the ref count in the for loop above */
#else /* AFS_OSF_ENV */
osi_vnhold(tvc, 0);
#if defined( AFS_OSF_ENV)
int vg;
#endif
+#ifdef AFS_DARWIN80_ENV
+ vnode_t tvp;
+#endif
AFS_STATCNT(afs_FindVCache);
findvc_sleep(tvc, flag);
goto findloop;
}
- if (vnode_get(AFSTOV(tvc)))
- continue;
+ tvp = AFSTOV(tvc);
+ if (vnode_get(tvp))
+ continue;
+ if (vnode_ref(tvp)) {
+ AFS_GUNLOCK();
+ /* AFSTOV(tvc) may be NULL */
+ vnode_put(tvp);
+ AFS_GLOCK();
+ continue;
+ }
#endif
break;
}
if (tvc) {
if (retry)
*retry = 0;
-#if !defined(AFS_OSF_ENV)
+#if !defined(AFS_OSF_ENV) && !defined(AFS_DARWIN80_ENV)
osi_vnhold(tvc, retry); /* already held, above */
if (retry && *retry)
return 0;
#ifdef AFS_OSF_ENV
int vg;
#endif
+#ifdef AFS_DARWIN80_ENV
+ vnode_t tvp;
+#endif
AFS_STATCNT(afs_FindVCache);
afs_osi_Sleep(&tvc->states);
goto loop;
}
- if (vnode_get(AFSTOV(tvc))) {
- /* This vnode no longer exists. */
- continue;
- }
+ tvp = AFSTOV(tvc);
+ if (vnode_get(tvp)) {
+ /* This vnode no longer exists. */
+ continue;
+ }
+ if (vnode_ref(tvp)) {
+ /* This vnode no longer exists. */
+ AFS_GUNLOCK();
+ /* AFSTOV(tvc) may be NULL */
+ vnode_put(tvp);
+ AFS_GLOCK();
+ continue;
+ }
#endif /* AFS_DARWIN80_ENV */
count++;
if (found_tvc) {
unsigned int now;
struct vcache *tvc;
afs_int32 *volumeID, *cellID, vsize, nvols;
+#ifdef AFS_DARWIN80_ENV
+ vnode_t tvp;
+#endif
AFS_STATCNT(afs_CheckVolumeNames);
nvols = 0;
afs_osi_Sleep(&tvc->states);
goto loop;
}
- if (vnode_get(AFSTOV(tvc)))
- continue;
-#endif
+ tvp = AFSTOV(tvc);
+ if (vnode_get(tvp))
+ continue;
+ if (vnode_ref(tvp)) {
+ AFS_GUNLOCK();
+ /* AFSTOV(tvc) may be NULL */
+ vnode_put(tvp);
+ AFS_GLOCK();
+ continue;
+ }
+#else
AFS_FAST_HOLD(tvc);
+#endif
ReleaseReadLock(&afs_xvcache);
ObtainWriteLock(&afs_xcbhash, 485);