rewrite afs_MemWriteBlk() using afs_MemWritevBlk()
authorChas Williams <chas@cmf.nrl.navy.mil>
Tue, 5 Jan 2010 00:22:19 +0000 (00:22 +0000)
committerDerrick Brashear <shadow|account-1000005@unknown>
Thu, 14 Jan 2010 15:31:14 +0000 (07:31 -0800)
this avoids the code duplication of extending/shrinking cache entries

Change-Id: Ieeae668caa506e934f92edf193b99dabdba2eabe
Reviewed-on: http://gerrit.openafs.org/1062
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/afs_memcache.c

index 65fc2bd..90e3f8f 100644 (file)
@@ -169,42 +169,16 @@ afs_MemReadUIO(afs_dcache_id_t *ainode, struct uio *uioP)
     return code;
 }
 
-/*XXX: this extends a block arbitrarily to support big directories */
 int
 afs_MemWriteBlk(register struct osi_file *fP, int offset, void *src,
                int size)
 {
     register struct memCacheEntry *mceP = (struct memCacheEntry *)fP;
-    AFS_STATCNT(afs_MemWriteBlk);
-    ObtainWriteLock(&mceP->afs_memLock, 560);
-    if (size + offset > mceP->dataSize) {
-       char *oldData = mceP->data;
+    struct iovec tiov;
 
-       mceP->data = afs_osi_Alloc(size + offset);
-       if (mceP->data == NULL) {       /* no available memory */
-           mceP->data = oldData;       /* revert back change that was made */
-           ReleaseWriteLock(&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();
-       memcpy(mceP->data, oldData, mceP->size);
-       AFS_GLOCK();
-       afs_osi_Free(oldData, mceP->dataSize);
-       mceP->dataSize = size + offset;
-    }
-    AFS_GUNLOCK();
-    if (mceP->size < offset)
-       memset(mceP->data + mceP->size, 0, offset - mceP->size);
-    memcpy(mceP->data + offset, src, size);
-    AFS_GLOCK();
-    mceP->size = (size + offset < mceP->size) ? mceP->size : size + offset;
-
-    ReleaseWriteLock(&mceP->afs_memLock);
-    return size;
+    tiov.iov_base = src;
+    tiov.iov_len = size;
+    return afs_MemWritevBlk(mceP, offset, &tiov, 1, size);
 }
 
 /*XXX: this extends a block arbitrarily to support big directories */