} 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) {
* 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 */
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;
}
}
}
newvcache = 1;
ConvertWToSLock(&afs_xvcache);
+ if (!tvc)
+ {
+ ReleaseSharedLock(&afs_xvcache);
+ return NULL;
+ }
+
afs_stats_cmperf.vcacheMisses++;
}
tvc = afs_NewVCache(&nfid, serverp);
newvcache = 1;
ConvertWToSLock(&afs_xvcache);
+ if (!tvc)
+ {
+ ReleaseSharedLock(&afs_xvcache);
+ return NULL;
+ }
}
ReleaseSharedLock(&afs_xvcache);
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 {
tvc = afs_NewVCache(afid, NULL);
newvcache = 1;
ConvertWToSLock(&afs_xvcache);
+ if (!tvc)
+ {
+ ReleaseSharedLock(&afs_xvcache);
+ return NULL;
+ }
}
ReleaseSharedLock(&afs_xvcache);