afs: Refactor osi_vnhold/AFS_FAST_HOLD 71/13971/6
authorAndrew Deason <adeason@dson.org>
Tue, 19 Nov 2019 05:17:12 +0000 (23:17 -0600)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 22 May 2020 20:27:18 +0000 (16:27 -0400)
Make a few changes to osi_vnhold and AFS_FAST_HOLD:

- Currently, the second argument of osi_vnhold ("retry") is never used
  by any implementation. Get rid of it.

- AFS_FAST_HOLD() is the same as osi_vnhold(). Get rid of
  AFS_FAST_HOLD, and just have all callers use osi_vnhold instead.

- Allow osi_vnhold to return an error, and adjust callers to handle
  it.

- Change osi_vnhold to be a real function, instead of a macro, to make
  nontrivial implementations less cumbersome.

Most platforms never return an error from osi_vnhold(), so the added
code paths to check the return value of osi_vnhold() will not trigger.
However, this lets us add future commits that do make osi_vnhold()
return an error.

Change-Id: Id2f3717be6c305d06305685247ac789815e1ebf7
Reviewed-on: https://gerrit.openafs.org/13971
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

34 files changed:
src/afs/AIX/osi_machdep.h
src/afs/AIX/osi_vcache.c
src/afs/DARWIN/osi_machdep.h
src/afs/DARWIN/osi_vcache.c
src/afs/DARWIN/osi_vfsops.c
src/afs/DARWIN/osi_vm.c
src/afs/FBSD/osi_machdep.h
src/afs/FBSD/osi_vcache.c
src/afs/HPUX/osi_machdep.h
src/afs/HPUX/osi_vcache.c
src/afs/IRIX/osi_machdep.h
src/afs/IRIX/osi_vcache.c
src/afs/LINUX/osi_machdep.h
src/afs/LINUX/osi_vcache.c
src/afs/NBSD/osi_machdep.h
src/afs/NBSD/osi_vcache.c
src/afs/OBSD/osi_machdep.h
src/afs/OBSD/osi_vcache.c
src/afs/SOLARIS/osi_machdep.h
src/afs/SOLARIS/osi_vcache.c
src/afs/SOLARIS/osi_vfsops.c
src/afs/UKERNEL/osi_machdep.h
src/afs/UKERNEL/osi_vcache.c
src/afs/VNOPS/afs_vnop_fid.c
src/afs/VNOPS/afs_vnop_lookup.c
src/afs/VNOPS/afs_vnop_remove.c
src/afs/afs.h
src/afs/afs_callback.c
src/afs/afs_daemons.c
src/afs/afs_osi.h
src/afs/afs_osidnlc.c
src/afs/afs_pioctl.c
src/afs/afs_vcache.c
src/afs/afs_volume.c

index 1cc3a2b..1c285b8 100644 (file)
@@ -31,8 +31,6 @@ typedef struct proc afs_proc_t;
 
 #define afs_bufferpages v.v_bufhw
 
-#define osi_vnhold(avc, r) do { VN_HOLD(AFSTOV(avc)); } while (0)
-
 #undef gop_lookupname
 #define        gop_lookupname(fnamep,segflg,followlink,compvpp) \
        lookupvp((fnamep), (followlink), (compvpp), &afs_osi_cred)
index 5dea565..eec57c9 100644 (file)
@@ -81,3 +81,9 @@ osi_PostPopulateVCache(struct vcache *avc)
     avc->v.v_gnode->gn_vnode = &avc->v;
 }
 
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 49fe159..f7c53f2 100644 (file)
@@ -136,7 +136,6 @@ extern int hz;
 typedef struct ucred afs_ucred_t;
 typedef struct proc afs_proc_t;
 
-#define osi_vnhold(avc,r)       VN_HOLD(AFSTOV(avc))
 #define VN_HOLD(vp) darwin_vn_hold(vp)
 #define VN_RELE(vp) vrele(vp)
 
index fd47d55..1d79224 100644 (file)
@@ -116,3 +116,10 @@ osi_PostPopulateVCache(struct vcache *avc)
    vSetType(avc, VNON);
 #endif
 }
