From: Andrew Deason Date: Tue, 18 May 2010 16:39:21 +0000 (-0500) Subject: libafs: consistently hold vnode refs X-Git-Tag: openafs-devel-1_5_75~177 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=b89a9e4fa001b453a3ef5f041ac7978ba696b8e3 libafs: consistently hold vnode refs 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 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/afs/AIX/osi_machdep.h b/src/afs/AIX/osi_machdep.h index f35e979..b91fc30 100644 --- a/src/afs/AIX/osi_machdep.h +++ b/src/afs/AIX/osi_machdep.h @@ -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) \ diff --git a/src/afs/SOLARIS/osi_vfsops.c b/src/afs/SOLARIS/osi_vfsops.c index d090111..b17d495 100644 --- a/src/afs/SOLARIS/osi_vfsops.c +++ b/src/afs/SOLARIS/osi_vfsops.c @@ -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); diff --git a/src/afs/VNOPS/afs_vnop_fid.c b/src/afs/VNOPS/afs_vnop_fid.c index 9f52a37..cbf96be 100644 --- a/src/afs/VNOPS/afs_vnop_fid.c +++ b/src/afs/VNOPS/afs_vnop_fid.c @@ -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) diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index 4633f5a..0a45f10 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -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. diff --git a/src/afs/afs.h b/src/afs/afs.h index de8e774..ae410b9 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -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 { \ diff --git a/src/afs/afs_callback.c b/src/afs/afs_callback.c index 674bb86..0cdbc28 100644 --- a/src/afs/afs_callback.c +++ b/src/afs/afs_callback.c @@ -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) { diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index 412a128..959f4e3 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -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; diff --git a/src/afs/afs_osi.h b/src/afs/afs_osi.h index 916a656..784fefe 100644 --- a/src/afs/afs_osi.h +++ b/src/afs/afs_osi.h @@ -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 diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index df338d0..76aaaf6 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -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)) diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index f564d19..ef41442 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -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