vnode-ref-verification-20060217
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Sat, 18 Feb 2006 04:53:34 +0000 (04:53 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 18 Feb 2006 04:53:34 +0000 (04:53 +0000)
verify we got a ref when we call vnode_ref

src/afs/DARWIN/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_lookup.c
src/afs/afs_osidnlc.c
src/afs/afs_pioctl.c
src/afs/afs_vcache.c
src/afs/afs_volume.c

index e73c0a7..c2dd79a 100644 (file)
@@ -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.
index 4a9f5a1..1b40283 100644 (file)
@@ -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
index 5f050ec..218af5e 100644 (file)
@@ -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
index 61d663f..912a3dd 100644 (file)
@@ -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 */
index 6b6e943..abfc3c5 100644 (file)
@@ -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) {
index 023bab8..98a1813 100644 (file)
@@ -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);