+
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 3893f97..60b3a18 100644 (file)
@@ -286,7 +286,7 @@ again:
     }
     if (tvp) {
 #ifndef AFS_DARWIN80_ENV /* KPI callers don't need a usecount reference */
-       osi_vnhold(tvp, 0);
+       osi_Assert(osi_vnhold(tvp) == 0);
        AFS_GUNLOCK();
        vn_lock(AFSTOV(tvp), LK_EXCLUSIVE | LK_RETRY, p);
        AFS_GLOCK();
index c2fdb9c..7d7b0b0 100644 (file)
@@ -166,7 +166,7 @@ osi_VM_Setup(struct vcache *avc, int force)
 #ifndef AFS_DARWIN80_ENV
     if (UBCISVALID(vp) && ((avc->f.states & CStatd) || force)) {
        if (!UBCINFOEXISTS(vp)) {
-           osi_vnhold(avc, 0);
+           osi_Assert(osi_vnhold(avc) == 0);
            avc->f.states |= CUBCinit;
            AFS_GUNLOCK();
            if ((error = ubc_info_init(vp))) {
index 406712a..67544e1 100644 (file)
@@ -42,8 +42,6 @@ typedef struct proc afs_proc_t;
 #define VSUID           S_ISUID
 #define VSGID           S_ISGID
 
-#define osi_vnhold(avc,r)      vref(AFSTOV(avc))
-
 #define vType(vc)               AFSTOV(vc)->v_type
 #define vSetVfsp(vc, vfsp)     AFSTOV(vc)->v_mount = (vfsp)
 #define vSetType(vc, type)      AFSTOV(vc)->v_type = (type)
index f6a2c6d..707bcd3 100644 (file)
@@ -112,3 +112,9 @@ osi_PostPopulateVCache(struct vcache *avc)
     vSetType(avc, VREG);
 }
 
+int
+osi_vnhold(struct vcache *avc)
+{
+    vref(AFSTOV(avc));
+    return 0;
+}
index d8f16c6..bc90b81 100644 (file)
@@ -29,7 +29,6 @@ extern struct timeval time;
 typedef struct ucred afs_ucred_t;
 typedef proc_t afs_proc_t;
 
-#define osi_vnhold(avc, r)  do { VN_HOLD(AFSTOV(avc)); } while(0)
 #define gop_rdwr(rw,gp,base,len,offset,segflg,unit,aresid) \
   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(aresid),0)
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) \
index 5a1df46..80c7db6 100644 (file)
@@ -54,3 +54,10 @@ osi_PostPopulateVCache(struct vcache *avc)
     avc->v.v_vfsp = afs_globalVFS;
     vSetType(avc, VREG);
 }
+
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 0ee2937..3c0f78d 100644 (file)
@@ -36,8 +36,6 @@ typedef struct proc afs_proc_t;
 #undef gop_lookupname_user
 #define gop_lookupname_user(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),NULL,(compvpp), NULL)
 
-#define osi_vnhold(avc, r)  do { VN_HOLD(AFSTOV(avc)); } while(0)
-
 #ifdef AFS_SGI64_ENV
 #include <sys/flock.h>
 extern flid_t osi_flid;
index 93d6c03..522e8b5 100644 (file)
@@ -120,3 +120,9 @@ osi_PostPopulateVCache(struct vcache *avc)
     avc->lastr = 0;
 }
 
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 1864cec..ae72ae4 100644 (file)
@@ -122,7 +122,6 @@ static inline time_t osi_Time(void) {
 #undef gop_lookupname_user
 #define gop_lookupname_user osi_lookupname
 
-#define osi_vnhold(V, N) do { VN_HOLD(AFSTOV(V)); } while (0)
 #define VN_HOLD(V) osi_Assert(igrab((V)) == (V))
 #define VN_RELE(V) iput((V))
 
index d3e7ac5..e3be81a 100644 (file)
@@ -103,8 +103,11 @@ osi_TryEvictVCache(struct vcache *avc, int *slept, int defersleep)
        && avc->opens == 0) {
        struct inode *ip = AFSTOV(avc);
 
+       if (osi_vnhold(avc) != 0) {
+           /* Can't grab a ref on avc; bail out. */
+           return 0;
+       }
        *slept = 1;
-       AFS_FAST_HOLD(avc);
        ReleaseWriteLock(&afs_xvcache);
        AFS_GUNLOCK();
 
@@ -236,3 +239,10 @@ osi_ResetRootVCache(afs_uint32 volid)
     crfree(credp);
     afs_DestroyReq(treq);
 }
