From ee1435d516a31e8ec2d07ec9021bf032ac12f9cd Mon Sep 17 00:00:00 2001 From: Peter Somogyi Date: Sat, 15 Oct 2005 03:32:06 +0000 Subject: [PATCH] newvcache-can-fail-now-20051014 FIXES 22260 allow newvcache to fail without ooping sort of nasty, if you want more vcaches, say so. --- src/afs/VNOPS/afs_vnop_lookup.c | 19 ++++++++++++++----- src/afs/VNOPS/afs_vnop_symlink.c | 6 ++++++ src/afs/afs_vcache.c | 28 ++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index 057dc4373..df5f09e43 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -709,15 +709,24 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp) } while (tvcp && retry); if (!tvcp) { /* otherwise, create manually */ tvcp = afs_NewVCache(&tfid, hostp); - ObtainWriteLock(&tvcp->lock, 505); - ReleaseWriteLock(&afs_xvcache); - afs_RemoveVCB(&tfid); - ReleaseWriteLock(&tvcp->lock); + if (tvcp) + { + ObtainWriteLock(&tvcp->lock, 505); + ReleaseWriteLock(&afs_xvcache); + afs_RemoveVCB(&tfid); + ReleaseWriteLock(&tvcp->lock); + } else { + ReleaseWriteLock(&afs_xvcache); + } } else { ReleaseWriteLock(&afs_xvcache); } if (!tvcp) - goto done; /* can't happen at present, more's the pity */ + { + ReleaseReadLock(&dcp->lock); + ReleaseReadLock(&adp->lock); + goto done; /* can happen if afs_NewVCache fails */ + } #ifdef AFS_DARWIN80_ENV if (tvcp->states & CVInit) { diff --git a/src/afs/VNOPS/afs_vnop_symlink.c b/src/afs/VNOPS/afs_vnop_symlink.c index b273a2dd6..205e40743 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -191,6 +191,12 @@ int afs_symlink * no one can get a pointer to the new cache entry until we release * the xvcache lock. */ tvc = afs_NewVCache(&newFid, hostp); + if (!tvc) + { + code = -2; + ReleaseWriteLock(&afs_xvcache); + goto done; + } ObtainWriteLock(&tvc->lock, 157); ObtainWriteLock(&afs_xcbhash, 500); tvc->states |= CStatd; /* have valid info */ diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 6c0bc8267..31cf9177e 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -695,12 +695,11 @@ restart: break; } if (anumber == VCACHE_FREE) { - printf("NewVCache: warning none freed, using %d of %d\n", + printf("afs_NewVCache: warning none freed, using %d of %d\n", afs_vcount, afs_maxvcount); if (afs_vcount >= afs_maxvcount) { - osi_Panic("NewVCache - none freed"); - /* XXX instead of panicing, should do afs_maxvcount++ - * and magic up another one */ + printf("afs_NewVCache - none freed\n"); + return NULL; } } } @@ -1697,6 +1696,12 @@ afs_GetVCache(register struct VenusFid *afid, struct vrequest *areq, newvcache = 1; ConvertWToSLock(&afs_xvcache); + if (!tvc) + { + ReleaseSharedLock(&afs_xvcache); + return NULL; + } + afs_stats_cmperf.vcacheMisses++; } @@ -1921,6 +1926,11 @@ afs_LookupVCache(struct VenusFid *afid, struct vrequest *areq, tvc = afs_NewVCache(&nfid, serverp); newvcache = 1; ConvertWToSLock(&afs_xvcache); + if (!tvc) + { + ReleaseSharedLock(&afs_xvcache); + return NULL; + } } ReleaseSharedLock(&afs_xvcache); @@ -2104,6 +2114,11 @@ afs_GetRootVCache(struct VenusFid *afid, struct vrequest *areq, UpgradeSToWLock(&afs_xvcache, 23); /* no cache entry, better grab one */ tvc = afs_NewVCache(afid, NULL); + if (!tvc) + { + ReleaseWriteLock(&afs_xvcache); + return NULL; + } newvcache = 1; afs_stats_cmperf.vcacheMisses++; } else { @@ -2374,6 +2389,11 @@ afs_StuffVcache(register struct VenusFid *afid, tvc = afs_NewVCache(afid, NULL); newvcache = 1; ConvertWToSLock(&afs_xvcache); + if (!tvc) + { + ReleaseSharedLock(&afs_xvcache); + return NULL; + } } ReleaseSharedLock(&afs_xvcache); -- 2.39.5