]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
memcache-alloc-failures-20070623
authorChas Williams <chas@cmf.nrl.navy.mil>
Sat, 23 Jun 2007 16:28:11 +0000 (16:28 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 23 Jun 2007 16:28:11 +0000 (16:28 +0000)
FIXES 55339

deal with alloc failures in memcache

src/afs/afs_memcache.c

index d20d3cab863c40bcfd048c789a0f489395a6c825..d1fa23b5e8e604070a9817d818b5cc7b0f105070 100644 (file)
@@ -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)