+
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 4a2803b..2ded63d 100644 (file)
@@ -50,7 +50,6 @@ typedef char * caddr_t;
 /* vnode */
 #define VN_HOLD(vp)    (vget(vp, 0))
 #define VN_RELE(vp)    (vrele(vp))
-#define osi_vnhold(avc, r) (VN_HOLD(AFSTOV(avc)))
 
 #define va_nodeid      va_fileid
 
index faf0657..2f99075 100644 (file)
@@ -73,3 +73,10 @@ osi_PostPopulateVCache(struct vcache *avc)
     AFSTOV(avc)->v_mount = afs_globalVFS;
     vSetType(avc, VREG);
 }
+
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index 0b1e901..aec0f69 100644 (file)
@@ -45,7 +45,6 @@
 /* vnode */
 #define VN_HOLD(vp)    afs_vget((vp), 0)
 #define VN_RELE(vp)    vrele(vp)
-#define osi_vnhold(avc, r) afs_vget(AFSTOV(avc), 0)
 #define va_nodeid      va_fileid
 #define vnode_t                struct vnode
 
index c7899f9..2798a5f 100644 (file)
@@ -69,3 +69,8 @@ osi_PostPopulateVCache(struct vcache *avc)
     vSetType(avc, VREG);
 }
 
+int
+osi_vnhold(struct vcache *avc)
+{
+    return afs_vget(AFSTOV(avc), 0);
+}
index 3f13bde..c34ffb5 100644 (file)
@@ -54,19 +54,6 @@ local_osi_Time()
 #define osi_Time() (hrestime.tv_sec)
 #endif
 
-#define osi_vnhold(avc, r)  do {    \
-    struct vnode *vp = AFSTOV(avc); \
-    uint_t prevcount;               \
-                                    \
-    mutex_enter(&vp->v_lock);       \
-    prevcount = vp->v_count++;      \
-    mutex_exit(&vp->v_lock);        \
-                                    \
-    if (prevcount == 0) {           \
-       VFS_HOLD(afs_globalVFS);    \
-    }                               \
-} while(0)
-
 #define gop_rdwr(rw,gp,base,len,offset,segflg,ioflag,ulimit,cr,aresid) \
   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(ioflag),(ulimit),(cr),(aresid))
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) \
index 27525f7..7f0b9f6 100644 (file)
@@ -92,3 +92,19 @@ osi_PostPopulateVCache(struct vcache *avc)
      * 1 directly. So, we must explicitly VFS_HOLD here. */
     VFS_HOLD(afs_globalVFS);
 }
+
+int
+osi_vnhold(struct vcache *avc)
+{
+    struct vnode *vp = AFSTOV(avc);
+    uint_t prevcount;
+
+    mutex_enter(&vp->v_lock);
+    prevcount = vp->v_count++;
+    mutex_exit(&vp->v_lock);
+
+    if (prevcount == 0) {
+       VFS_HOLD(afs_globalVFS);
+    }
+    return 0;
+}
index 26c49d7..71002ec 100644 (file)
@@ -193,7 +193,7 @@ again:
        }
     }
     if (tvp) {
-       AFS_FAST_HOLD(tvp);
+       osi_Assert(osi_vnhold(tvp) == 0);
        mutex_enter(&AFSTOV(tvp)->v_lock);
        AFSTOV(tvp)->v_flag |= VROOT;
        mutex_exit(&AFSTOV(tvp)->v_lock);
index 97fa93f..96e8cb5 100644 (file)
@@ -49,8 +49,6 @@
 #undef gop_lookupname_user
 #define gop_lookupname_user(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),(compvpp))
 
-#define osi_vnhold(avc, r)  do { VN_HOLD(AFSTOV(avc)); } while(0)
-
 /*
  * Global lock support.
  */
index 0a2b9e3..b6846a6 100644 (file)
@@ -53,3 +53,9 @@ osi_PostPopulateVCache(struct vcache *avc)
     vSetType(avc, VREG);
 }
 
+int
+osi_vnhold(struct vcache *avc)
+{
+    VN_HOLD(AFSTOV(avc));
+    return 0;
+}
index d10bcac..3fa2edb 100644 (file)
@@ -113,7 +113,7 @@ afs_fid(OSI_VC_DECL(avc), struct fid **fidpp)
        addr[0] = (long)avc;
 #ifndef AFS_AIX41_ENV
        /* No post processing, so don't hold ref count. */
