From 591d9c76c8d935809625cbaab248ca7c2770c751 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Sat, 18 Feb 2006 04:53:34 +0000 Subject: [PATCH] vnode-ref-verification-20060217 verify we got a ref when we call vnode_ref --- src/afs/DARWIN/osi_vnodeops.c | 12 +++++++-- src/afs/VNOPS/afs_vnop_lookup.c | 3 --- src/afs/afs_osidnlc.c | 24 ++++++++++++++---- src/afs/afs_pioctl.c | 19 +++++++++++--- src/afs/afs_vcache.c | 55 +++++++++++++++++++++++++++++++++-------- src/afs/afs_volume.c | 18 +++++++++++--- 6 files changed, 104 insertions(+), 27 deletions(-) diff --git a/src/afs/DARWIN/osi_vnodeops.c b/src/afs/DARWIN/osi_vnodeops.c index e73c0a7..c2dd79a 100644 --- a/src/afs/DARWIN/osi_vnodeops.c +++ b/src/afs/DARWIN/osi_vnodeops.c @@ -240,9 +240,9 @@ darwin_vn_hold(struct vnode *vp) 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(); @@ -257,7 +257,15 @@ darwin_vn_hold(struct vnode *vp) 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. diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index 4a9f5a1..1b40283 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -900,9 +900,6 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) 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 diff --git a/src/afs/afs_osidnlc.c b/src/afs/afs_osidnlc.c index 5f050ec..218af5e 100644 --- a/src/afs/afs_osidnlc.c +++ b/src/afs/afs_osidnlc.c @@ -197,6 +197,9 @@ osi_dnlc_lookup(struct vcache *adp, char *aname, int locktype) char *ts = aname; struct nc *tnc, *tnc1 = 0; int safety; +#ifdef AFS_DARWIN80_ENV + vnode_t tvp; +#endif if (!afs_usednlc) return 0; @@ -249,15 +252,26 @@ osi_dnlc_lookup(struct vcache *adp, char *aname, int locktype) 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 diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 61d663f..912a3dd 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -2549,6 +2549,9 @@ DECL_PIOCTL(PFlushVolumeData) 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) @@ -2584,16 +2587,24 @@ DECL_PIOCTL(PFlushVolumeData) #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 */ diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 6b6e943..abfc3c5 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -2098,6 +2098,9 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq, #ifdef AFS_OSF_ENV int vg; #endif +#ifdef AFS_DARWIN80_ENV + vnode_t tvp; +#endif start = osi_Time(); @@ -2153,8 +2156,16 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq, 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; } @@ -2172,6 +2183,7 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq, if (tvc) { AFS_GUNLOCK(); vnode_put(AFSTOV(tvc)); + vnode_rele(AFSTOV(tvc)); AFS_GLOCK(); } #endif @@ -2194,7 +2206,7 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq, 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); @@ -2628,6 +2640,9 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag) #if defined( AFS_OSF_ENV) int vg; #endif +#ifdef AFS_DARWIN80_ENV + vnode_t tvp; +#endif AFS_STATCNT(afs_FindVCache); @@ -2652,8 +2667,16 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag) 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; } @@ -2663,7 +2686,7 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag) 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; @@ -2757,6 +2780,9 @@ afs_NFSFindVCache(struct vcache **avcp, struct VenusFid *afid) #ifdef AFS_OSF_ENV int vg; #endif +#ifdef AFS_DARWIN80_ENV + vnode_t tvp; +#endif AFS_STATCNT(afs_FindVCache); @@ -2792,10 +2818,19 @@ afs_NFSFindVCache(struct vcache **avcp, struct VenusFid *afid) 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) { diff --git a/src/afs/afs_volume.c b/src/afs/afs_volume.c index 023bab8..98a1813 100644 --- a/src/afs/afs_volume.c +++ b/src/afs/afs_volume.c @@ -238,6 +238,9 @@ afs_CheckVolumeNames(int flags) 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; @@ -318,10 +321,19 @@ loop: 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); -- 1.9.4