From b2ab9e472c56a3408f1c628ae423b85189387bad Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Sat, 19 Nov 2005 04:35:39 +0000 Subject: [PATCH] STABLE14-deadvnode-locking-update-20051118 FIXES 22870 change how we do vnode locking to avoid locking on ourselves (cherry picked from commit 73e126c4c4f44f20e67d8ced8a89558746e87a90) --- src/afs/DARWIN/osi_module.c | 2 +- src/afs/VNOPS/afs_vnop_lookup.c | 4 +-- src/afs/VNOPS/afs_vnop_readdir.c | 8 +++-- src/afs/afs.h | 2 ++ src/afs/afs_vcache.c | 52 +++++++++++++++++--------------- 5 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/afs/DARWIN/osi_module.c b/src/afs/DARWIN/osi_module.c index 5c1720a614..06a7c5a7f2 100644 --- a/src/afs/DARWIN/osi_module.c +++ b/src/afs/DARWIN/osi_module.c @@ -134,5 +134,5 @@ afs_modunload(struct kmod_info * ki, void *data) return KERN_SUCCESS; } -KMOD_EXPLICIT_DECL(org.openafs.filesystems.afs, "1.3.82", afs_modload, +KMOD_EXPLICIT_DECL(org.openafs.filesystems.afs, VERSION, afs_modload, afs_modunload) diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index df5f09e43a..1d988b0c6f 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -291,7 +291,7 @@ afs_EvalFakeStat_int(struct vcache **avcp, struct afs_fakestat_state *state, do { retry = 0; ObtainWriteLock(&afs_xvcache, 597); - root_vp = afs_FindVCache(tvc->mvid, &retry, 0); + root_vp = afs_FindVCache(tvc->mvid, &retry, IS_WLOCK); if (root_vp && retry) { ReleaseWriteLock(&afs_xvcache); afs_PutVCache(root_vp); @@ -701,7 +701,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) do { retry = 0; ObtainWriteLock(&afs_xvcache, 130); - tvcp = afs_FindVCache(&tfid, &retry, 0 /* no stats | LRU */ ); + tvcp = afs_FindVCache(&tfid, &retry, IS_WLOCK /* no stats | LRU */ ); if (tvcp && retry) { ReleaseWriteLock(&afs_xvcache); afs_PutVCache(tvcp); diff --git a/src/afs/VNOPS/afs_vnop_readdir.c b/src/afs/VNOPS/afs_vnop_readdir.c index 4a1509680a..f4f11da780 100644 --- a/src/afs/VNOPS/afs_vnop_readdir.c +++ b/src/afs/VNOPS/afs_vnop_readdir.c @@ -247,7 +247,10 @@ afs_readdir_type(avc, ade) tfid.Fid.Unique = ntohl(ade->fid.vunique); if ((avc->states & CForeign) == 0 && (ntohl(ade->fid.vnode) & 1)) { return DT_DIR; - } else if ((tvc = afs_FindVCache(&tfid, 0, 0))) { + } + ObtainReadLock(&afs_xvcache); + if ((tvc = afs_FindVCache(&tfid, 0, 0))) { + ReleaseReadLock(&afs_xvcache); if (tvc->mvstat) { afs_PutVCache(tvc); return DT_DIR; @@ -266,7 +269,8 @@ afs_readdir_type(avc, ade) /* what other types does AFS support? */ } else afs_PutVCache(tvc); - } + } else + ReleaseReadLock(&afs_xvcache); return DT_UNKNOWN; } #endif diff --git a/src/afs/afs.h b/src/afs/afs.h index f994e78f9a..f7594a0406 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -1096,6 +1096,8 @@ extern struct brequest afs_brs[NBRS]; /* request structures */ #define DO_STATS 1 /* bits used by FindVCache */ #define DO_VLRU 2 +#define IS_SLOCK 4 +#define IS_WLOCK 8 /* values for flag param of afs_CheckVolumeNames */ #define AFS_VOLCHECK_EXPIRED 0x1 /* volumes whose callbacks have expired */ diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 31cf9177ee..8e2fa8ffad 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -1671,7 +1671,7 @@ afs_GetVCache(register struct VenusFid *afid, struct vrequest *areq, ObtainSharedLock(&afs_xvcache, 5); - tvc = afs_FindVCache(afid, &retry, DO_STATS | DO_VLRU); + tvc = afs_FindVCache(afid, &retry, DO_STATS | DO_VLRU | IS_SLOCK); if (tvc && retry) { #if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV) ReleaseSharedLock(&afs_xvcache); @@ -1911,7 +1911,7 @@ afs_LookupVCache(struct VenusFid *afid, struct vrequest *areq, #endif ObtainSharedLock(&afs_xvcache, 6); - tvc = afs_FindVCache(&nfid, &retry, DO_VLRU /* no xstats now */ ); + tvc = afs_FindVCache(&nfid, &retry, DO_VLRU | IS_SLOCK/* no xstats now */ ); if (tvc && retry) { #if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV) ReleaseSharedLock(&afs_xvcache); @@ -2374,7 +2374,7 @@ afs_StuffVcache(register struct VenusFid *afid, loop: ObtainSharedLock(&afs_xvcache, 8); - tvc = afs_FindVCache(afid, &retry, DO_VLRU /* no stats */ ); + tvc = afs_FindVCache(afid, &retry, DO_VLRU| IS_SLOCK /* no stats */ ); if (tvc && retry) { #if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV) ReleaseSharedLock(&afs_xvcache); @@ -2509,6 +2509,28 @@ afs_PutVCache(register struct vcache *avc) #endif } /*afs_PutVCache */ + +static void findvc_sleep(struct vcache *avc, int flag) { + if (flag & IS_SLOCK) { + ReleaseSharedLock(&afs_xvcache); + } else { + if (flag & IS_WLOCK) { + ReleaseWriteLock(&afs_xvcache); + } else { + ReleaseReadLock(&afs_xvcache); + } + } + afs_osi_Sleep(&avc->states); + if (flag & IS_SLOCK) { + ObtainSharedLock(&afs_xvcache, 341); + } else { + if (flag & IS_WLOCK) { + ObtainWriteLock(&afs_xvcache, 343); + } else { + ObtainReadLock(&afs_xvcache); + } + } +} /* * afs_FindVCache * @@ -2542,17 +2564,7 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag) for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { if (FidMatches(afid, tvc)) { if (tvc->states & CVInit) { - int lock; - lock = CheckLock(&afs_xvcache); - if (lock > 0) - ReleaseReadLock(&afs_xvcache); - else - ReleaseSharedLock(&afs_xvcache); - afs_osi_Sleep(&tvc->states); - if (lock > 0) - ObtainReadLock(&afs_xvcache); - else - ObtainSharedLock(&afs_xvcache, 341); + findvc_sleep(tvc, flag); goto findloop; } #ifdef AFS_OSF_ENV @@ -2567,17 +2579,7 @@ afs_FindVCache(struct VenusFid *afid, afs_int32 * retry, afs_int32 flag) #ifdef AFS_DARWIN80_ENV int vg; if (tvc->states & CDeadVnode) { - int lock; - lock = CheckLock(&afs_xvcache); - if (lock > 0) - ReleaseReadLock(&afs_xvcache); - else - ReleaseSharedLock(&afs_xvcache); - afs_osi_Sleep(&tvc->states); - if (lock > 0) - ObtainReadLock(&afs_xvcache); - else - ObtainSharedLock(&afs_xvcache, 341); + findvc_sleep(tvc, flag); goto findloop; } AFS_GUNLOCK();