-       AFS_FAST_HOLD(avc);
+       osi_Assert(osi_vnhold(avc) == 0);
 #endif
     }
 #if    defined(AFS_AIX_ENV) || defined(AFS_SUN5_ENV)
index c53360a..a0da07d 100644 (file)
@@ -1094,7 +1094,9 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
        retry = 1;
     }
 #else
-    osi_vnhold(lruvcp, &retry);
+    if (osi_vnhold(lruvcp) != 0) {
+       retry = 1;
+    }
 #endif
     ReleaseReadLock(&afs_xvcache);     /* could be read lock */
     if (retry)
@@ -1473,7 +1475,11 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, afs_ucred_t *acr
      */
     if (osi_lookup_isdot(aname)) {     /* special case */
        ObtainReadLock(&afs_xvcache);
-       osi_vnhold(adp, 0);
+       if (osi_vnhold(adp) != 0) {
+           ReleaseReadLock(&afs_xvcache);
+           code = EIO;
+           goto done;
+       }
        ReleaseReadLock(&afs_xvcache);
 #ifdef AFS_DARWIN80_ENV
         vnode_get(AFSTOV(adp));
@@ -1495,7 +1501,11 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, afs_ucred_t *acr
        aname[0] == '.' && aname[1] == '.' && !aname[2]) {
 
        ObtainReadLock(&afs_xvcache);
-       osi_vnhold(afs_globalVp, 0);
+       if (osi_vnhold(afs_globalVp) != 0) {
+           ReleaseReadLock(&afs_xvcache);
+           code = EIO;
+           goto done;
+       }
        ReleaseReadLock(&afs_xvcache);
 #ifdef AFS_DARWIN80_ENV
         vnode_get(AFSTOV(afs_globalVp));
index 015ea3a..4ab3eb6 100644 (file)
@@ -421,7 +421,7 @@ afs_remunlink(struct vcache *avc, int doit)
 #if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN80_ENV)
            VREF(AFSTOV(avc));
 #else
-           AFS_FAST_HOLD(avc);
+           osi_Assert(osi_vnhold(avc) == 0);
 #endif
 
            /* We'll only try this once. If it fails, just release the vnode.
index c262165..e205adb 100644 (file)
@@ -1330,7 +1330,7 @@ struct afs_FetchOutput {
        avc->f.states |= CCore; /* causes close to be called later */ \
                                                                       \
        /* The cred and vnode holds will be released in afs_FlushActiveVcaches */  \
-       AFS_FAST_HOLD(avc);     /* So it won't disappear */           \
+       osi_Assert(osi_vnhold(avc) == 0);       /* So it won't disappear */        \
        CRKEEP(avc, acred); /* Should use a better place for the creds */ \
     }                                                                         \
     else {                                                                    \
index b90dd70..c186347 100644 (file)
@@ -447,9 +447,6 @@ loop1:
                            afs_osi_Sleep(&tvc->f.states);
                            goto loop1;
                        }
-#if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
-                       AFS_FAST_HOLD(tvc);
-#else
 #ifdef AFS_DARWIN80_ENV
                        if (tvc->f.states & CDeadVnode) {
                            ReleaseReadLock(&afs_xvcache);
@@ -466,8 +463,9 @@ loop1:
                            continue;
                        }
 #else
-                       AFS_FAST_HOLD(tvc);
-#endif
+                       if (osi_vnhold(tvc) != 0) {
+                           continue;
+                       }
 #endif
                        ReleaseReadLock(&afs_xvcache);
                        afs_StaleVCacheFlags(tvc, 0, CUnique | CBulkFetching);
@@ -530,9 +528,6 @@ loop2:
                        afs_osi_Sleep(&tvc->f.states);
                        goto loop2;
                    }
-#if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
-                   AFS_FAST_HOLD(tvc);
-#else
 #ifdef AFS_DARWIN80_ENV
                    if (tvc->f.states & CDeadVnode) {
                        ReleaseReadLock(&afs_xvcache);
@@ -549,8 +544,9 @@ loop2:
                        continue;
                    }
 #else
-                   AFS_FAST_HOLD(tvc);
-#endif
+                   if (osi_vnhold(tvc) != 0) {
+                       continue;
+                   }
 #endif
                    ReleaseReadLock(&afs_xvcache);
                    afs_StaleVCacheFlags(tvc, 0, CUnique | CBulkFetching);
