libafs: consistently hold vnode refs
authorAndrew Deason <adeason@sinenomine.net>
Tue, 18 May 2010 16:39:21 +0000 (11:39 -0500)
committerDerrick Brashear <shadow@dementia.org>
Mon, 7 Jun 2010 18:55:56 +0000 (11:55 -0700)
Make all common libafs code call AFS_FAST_HOLD to hold an afs vnode
reference, instead of sometimes calling VN_HOLD(AFSTOV(tvc)) directly.
Make AFS_FAST_HOLD always call osi_vnhold, and have each platform
define osi_vnhold for their platform-specific quirks (as it was doing
before).

This way, if a platform has an osi_vnhold that is special somehow (on
solaris, we bump a VFS refcount if the vnode refcount goes from 0->1),
it will always be called on vnode references.

Change-Id: I7bb2b5ac116c8e86f6c6c0d40f414523870275a3
Reviewed-on: http://gerrit.openafs.org/1987
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/AIX/osi_machdep.h
src/afs/SOLARIS/osi_vfsops.c
src/afs/VNOPS/afs_vnop_fid.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_pioctl.c
src/afs/afs_vcache.c

index f35e979..b91fc30 100644 (file)
@@ -31,7 +31,7 @@ typedef struct proc afs_proc_t;
 
 #define afs_bufferpages v.v_bufhw
 
-#define osi_vnhold(avc, r) do { (avc)->vrefCount++; } while (0)
+#define osi_vnhold(avc, r) do { VN_HOLD(AFSTOV(avc)); } while (0)
 
 #undef gop_lookupname
 #define        gop_lookupname(fnamep,segflg,followlink,compvpp) \
index d090111..b17d495 100644 (file)
@@ -200,7 +200,7 @@ again:
        }
     }
     if (tvp) {
-       VN_HOLD(AFSTOV(tvp));
+       AFS_FAST_HOLD(tvp);
        mutex_enter(&AFSTOV(tvp)->v_lock);
        AFSTOV(tvp)->v_flag |= VROOT;
        mutex_exit(&AFSTOV(tvp)->v_lock);
index 9f52a37..cbf96be 100644 (file)
@@ -114,7 +114,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. */
-       VN_HOLD(AFSTOV(avc));
+       AFS_FAST_HOLD(avc);
 #endif
     }
 #if    defined(AFS_AIX_ENV) || defined(AFS_SUN54_ENV)
index 4633f5a..0a45f10 100644 (file)
@@ -433,7 +433,7 @@ afs_remunlink(register struct vcache *avc, register int doit)
 #if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN80_ENV)
            VREF(AFSTOV(avc));
 #else
-           VN_HOLD(AFSTOV(avc));
+           AFS_FAST_HOLD(avc);
 #endif
 
            /* We'll only try this once. If it fails, just release the vnode.
index de8e774..ae410b9 100644 (file)
@@ -1210,7 +1210,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 */  \
-       VN_HOLD(AFSTOV(avc));   /* So it won't disappear */           \
+       AFS_FAST_HOLD(avc);     /* So it won't disappear */           \
        CRKEEP(avc, acred); /* Should use a better place for the creds */ \
     }                                                                         \
     else {                                                                    \
index 674bb86..0cdbc28 100644 (file)
@@ -456,7 +456,7 @@ loop1:
                            goto loop1;
                        }
 #if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
-                       VN_HOLD(AFSTOV(tvc));
+                       AFS_FAST_HOLD(tvc);
 #else
 #ifdef AFS_DARWIN80_ENV
                        if (tvc->f.states & CDeadVnode) {
@@ -551,7 +551,7 @@ loop2:
                        goto loop2;
                    }
 #if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
-                   VN_HOLD(AFSTOV(tvc));
+                   AFS_FAST_HOLD(tvc);
 #else
 #ifdef AFS_DARWIN80_ENV
                    if (tvc->f.states & CDeadVnode) {
index 412a128..959f4e3 100644 (file)
@@ -655,7 +655,7 @@ afs_BQueue(register short aopcode, register struct vcache *avc,
            tb->cred = acred;
            crhold(tb->cred);
            if (avc) {
-               VN_HOLD(AFSTOV(avc));
+               AFS_FAST_HOLD(avc);
            }
            tb->refCount = ause + 1;
            tb->size_parm[0] = asparm0;
index 916a656..784fefe 100644 (file)
@@ -258,15 +258,9 @@ typedef struct timeval osi_timeval_t;
  * (Also, of course, the vnode is assumed to be one of ours.  Can't use this
  * macro for V-file vnodes.)
  */
-#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-/* Bare refcount manipulation would probably work on this platform, but just
-   calling VREF does not */
-#define AFS_FAST_HOLD(vp) osi_vnhold((vp),0)
-#elif defined(AFS_AIX_ENV)
-#define AFS_FAST_HOLD(vp) VREFCOUNT_INC(vp)
-#else
-#define AFS_FAST_HOLD(vp) VN_HOLD(AFSTOV(vp))
-#endif
+/* 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 df338d0..76aaaf6 100644 (file)
@@ -3437,7 +3437,7 @@ DECL_PIOCTL(PFlushVolumeData)
            }
 #endif
 #if    defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
-               VN_HOLD(AFSTOV(tvc));
+               AFS_FAST_HOLD(tvc);
 #elif defined(AFS_DARWIN80_ENV)
                vp = AFSTOV(tvc);
                if (vnode_get(vp))
index f564d19..ef41442 100644 (file)
@@ -860,7 +860,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) */
-    VN_HOLD(AFSTOV(tvc));
+    AFS_FAST_HOLD(tvc);
 #elif !(defined (AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV))
     VREFCOUNT_SET(tvc, 1);     /* us */
 #endif