From 99a61e9762373f0b2b6352fe108bb42cf59f6340 Mon Sep 17 00:00:00 2001 From: Chas Williams Date: Sat, 23 Jun 2007 16:28:11 +0000 Subject: [PATCH] memcache-alloc-failures-20070623 FIXES 55339 deal with alloc failures in memcache --- src/afs/afs_memcache.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/afs/afs_memcache.c b/src/afs/afs_memcache.c index d20d3cab8..d1fa23b5e 100644 --- a/src/afs/afs_memcache.c +++ b/src/afs/afs_memcache.c @@ -247,6 +247,13 @@ afs_MemWritevBlk(register struct memCacheEntry *mceP, int offset, char *oldData = mceP->data; mceP->data = afs_osi_Alloc(size + offset); + if (mceP->data == NULL) { /* no available memory */ + mceP->data = oldData; /* revert back change that was made */ + MReleaseWriteLock(&mceP->afs_memLock); + afs_warn("afs: afs_MemWriteBlk mem alloc failure (%d bytes)\n", + size + offset); + return -ENOMEM; + } /* may overlap, but this is OK */ AFS_GUNLOCK(); @@ -285,6 +292,13 @@ afs_MemWriteUIO(ino_t blkno, struct uio *uioP) char *oldData = mceP->data; mceP->data = afs_osi_Alloc(AFS_UIO_RESID(uioP) + AFS_UIO_OFFSET(uioP)); + if (mceP->data == NULL) { /* no available memory */ + mceP->data = oldData; /* revert back change that was made */ + MReleaseWriteLock(&mceP->afs_memLock); + afs_warn("afs: afs_MemWriteBlk mem alloc failure (%d bytes)\n", + AFS_UIO_RESID(uioP) + AFS_UIO_OFFSET(uioP)); + return -ENOMEM; + } AFS_GUNLOCK(); memcpy(mceP->data, oldData, mceP->size); @@ -314,9 +328,17 @@ afs_MemCacheTruncate(register struct osi_file *fP, int size) MObtainWriteLock(&mceP->afs_memLock, 313); /* old directory entry; g.c. */ if (size == 0 && mceP->dataSize > memCacheBlkSize) { - afs_osi_Free(mceP->data, mceP->dataSize); + char *oldData = mceP->data; mceP->data = afs_osi_Alloc(memCacheBlkSize); - mceP->dataSize = memCacheBlkSize; + if (mceP->data == NULL) { /* no available memory */ + mceP->data = oldData; + MReleaseWriteLock(&mceP->afs_memLock); + afs_warn("afs: afs_MemWriteBlk mem alloc failure (%d bytes)\n", + memCacheBlkSize); + } else { + afs_osi_Free(oldData, mceP->dataSize); + mceP->dataSize = memCacheBlkSize; + } } if (size < mceP->size) -- 2.39.5