index b787e30..07139c4 100644 (file)
@@ -666,7 +666,7 @@ afs_BQueue(short aopcode, struct vcache *avc,
                crhold(tb->cred);
            }
            if (avc) {
-               AFS_FAST_HOLD(avc);
+               osi_Assert(osi_vnhold(avc) == 0);
            }
            tb->refCount = ause + 1;
            tb->size_parm[0] = asparm0;
index 9a5d398..0571bda 100644 (file)
@@ -149,6 +149,15 @@ extern void osi_PrePopulateVCache(struct vcache *);
 extern void osi_PostPopulateVCache(struct vcache *);
 extern void osi_AttachVnode(struct vcache *, int seq);
 
+/**
+ * Increment the refcount on the given vcache.
+ *
+ * @retval 0 Success
+ * @retval nonzero Error obtaining reference; the vcache is no longer valid and
+ *                the caller should act as if it doesn't exist.
+ */
+extern int osi_vnhold(struct vcache *);
+
 /*
  * In IRIX 6.5 and NetBSD we cannot have DEBUG turned on since certain
  * system-defined structures are a different size with DEBUG on, the
@@ -266,9 +275,6 @@ typedef struct timeval osi_timeval32_t;
  * (Also, of course, the vnode is assumed to be one of ours.  Can't use this
  * macro for V-file vnodes.)
  */
-/* osi_vnhold is defined in PLATFORM/osi_machdep.h */
-#define AFS_FAST_HOLD(vp) osi_vnhold((vp), 0)
-
 #ifdef AFS_AIX_ENV
 #define AFS_FAST_RELE(vp) VREFCOUNT_DEC(vp)
 #else
index ab451dd..7c6a65c 100644 (file)
@@ -275,7 +275,11 @@ osi_dnlc_lookup(struct vcache *adp, char *aname, int locktype)
            return 0;
        }
 #else
-       osi_vnhold(tvc, 0);
+       if (osi_vnhold(tvc) != 0) {
+           dnlcstats.misses++;
+           osi_dnlc_remove(adp, aname, tvc);
+           tvc = NULL;
+       }
 #endif
        ReleaseReadLock(&afs_xvcache);
 
index e2ece01..2634879 100644 (file)
@@ -3521,7 +3521,9 @@ FlushVolumeData(struct VenusFid *afid, afs_ucred_t * acred)
                    continue;
                }
 #else
-               AFS_FAST_HOLD(tvc);
+               if (osi_vnhold(tvc) != 0) {
+                   continue;
+               }
 #endif
                ReleaseReadLock(&afs_xvcache);
                ObtainWriteLock(&tvc->lock, 232);
index 23600c9..7ae4723 100644 (file)
@@ -1013,7 +1013,7 @@ afs_NewVCache_int(struct VenusFid *afid, struct server *serverp, int seq)
 
 #if defined(AFS_LINUX22_ENV)
     /* Hold it for the LRU (should make count 2) */
-    AFS_FAST_HOLD(tvc);
+    osi_Assert(osi_vnhold(tvc) == 0);
 #elif !(defined (AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV))
     VREFCOUNT_SET(tvc, 1);     /* us */
 #endif
@@ -1077,8 +1077,10 @@ afs_FlushActiveVcaches(afs_int32 doflocks)
 #endif
            if (doflocks && tvc->flockCount != 0) {
                struct rx_connection *rxconn;
+               if (osi_vnhold(tvc) != 0) {
+                   continue;
+               }
                /* if this entry has an flock, send a keep-alive call out */
-               osi_vnhold(tvc, 0);
                ReleaseReadLock(&afs_xvcache);
                ObtainWriteLock(&tvc->lock, 51);
                do {
@@ -1121,7 +1123,9 @@ afs_FlushActiveVcaches(afs_int32 doflocks)
                 * this code.  Also, drop the afs_xvcache lock while
                 * getting vcache locks.
                 */
-               osi_vnhold(tvc, 0);
+               if (osi_vnhold(tvc) != 0) {
+                   continue;
+               }
                ReleaseReadLock(&afs_xvcache);
 #if defined(AFS_SGI_ENV)
                /*
@@ -2094,6 +2098,10 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq,
                AFS_GLOCK();
                continue;
            }
+#else
+           if (osi_vnhold(tvc) != 0) {
+               continue;
+           }
 #endif
            break;
        }
@@ -2102,14 +2110,19 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq,
     if (!haveStatus && (!tvc || !(tvc->f.states & CStatd))) {
        /* Mount point no longer stat'd or unknown. FID may have changed. */
        getNewFid = 1;
-       ReleaseSharedLock(&afs_xvcache);
 #ifdef AFS_DARWIN80_ENV
+       ReleaseSharedLock(&afs_xvcache);
         if (tvc) {
             AFS_GUNLOCK();
             vnode_put(AFSTOV(tvc));
             vnode_rele(AFSTOV(tvc));
             AFS_GLOCK();
         }
+#else
+       if (tvc) {
+           AFS_FAST_RELE(tvc);
+       }
+       ReleaseSharedLock(&afs_xvcache);
 #endif
         tvc = NULL;
        goto newmtpt;
@@ -2128,11 +2141,6 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq,
        afs_stats_cmperf.vcacheMisses++;
     } else {
        afs_stats_cmperf.vcacheHits++;
-#if    defined(AFS_DARWIN80_ENV)
-       /* we already bumped the ref count in the for loop above */
-#else /* AFS_DARWIN80_ENV */
-       osi_vnhold(tvc, 0);
-#endif
        UpgradeSToWLock(&afs_xvcache, 24);
        if ((VLRU.next->prev != &VLRU) || (VLRU.prev->next != &VLRU)) {
            refpanic("GRVC VLRU inconsistent0");
@@ -2518,7 +2526,9 @@ afs_RefVCache(struct vcache *tvc)
        return -1;
     }
 #else
-       osi_vnhold(tvc, 0);
+    if (osi_vnhold(tvc) != 0) {
+       return -1;
+    }
 #endif
     return 0;
 }                              /*afs_RefVCache */
@@ -2570,8 +2580,6 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag)
 
     /* should I have a read lock on the vnode here? */
     if (tvc) {
-       if (retry)
-           *retry = 0;
 #if defined(AFS_DARWIN80_ENV)
        tvp = AFSTOV(tvc);
        if (vnode_get(tvp))
@@ -2597,10 +2605,12 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag)
        AFS_GLOCK();
        tvc->f.states &= ~CUBCinit;
 #else
-       osi_vnhold(tvc, retry); /* already held, above */
-       if (retry && *retry)
-           return 0;
+       if (osi_vnhold(tvc) != 0) {
+           tvc = NULL;
+       }
 #endif
+    }
+    if (tvc) {
        /*
         * only move to front of vlru if we have proper vcache locking)
         */
@@ -2712,11 +2722,19 @@ afs_NFSFindVCache(struct vcache **avcp, struct VenusFid *afid)
                AFS_GLOCK();
                continue;
            }
+#else
+           if (osi_vnhold(tvc) != 0) {
+               continue;
+           }
 #endif /* AFS_DARWIN80_ENV */
            count++;
            if (found_tvc) {
                /* Duplicates */
                afs_duplicate_nfs_fids++;
+#ifndef AFS_DARWIN80_ENV
+               AFS_FAST_RELE(tvc);
+               AFS_FAST_RELE(found_tvc);
+#endif
                ReleaseSharedLock(&afs_xvcache);
 #ifdef AFS_DARWIN80_ENV
                 /* Drop our reference counts. */
@@ -2732,21 +2750,6 @@ afs_NFSFindVCache(struct vcache **avcp, struct VenusFid *afid)
     tvc = found_tvc;
     /* should I have a read lock on the vnode here? */
     if (tvc) {
-#ifndef AFS_DARWIN80_ENV
-# if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV)
-       afs_int32 retry = 0;
-       osi_vnhold(tvc, &retry);
-       if (retry) {
-           count = 0;
-           found_tvc = (struct vcache *)0;
-           ReleaseSharedLock(&afs_xvcache);
-           spunlock_psema(tvc->v.v_lock, retry, &tvc->v.v_sync, PINOD);
-           goto loop;
-       }
-# else
-       osi_vnhold(tvc, (int *)0);      /* already held, above */
-# endif
-#endif
        /*
         * We obtained the xvcache lock above.
         */
index a83b954..28179db 100644 (file)
@@ -548,7 +548,9 @@ loop:
                        continue;
                    }
 #else
-                   AFS_FAST_HOLD(tvc);
+                   if (osi_vnhold(tvc) != 0) {
+                       continue;
+                   }
 #endif
                    ReleaseReadLock(&afs_xvcache);