libafs: Remove afs_read duplication
[openafs.git] / src / afs / afs_dcache.c
index 626afeb..4cdf962 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  *$All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -71,7 +71,7 @@ afs_int32 afs_cacheBlocks;    /*!< 1K blocks in cache */
 afs_int32 afs_cacheStats;      /*!< Stat entries in cache */
 afs_int32 afs_blocksUsed;      /*!< Number of blocks in use */
 afs_int32 afs_blocksDiscarded; /*!<Blocks freed but not truncated */
-afs_int32 afs_fsfragsize = 1023;       /*!< Underlying Filesystem minimum unit 
+afs_int32 afs_fsfragsize = AFS_MIN_FRAGSIZE;   /*!< Underlying Filesystem minimum unit
                                         *of disk allocation usually 1K
                                         *this value is (truefrag -1 ) to
                                         *save a bunch of subtracts... */
@@ -100,33 +100,55 @@ afs_int32 afs_dcentries;  /*!< In-memory dcache entries */
 int dcacheDisabled = 0;
 
 struct afs_cacheOps afs_UfsCacheOps = {
+#ifndef HAVE_STRUCT_LABEL_SUPPORT
     osi_UFSOpen,
     osi_UFSTruncate,
     afs_osi_Read,
     afs_osi_Write,
     osi_UFSClose,
-    afs_UFSRead,
+    afs_UFSReadUIO,
     afs_UFSWrite,
-    afs_UFSCacheFetchProc,
-    afs_CacheStoreProc,
     afs_UFSGetDSlot,
     afs_UFSGetVolSlot,
     afs_UFSHandleLink,
+#else
+    .open      = osi_UFSOpen,
+    .truncate  = osi_UFSTruncate,
+    .fread     = afs_osi_Read,
+    .fwrite    = afs_osi_Write,
+    .close     = osi_UFSClose,
+    .vreadUIO  = afs_UFSReadUIO,
+    .vwrite    = afs_UFSWrite,
+    .GetDSlot  = afs_UFSGetDSlot,
+    .GetVolSlot = afs_UFSGetVolSlot,
+    .HandleLink        = afs_UFSHandleLink,
+#endif
 };
 
 struct afs_cacheOps afs_MemCacheOps = {
+#ifndef HAVE_STRUCT_LABEL_SUPPORT
     afs_MemCacheOpen,
     afs_MemCacheTruncate,
     afs_MemReadBlk,
     afs_MemWriteBlk,
     afs_MemCacheClose,
-    afs_MemRead,
+    afs_MemReadUIO,
     afs_MemWrite,
-    afs_MemCacheFetchProc,
-    afs_CacheStoreProc,
     afs_MemGetDSlot,
     afs_MemGetVolSlot,
     afs_MemHandleLink,
+#else
+    .open      = afs_MemCacheOpen,
+    .truncate  = afs_MemCacheTruncate,
+    .fread     = afs_MemReadBlk,
+    .fwrite    = afs_MemWriteBlk,
+    .close     = afs_MemCacheClose,
+    .vreadUIO  = afs_MemReadUIO,
+    .vwrite    = afs_MemWrite,
+    .GetDSlot  = afs_MemGetDSlot,
+    .GetVolSlot        = afs_MemGetVolSlot,
+    .HandleLink        = afs_MemHandleLink,
+#endif
 };
 
 int cacheDiskType;             /*Type of backing disk for cache */
@@ -140,11 +162,11 @@ struct afs_cacheOps *afs_cacheType;
  *     2 : RO
  */
 static afs_int32
-afs_DCGetBucket(struct vcache *avc) 
+afs_DCGetBucket(struct vcache *avc)
 {
-    if (!splitdcache) 
+    if (!splitdcache)
        return 1;
-    
+
     /* This should be replaced with some sort of user configurable function */
     if (avc->f.states & CRO) {
        return 2;
@@ -165,15 +187,15 @@ afs_DCGetBucket(struct vcache *avc)
  * \param newSize The new size to be adjusted to.
  *
  */
-static void 
+static void
 afs_DCAdjustSize(struct dcache *adc, afs_int32 oldSize, afs_int32 newSize)
 {
     afs_int32 adjustSize = newSize - oldSize;
 
-    if (!splitdcache) 
+    if (!splitdcache)
        return;
 
-    switch (adc->bucket) 
+    switch (adc->bucket)
     {
     case 0:
        afs_blocksUsed_0 += adjustSize;
@@ -194,20 +216,20 @@ afs_DCAdjustSize(struct dcache *adc, afs_int32 oldSize, afs_int32 newSize)
 
 /*!
  * Move a dcache from one bucket to another.
- * 
+ *
  * \param adc Operate on this dcache.
  * \param size Size in bucket (?).
  * \param newBucket Destination bucket.
  *
  */
-static void 
+static void
 afs_DCMoveBucket(struct dcache *adc, afs_int32 size, afs_int32 newBucket)
 {
-    if (!splitdcache) 
+    if (!splitdcache)
        return;
 
-    /* Substract size from old bucket. */      
-    switch (adc->bucket) 
+    /* Substract size from old bucket. */
+    switch (adc->bucket)
     {
     case 0:
        afs_blocksUsed_0 -= size;
@@ -223,7 +245,7 @@ afs_DCMoveBucket(struct dcache *adc, afs_int32 size, afs_int32 newBucket)
     /* Set new bucket and increase destination bucket size. */
     adc->bucket = newBucket;
 
-    switch (adc->bucket) 
+    switch (adc->bucket)
     {
     case 0:
        afs_blocksUsed_0 += size;
@@ -235,15 +257,15 @@ afs_DCMoveBucket(struct dcache *adc, afs_int32 size, afs_int32 newBucket)
        afs_blocksUsed_2 += size;
        break;
     }
-    
+
     return;
 }
 
 /*!
  * Init split caches size.
  */
-static void 
-afs_DCSizeInit(void) 
+static void
+afs_DCSizeInit(void)
 {
     afs_blocksUsed_0 = afs_blocksUsed_1 = afs_blocksUsed_2 = 0;
 }
@@ -254,19 +276,19 @@ afs_DCSizeInit(void)
  * \param bucket
  */
 static afs_int32
-afs_DCWhichBucket(afs_int32 phase, afs_int32 bucket) 
+afs_DCWhichBucket(afs_int32 phase, afs_int32 bucket)
 {
-    if (!splitdcache) 
+    if (!splitdcache)
        return 0;
 
     afs_pct1 = afs_blocksUsed_1 / (afs_cacheBlocks / 100);
     afs_pct2 = afs_blocksUsed_2 / (afs_cacheBlocks / 100);
 
     /* Short cut: if we don't know about it, try to kill it */
-    if (phase < 2 && afs_blocksUsed_0) 
+    if (phase < 2 && afs_blocksUsed_0)
        return 0;
-    
-    if (afs_pct1 > afs_tpct1) 
+
+    if (afs_pct1 > afs_tpct1)
        return 1;
     if (afs_pct2 > afs_tpct2)
        return 2;
@@ -287,8 +309,8 @@ afs_DCWhichBucket(afs_int32 phase, afs_int32 bucket)
  */
 
 void
-afs_StoreWarn(register afs_int32 acode, afs_int32 avolume,
-             register afs_int32 aflags)
+afs_StoreWarn(afs_int32 acode, afs_int32 avolume,
+             afs_int32 aflags)
 {
     static char problem_fmt[] =
        "afs: failed to store file in volume %d (%s)\n";
@@ -375,8 +397,8 @@ u_int afs_min_cache = 0;
 
 /*!
  * Keeps the cache clean and free by truncating uneeded files, when used.
- * \param  
- * \return 
+ * \param
+ * \return
  */
 void
 afs_CacheTruncateDaemon(void)
@@ -393,7 +415,7 @@ afs_CacheTruncateDaemon(void)
     afs_TruncateDaemonRunning = 1;
     while (1) {
        cb_lowat = PERCENT((CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT), afs_cacheBlocks);
-       MObtainWriteLock(&afs_xdcache, 266);
+       ObtainWriteLock(&afs_xdcache, 266);
        if (afs_CacheTooFull) {
            int space_needed, slots_needed;
            /* if we get woken up, we should try to clean something out */
@@ -412,7 +434,7 @@ afs_CacheTruncateDaemon(void)
            if (!afs_CacheIsTooFull())
                afs_CacheTooFull = 0;
        }       /* end of cache cleanup */
-       MReleaseWriteLock(&afs_xdcache);
+       ReleaseWriteLock(&afs_xdcache);
 
        /*
         * This is a defensive check to try to avoid starving threads
@@ -456,11 +478,7 @@ afs_CacheTruncateDaemon(void)
            afs_stats_AddTo(CTD_stats.CTD_sleepTime, CTD_tmpTime);
        }
        if (afs_termState == AFSOP_STOP_TRUNCDAEMON) {
-#ifdef AFS_AFSDB_ENV
            afs_termState = AFSOP_STOP_AFSDB;
-#else
-           afs_termState = AFSOP_STOP_RXEVENT;
-#endif
            afs_osi_Wakeup(&afs_termState);
            break;
        }
@@ -482,9 +500,9 @@ afs_CacheTruncateDaemon(void)
  */
 
 void
-afs_AdjustSize(register struct dcache *adc, register afs_int32 newSize)
+afs_AdjustSize(struct dcache *adc, afs_int32 newSize)
 {
-    register afs_int32 oldSize;
+    afs_int32 oldSize;
 
     AFS_STATCNT(afs_AdjustSize);
 
@@ -520,7 +538,7 @@ afs_AdjustSize(register struct dcache *adc, register afs_int32 newSize)
  *      1.  only grab up to anumber victims if aneedSpace <= 0, not
  *          the whole set of MAXATONCE.
  *      2.  dynamically choose MAXATONCE to reflect severity of
- *          demand: something like (*aneedSpace >> (logChunk - 9)) 
+ *          demand: something like (*aneedSpace >> (logChunk - 9))
  *
  *  \note N.B. if we're called with aneedSpace <= 0 and anumber > 0, that
  *  indicates that the cache is not properly configured/tuned or
@@ -537,7 +555,7 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
     afs_int32 i, j;
     afs_hyper_t vtime;
     int skip, phase;
-    register struct vcache *tvc;
+    struct vcache *tvc;
     afs_uint32 victims[MAXATONCE];
     struct dcache *victimDCs[MAXATONCE];
     afs_hyper_t victimTimes[MAXATONCE];        /* youngest (largest LRU time) first */
@@ -546,27 +564,17 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
     afs_uint32 maxVictimPtr;   /* where it is */
     int discard;
     int curbucket;
-#if defined(AFS_FBSD80_ENV) && !defined(UKERNEL)
-    int vfslocked;
-#endif
-
-#if defined(AFS_FBSD80_ENV) && !defined(UKERNEL)
-    vfslocked = VFS_LOCK_GIANT(afs_globalVFS);
-#endif
 
     AFS_STATCNT(afs_GetDownD);
 
     if (CheckLock(&afs_xdcache) != -1)
        osi_Panic("getdownd nolock");
     /* decrement anumber first for all dudes in free list */
-    /* SHOULD always decrement anumber first, even if aneedSpace >0, 
+    /* SHOULD always decrement anumber first, even if aneedSpace >0,
      * because we should try to free space even if anumber <=0 */
     if (!aneedSpace || *aneedSpace <= 0) {
        anumber -= afs_freeDCCount;
        if (anumber <= 0) {
-#if defined(AFS_FBSD80_ENV) && !defined(UKERNEL)
-         VFS_UNLOCK_GIANT(vfslocked);
-#endif
            return;             /* enough already free */
        }
     }
@@ -578,7 +586,7 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
     /* rewrite so phases include a better eligiblity for gc test*/
     /*
      * The phase variable manages reclaims.  Set to 0, the first pass,
-     * we don't reclaim active entries, or other than target bucket.  
+     * we don't reclaim active entries, or other than target bucket.
      * Set to 1, we reclaim even active ones in target bucket.
      * Set to 2, we reclaim any inactive one.
      * Set to 3, we reclaim even active ones.
@@ -680,11 +688,11 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
                afs_size_t tchunkoffset = 0;
                afid = &tdc->f.fid;
                /* xdcache is lower than the xvcache lock */
-               MReleaseWriteLock(&afs_xdcache);
-               MObtainReadLock(&afs_xvcache);
+               ReleaseWriteLock(&afs_xdcache);
+               ObtainReadLock(&afs_xvcache);
                tvc = afs_FindVCache(afid, 0, 0 /* no stats, no vlru */ );
-               MReleaseReadLock(&afs_xvcache);
-               MObtainWriteLock(&afs_xdcache, 527);
+               ReleaseReadLock(&afs_xvcache);
+               ObtainWriteLock(&afs_xdcache, 527);
                skip = 0;
                if (tdc->refCount > 1)
                    skip = 1;
@@ -714,8 +722,8 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
                    if (!skip && (chunkFlags & IFAnyPages)) {
                        int code;
 
-                       MReleaseWriteLock(&afs_xdcache);
-                       MObtainWriteLock(&tvc->vlock, 543);
+                       ReleaseWriteLock(&afs_xdcache);
+                       ObtainWriteLock(&tvc->vlock, 543);
                        if (tvc->multiPage) {
                            skip = 1;
                            goto endmultipage;
@@ -724,31 +732,31 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
                        tvc->vstates |= VPageCleaning;
                        /* block getting new pages */
                        tvc->activeV++;
-                       MReleaseWriteLock(&tvc->vlock);
+                       ReleaseWriteLock(&tvc->vlock);
                        /* One last recheck */
-                       MObtainWriteLock(&afs_xdcache, 333);
+                       ObtainWriteLock(&afs_xdcache, 333);
                        chunkFlags = afs_indexFlags[tdc->index];
                        if (tdc->refCount > 1 || (chunkFlags & IFDataMod)
                            || (osi_Active(tvc) && (tvc->f.states & CDCLock)
                                && (chunkFlags & IFAnyPages))) {
                            skip = 1;
-                           MReleaseWriteLock(&afs_xdcache);
+                           ReleaseWriteLock(&afs_xdcache);
                            goto endputpage;
                        }
-                       MReleaseWriteLock(&afs_xdcache);
+                       ReleaseWriteLock(&afs_xdcache);
 
                        code = osi_VM_GetDownD(tvc, tdc);
 
-                       MObtainWriteLock(&afs_xdcache, 269);
+                       ObtainWriteLock(&afs_xdcache, 269);
                        /* we actually removed all pages, clean and dirty */
                        if (code == 0) {
                            afs_indexFlags[tdc->index] &=
                                ~(IFDirtyPages | IFAnyPages);
                        } else
                            skip = 1;
-                       MReleaseWriteLock(&afs_xdcache);
+                       ReleaseWriteLock(&afs_xdcache);
                      endputpage:
-                       MObtainWriteLock(&tvc->vlock, 544);
+                       ObtainWriteLock(&tvc->vlock, 544);
                        if (--tvc->activeV == 0
                            && (tvc->vstates & VRevokeWait)) {
                            tvc->vstates &= ~VRevokeWait;
@@ -760,15 +768,15 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
                            afs_osi_Wakeup((char *)&tvc->vstates);
                        }
                      endmultipage:
-                       MReleaseWriteLock(&tvc->vlock);
+                       ReleaseWriteLock(&tvc->vlock);
                    } else
 #endif /* AFS_SUN5_ENV */
                    {
-                       MReleaseWriteLock(&afs_xdcache);
+                       ReleaseWriteLock(&afs_xdcache);
                    }
 
                    afs_PutVCache(tvc); /*XXX was AFS_FAST_RELE?*/
-                   MObtainWriteLock(&afs_xdcache, 528);
+                   ObtainWriteLock(&afs_xdcache, 528);
                    if (afs_indexFlags[tdc->index] &
                        (IFDataMod | IFDirtyPages | IFAnyPages))
                        skip = 1;
@@ -844,10 +852,6 @@ afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
        }
     }                          /* big while loop */
 
-#if defined(AFS_FBSD80_ENV) && !defined(UKERNEL)
-    VFS_UNLOCK_GIANT(vfslocked);
-#endif
-
     return;
 
 }                              /*afs_GetDownD */
@@ -939,7 +943,7 @@ afs_HashOutDCache(struct dcache *adc, int zap)
  *     (in write mode).
  */
 void
-afs_FlushDCache(register struct dcache *adc)
+afs_FlushDCache(struct dcache *adc)
 {
     AFS_STATCNT(afs_FlushDCache);
     /*
@@ -980,7 +984,7 @@ afs_FlushDCache(register struct dcache *adc)
  * \note Environment: called with afs_xdcache lock write-locked.
  */
 static void
-afs_FreeDCache(register struct dcache *adc)
+afs_FreeDCache(struct dcache *adc)
 {
     /* Thread on free list, update free list count and mark entry as
      * freed in its indexFlags element.  Also, ensure DCache entry gets
@@ -1019,9 +1023,9 @@ afs_FreeDCache(register struct dcache *adc)
  */
 
 static void
-afs_DiscardDCache(register struct dcache *adc)
+afs_DiscardDCache(struct dcache *adc)
 {
-    register afs_int32 size;
+    afs_int32 size;
 
     AFS_STATCNT(afs_DiscardDCache);
 
@@ -1055,15 +1059,15 @@ afs_DiscardDCache(register struct dcache *adc)
 static void
 afs_FreeDiscardedDCache(void)
 {
-    register struct dcache *tdc;
-    register struct osi_file *tfile;
-    register afs_int32 size;
+    struct dcache *tdc;
+    struct osi_file *tfile;
+    afs_int32 size;
 
     AFS_STATCNT(afs_FreeDiscardedDCache);
 
-    MObtainWriteLock(&afs_xdcache, 510);
+    ObtainWriteLock(&afs_xdcache, 510);
     if (!afs_blocksDiscarded) {
-       MReleaseWriteLock(&afs_xdcache);
+       ReleaseWriteLock(&afs_xdcache);
        return;
     }
 
@@ -1082,7 +1086,7 @@ afs_FreeDiscardedDCache(void)
     afs_stats_cmperf.cacheBlocksDiscarded = afs_blocksDiscarded;
     /* We can lock because we just took it off the free list */
     ObtainWriteLock(&tdc->lock, 626);
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 
     /*
      * Truncate the element to reclaim its space
@@ -1096,13 +1100,13 @@ afs_FreeDiscardedDCache(void)
     /*
      * Free the element we just truncated
      */
-    MObtainWriteLock(&afs_xdcache, 511);
+    ObtainWriteLock(&afs_xdcache, 511);
     afs_indexFlags[tdc->index] &= ~IFDiscarded;
     afs_FreeDCache(tdc);
     tdc->f.states &= ~(DRO|DBackup|DRW);
     ReleaseWriteLock(&tdc->lock);
     afs_PutDCache(tdc);
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 }
 
 /*!
@@ -1242,7 +1246,7 @@ afs_RefDCache(struct dcache *adc)
  *     Nothing interesting.
  */
 int
-afs_PutDCache(register struct dcache *adc)
+afs_PutDCache(struct dcache *adc)
 {
     AFS_STATCNT(afs_PutDCache);
     ObtainWriteLock(&adc->tlock, 276);
@@ -1268,11 +1272,11 @@ afs_PutDCache(register struct dcache *adc)
  *     Both pvnLock and lock are write held.
  */
 void
-afs_TryToSmush(register struct vcache *avc, struct AFS_UCRED *acred, int sync)
+afs_TryToSmush(struct vcache *avc, afs_ucred_t *acred, int sync)
 {
-    register struct dcache *tdc;
-    register int index;
-    register int i;
+    struct dcache *tdc;
+    int index;
+    int i;
     AFS_STATCNT(afs_TryToSmush);
     afs_Trace2(afs_iclSetp, CM_TRACE_TRYTOSMUSH, ICL_TYPE_POINTER, avc,
               ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->f.m.Length));
@@ -1291,7 +1295,7 @@ afs_TryToSmush(register struct vcache *avc, struct AFS_UCRED *acred, int sync)
      * Get the hash chain containing all dce's for this fid
      */
     i = DVHash(&avc->f.fid);
-    MObtainWriteLock(&afs_xdcache, 277);
+    ObtainWriteLock(&afs_xdcache, 277);
     for (index = afs_dvhashTbl[i]; index != NULLIDX; index = i) {
        i = afs_dvnextTbl[index];       /* next pointer this hash table */
        if (afs_indexUnique[index] == avc->f.fid.Fid.Unique) {
@@ -1321,9 +1325,9 @@ afs_TryToSmush(register struct vcache *avc, struct AFS_UCRED *acred, int sync)
     }
     ReleaseWriteLock(&avc->vlock);
 #endif
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
     /*
-     * It's treated like a callback so that when we do lookups we'll 
+     * It's treated like a callback so that when we do lookups we'll
      * invalidate the unique bit if any
      * trytoSmush occured during the lookup call
      */
@@ -1336,13 +1340,13 @@ afs_TryToSmush(register struct vcache *avc, struct AFS_UCRED *acred, int sync)
  * Description
  *     Given the cached info for a file, return the number of chunks that
  *     are not available from the dcache.
- * 
+ *
  * Parameters:
  *     avc:    Pointer to the (held) vcache entry to look in.
- * 
+ *
  * Returns:
  *     The number of chunks which are not currently cached.
- * 
+ *
  * Environment:
  *     The vcache entry is held upon entry.
  */
@@ -1375,13 +1379,13 @@ afs_DCacheMissingChunks(struct vcache *avc)
      */
     if (avc->f.fid.Fid.Vnode & 1 || vType(avc) == VDIR)
        totalChunks = 1;
-    
+
     /*
      printf("Should have %d chunks for %u bytes\n",
                totalChunks, (totalLength + 1));
     */
     i = DVHash(&avc->f.fid);
-    MObtainWriteLock(&afs_xdcache, 1001);
+    ObtainWriteLock(&afs_xdcache, 1001);
     for (index = afs_dvhashTbl[i]; index != NULLIDX; index = i) {
         i = afs_dvnextTbl[index];
         if (afs_indexUnique[index] == avc->f.fid.Fid.Unique) {
@@ -1393,7 +1397,7 @@ afs_DCacheMissingChunks(struct vcache *avc)
             afs_PutDCache(tdc);
         }
     }
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 
     /*printf("Missing %d chunks\n", totalChunks);*/
 
@@ -1421,11 +1425,11 @@ afs_DCacheMissingChunks(struct vcache *avc)
  */
 
 struct dcache *
-afs_FindDCache(register struct vcache *avc, afs_size_t abyte)
+afs_FindDCache(struct vcache *avc, afs_size_t abyte)
 {
     afs_int32 chunk;
-    register afs_int32 i, index;
-    register struct dcache *tdc = NULL;
+    afs_int32 i, index;
+    struct dcache *tdc = NULL;
 
     AFS_STATCNT(afs_FindDCache);
     chunk = AFS_CHUNK(abyte);
@@ -1435,7 +1439,7 @@ afs_FindDCache(register struct vcache *avc, afs_size_t abyte)
      * after write-locking the dcache.
      */
     i = DCHash(&avc->f.fid, chunk);
-    MObtainWriteLock(&afs_xdcache, 278);
+    ObtainWriteLock(&afs_xdcache, 278);
     for (index = afs_dchashTbl[i]; index != NULLIDX;) {
        if (afs_indexUnique[index] == avc->f.fid.Fid.Unique) {
            tdc = afs_GetDSlot(index, NULL);
@@ -1450,10 +1454,10 @@ afs_FindDCache(register struct vcache *avc, afs_size_t abyte)
     if (index != NULLIDX) {
        hset(afs_indexTimes[tdc->index], afs_indexCounter);
        hadd32(afs_indexCounter, 1);
-       MReleaseWriteLock(&afs_xdcache);
+       ReleaseWriteLock(&afs_xdcache);
        return tdc;
-    } 
-    MReleaseWriteLock(&afs_xdcache);
+    }
+    ReleaseWriteLock(&afs_xdcache);
     return NULL;
 }                              /*afs_FindDCache */
 
@@ -1474,10 +1478,9 @@ afs_FindDCache(register struct vcache *avc, afs_size_t abyte)
  *
  * \return The new dcache.
  */
-struct dcache *afs_AllocDCache(struct vcache *avc,
-                               afs_int32 chunk,
-                               afs_int32 lock,
-                               struct VenusFid *ashFid)
+struct dcache *
+afs_AllocDCache(struct vcache *avc, afs_int32 chunk, afs_int32 lock,
+               struct VenusFid *ashFid)
 {
     struct dcache *tdc = NULL;
     afs_uint32 size = 0;
@@ -1584,12 +1587,6 @@ struct dcache *afs_AllocDCache(struct vcache *avc,
  *     The vcache entry pointed to by avc is unlocked upon entry.
  */
 
-struct tlocal1 {
-    struct AFSVolSync tsync;
-    struct AFSFetchStatus OutStatus;
-    struct AFSCallBack CallBack;
-};
-
 /*
  * Update the vnode-to-dcache hint if we can get the vnode lock
  * right away.  Assumes dcache entry is at least read-locked.
@@ -1607,30 +1604,25 @@ updateV2DC(int lockVc, struct vcache *v, struct dcache *d, int src)
 
 /* avc - Write-locked unless aflags & 1 */
 struct dcache *
-afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
-             register struct vrequest *areq, afs_size_t * aoffset,
+afs_GetDCache(struct vcache *avc, afs_size_t abyte,
+             struct vrequest *areq, afs_size_t * aoffset,
              afs_size_t * alen, int aflags)
 {
-    register afs_int32 i, code, code1 = 0, shortcut;
+    afs_int32 i, code, shortcut;
 #if    defined(AFS_AIX32_ENV) || defined(AFS_SGI_ENV)
-    register afs_int32 adjustsize = 0;
+    afs_int32 adjustsize = 0;
 #endif
     int setLocks;
     afs_int32 index;
     afs_int32 us;
     afs_int32 chunk;
     afs_size_t maxGoodLength;  /* amount of good data at server */
-    struct rx_call *tcall;
     afs_size_t Position = 0;
-#ifdef AFS_64BIT_CLIENT
-    afs_size_t tsize;
-    afs_size_t lengthFound;    /* as returned from server */
-#endif /* AFS_64BIT_CLIENT */
     afs_int32 size, tlen;      /* size of segment to transfer */
-    struct tlocal1 *tsmall = 0;
-    register struct dcache *tdc;
-    register struct osi_file *file;
-    register struct afs_conn *tc;
+    struct afs_FetchOutput *tsmall = 0;
+    struct dcache *tdc;
+    struct osi_file *file;
+    struct afs_conn *tc;
     int downDCount = 0;
     struct server *newCallback = NULL;
     char setNewCallback;
@@ -1641,13 +1633,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
     int doReallyAdjustSize = 0;
     int overWriteWholeChunk = 0;
 
-    XSTATS_DECLS;
 #ifndef AFS_NOSTATS
-    struct afs_stats_xferData *xferP;  /* Ptr to this op's xfer struct */
-    osi_timeval_t xferStartTime,       /*FS xfer start time */
-      xferStopTime;            /*FS xfer stop time */
-    afs_size_t bytesToXfer;    /* # bytes to xfer */
-    afs_size_t bytesXferred;   /* # bytes actually xferred */
     struct afs_stats_AccessInfo *accP; /*Ptr to access record in stats */
     int fromReplica;           /*Are we reading from a replica? */
     int numFetchLoops;         /*# times around the fetch/analyze loop */
@@ -1700,13 +1686,13 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
         * entries from the free list, and thereby assuming them to be not
         * referenced and not locked.
         */
-       MObtainReadLock(&afs_xdcache);
+       ObtainReadLock(&afs_xdcache);
        dcLocked = (0 == NBObtainSharedLock(&tdc->lock, 601));
 
        if (dcLocked && (tdc->index != NULLIDX)
            && !FidCmp(&tdc->f.fid, &avc->f.fid) && chunk == tdc->f.chunk
            && !(afs_indexFlags[tdc->index] & (IFFree | IFDiscarded))) {
-           /* got the right one.  It might not be the right version, and it 
+           /* got the right one.  It might not be the right version, and it
             * might be fetching, but it's the right dcache entry.
             */
            /* All this code should be integrated better with what follows:
@@ -1716,17 +1702,17 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
            tdc->refCount++;
            ReleaseWriteLock(&tdc->tlock);
 
-           MReleaseReadLock(&afs_xdcache);
+           ReleaseReadLock(&afs_xdcache);
            shortcut = 1;
 
            if (hsame(tdc->f.versionNo, avc->f.m.DataVersion)
                && !(tdc->dflags & DFFetching)) {
 
                afs_stats_cmperf.dcacheHits++;
-               MObtainWriteLock(&afs_xdcache, 559);
+               ObtainWriteLock(&afs_xdcache, 559);
                QRemove(&tdc->lruq);
                QAdd(&afs_DLRU, &tdc->lruq);
-               MReleaseWriteLock(&afs_xdcache);
+               ReleaseWriteLock(&afs_xdcache);
 
                /* Locks held:
                 * avc->lock(R) if setLocks && !slowPass
@@ -1738,7 +1724,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
        } else {
            if (dcLocked)
                ReleaseSharedLock(&tdc->lock);
-           MReleaseReadLock(&afs_xdcache);
+           ReleaseReadLock(&afs_xdcache);
        }
 
        if (!shortcut)
@@ -1767,7 +1753,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
        /* check to make sure our space is fine */
        afs_MaybeWakeupTruncateDaemon();
 
-       MObtainWriteLock(&afs_xdcache, 280);
+       ObtainWriteLock(&afs_xdcache, 280);
        us = NULLIDX;
        for (index = afs_dchashTbl[i]; index != NULLIDX;) {
            if (afs_indexUnique[index] == avc->f.fid.Fid.Unique) {
@@ -1786,7 +1772,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
                        afs_dcnextTbl[index] = afs_dchashTbl[i];
                        afs_dchashTbl[i] = index;
                    }
-                   MReleaseWriteLock(&afs_xdcache);
+                   ReleaseWriteLock(&afs_xdcache);
                    ObtainSharedLock(&tdc->lock, 606);
                    break;      /* leaving refCount high for caller */
                }
@@ -1824,12 +1810,9 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
                        break;
                    /* If we can't get space for 5 mins we give up and panic */
                    if (++downDCount > 300) {
-#if defined(AFS_CACHE_BYPASS)
-                       afs_warn("GetDCache calling osi_Panic: No space in five minutes.\n downDCount: %d\n aoffset: %d alen: %d\n", downDCount, aoffset, alen);
-#endif
                        osi_Panic("getdcache");
                     }
-                   MReleaseWriteLock(&afs_xdcache);
+                   ReleaseWriteLock(&afs_xdcache);
                    /*
                     * Locks held:
                     * avc->lock(R) if setLocks
@@ -1854,7 +1837,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
            tdc->dflags = DFEntryMod;
            tdc->mflags = 0;
            afs_MaybeWakeupTruncateDaemon();
-           MReleaseWriteLock(&afs_xdcache);
+           ReleaseWriteLock(&afs_xdcache);
            ConvertWToSLock(&tdc->lock);
        }
     }
@@ -1915,7 +1898,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
 #endif /* AFS_SGI_ENV */
        if (AFS_CHUNKTOBASE(chunk) + adjustsize >= avc->f.m.Length &&
 #else /* defined(AFS_AIX32_ENV) || defined(AFS_SGI_ENV) */
-#if    defined(AFS_SUN5_ENV)  || defined(AFS_OSF_ENV)
+#if    defined(AFS_SUN5_ENV)
        if ((doAdjustSize || (AFS_CHUNKTOBASE(chunk) >= avc->f.m.Length)) &&
 #else
        if (AFS_CHUNKTOBASE(chunk) >= avc->f.m.Length &&
@@ -2128,7 +2111,7 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
                           tdc->dflags);
        }
        tsmall =
-           (struct tlocal1 *)osi_AllocLargeSpace(sizeof(struct tlocal1));
+           (struct afs_FetchOutput *)osi_AllocLargeSpace(sizeof(struct afs_FetchOutput));
        setVcacheStatus = 0;
 #ifndef AFS_NOSTATS
        /*
@@ -2212,10 +2195,6 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
 
                tc = afs_Conn(&avc->f.fid, areq, SHARED_LOCK);
                if (tc) {
-#ifdef AFS_64BIT_CLIENT
-                   afs_int32 length_hi;
-#endif
-                   afs_int32 length, bytes;
 #ifndef AFS_NOSTATS
                    numFetchLoops++;
                    if (fromReplica)
@@ -2223,211 +2202,24 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
 
 #endif /* AFS_NOSTATS */
                    if (!setLocks || slowPass) {
-                       avc->callback = tc->srvr->server;
+                       avc->callback = tc->parent->srvr->server;
                    } else {
-                       newCallback = tc->srvr->server;
+                       newCallback = tc->parent->srvr->server;
                        setNewCallback = 1;
                    }
                    i = osi_Time();
-                   RX_AFS_GUNLOCK();
-                   tcall = rx_NewCall(tc->id);
-                   RX_AFS_GLOCK();
-
-                   XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_FETCHDATA);
-#ifdef AFS_64BIT_CLIENT
-                   length_hi = code = 0;
-                   if (!afs_serverHasNo64Bit(tc)) {
-                       tsize = size;
-                       RX_AFS_GUNLOCK();
-                       code =
-                           StartRXAFS_FetchData64(tcall,
-                                                  (struct AFSFid *)&avc->f.fid.
-                                                  Fid, Position, tsize);
-                       if (code != 0) {
-                           RX_AFS_GLOCK();
-                           afs_Trace2(afs_iclSetp, CM_TRACE_FETCH64CODE,
-                                      ICL_TYPE_POINTER, avc, ICL_TYPE_INT32,
-                                      code);
-                       } else {
-                           bytes =
-                               rx_Read(tcall, (char *)&length_hi,
-                                       sizeof(afs_int32));
-                           RX_AFS_GLOCK();
-                           if (bytes == sizeof(afs_int32)) {
-                               length_hi = ntohl(length_hi);
-                           } else {
-                               length_hi = 0;
-                               code = rx_Error(tcall);
-                               RX_AFS_GUNLOCK();
-                               code1 = rx_EndCall(tcall, code);
-                               RX_AFS_GLOCK();
-                               tcall = (struct rx_call *)0;
-                           }
-                       }
-                   }
-                   if (code == RXGEN_OPCODE || afs_serverHasNo64Bit(tc)) {
-                       if (Position > 0x7FFFFFFF) {
-                           code = EFBIG;
-                       } else {
-                           afs_int32 pos;
-                           pos = Position;
-                           RX_AFS_GUNLOCK();
-                           if (!tcall)
-                               tcall = rx_NewCall(tc->id);
-                           code =
-                               StartRXAFS_FetchData(tcall, (struct AFSFid *)
-                                                    &avc->f.fid.Fid, pos,
-                                                    size);
-                           RX_AFS_GLOCK();
-                       }
-                       afs_serverSetNo64Bit(tc);
-                   }
-                   if (code == 0) {
-                       RX_AFS_GUNLOCK();
-                       bytes =
-                           rx_Read(tcall, (char *)&length,
-                                   sizeof(afs_int32));
-                       RX_AFS_GLOCK();
-                       if (bytes == sizeof(afs_int32)) {
-                           length = ntohl(length);
-                       } else {
-                           code = rx_Error(tcall);
-                       }
-                   }
-                   FillInt64(lengthFound, length_hi, length);
-                   afs_Trace3(afs_iclSetp, CM_TRACE_FETCH64LENG,
-                              ICL_TYPE_POINTER, avc, ICL_TYPE_INT32, code,
-                              ICL_TYPE_OFFSET,
-                              ICL_HANDLE_OFFSET(lengthFound));
-#else /* AFS_64BIT_CLIENT */
-                   RX_AFS_GUNLOCK();
-                   code =
-                       StartRXAFS_FetchData(tcall,
-                                            (struct AFSFid *)&avc->f.fid.Fid,
-                                            Position, size);
-                   RX_AFS_GLOCK();
-                   if (code == 0) {
-                       RX_AFS_GUNLOCK();
-                       bytes =
-                           rx_Read(tcall, (char *)&length,
-                                   sizeof(afs_int32));
-                       RX_AFS_GLOCK();
-                       if (bytes == sizeof(afs_int32)) {
-                           length = ntohl(length);
-                       } else {
-                           code = rx_Error(tcall);
-                       }
-                   }
-#endif /* AFS_64BIT_CLIENT */
-                   if (code == 0) {
-
-#ifndef AFS_NOSTATS
-                       xferP =
-                           &(afs_stats_cmfullperf.rpc.
-                             fsXferTimes[AFS_STATS_FS_XFERIDX_FETCHDATA]);
-                       osi_GetuTime(&xferStartTime);
-
-                       code =
-                           afs_CacheFetchProc(tcall, file,
-                                              (afs_size_t) Position, tdc,
-                                              avc, &bytesToXfer,
-                                              &bytesXferred, length);
-
-                       osi_GetuTime(&xferStopTime);
-                       (xferP->numXfers)++;
-                       if (!code) {
-                           (xferP->numSuccesses)++;
-                           afs_stats_XferSumBytes
-                               [AFS_STATS_FS_XFERIDX_FETCHDATA] +=
-                               bytesXferred;
-                           (xferP->sumBytes) +=
-                               (afs_stats_XferSumBytes
-                                [AFS_STATS_FS_XFERIDX_FETCHDATA] >> 10);
-                           afs_stats_XferSumBytes
-                               [AFS_STATS_FS_XFERIDX_FETCHDATA] &= 0x3FF;
-                           if (bytesXferred < xferP->minBytes)
-                               xferP->minBytes = bytesXferred;
-                           if (bytesXferred > xferP->maxBytes)
-                               xferP->maxBytes = bytesXferred;
-
-                           /*
-                            * Tally the size of the object.  Note: we tally the actual size,
-                            * NOT the number of bytes that made it out over the wire.
-                            */
-                           if (bytesToXfer <= AFS_STATS_MAXBYTES_BUCKET0)
-                               (xferP->count[0])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET1)
-                               (xferP->count[1])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET2)
-                               (xferP->count[2])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET3)
-                               (xferP->count[3])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET4)
-                               (xferP->count[4])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET5)
-                               (xferP->count[5])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET6)
-                               (xferP->count[6])++;
-                           else if (bytesToXfer <=
-                                    AFS_STATS_MAXBYTES_BUCKET7)
-                               (xferP->count[7])++;
-                           else
-                               (xferP->count[8])++;
-
-                           afs_stats_GetDiff(elapsedTime, xferStartTime,
-                                             xferStopTime);
-                           afs_stats_AddTo((xferP->sumTime), elapsedTime);
-                           afs_stats_SquareAddTo((xferP->sqrTime),
-                                                 elapsedTime);
-                           if (afs_stats_TimeLessThan
-                               (elapsedTime, (xferP->minTime))) {
-                               afs_stats_TimeAssign((xferP->minTime),
-                                                    elapsedTime);
-                           }
-                           if (afs_stats_TimeGreaterThan
-                               (elapsedTime, (xferP->maxTime))) {
-                               afs_stats_TimeAssign((xferP->maxTime),
-                                                    elapsedTime);
-                           }
-                       }
-#else
-                       code =
-                           afs_CacheFetchProc(tcall, file, Position, tdc,
-                                              avc, 0, 0, length);
-#endif /* AFS_NOSTATS */
-                   }
-                   if (code == 0) {
-                       RX_AFS_GUNLOCK();
-                       code =
-                           EndRXAFS_FetchData(tcall, &tsmall->OutStatus,
-                                              &tsmall->CallBack,
-                                              &tsmall->tsync);
-                       RX_AFS_GLOCK();
-                   }
-                   XSTATS_END_TIME;
-                   RX_AFS_GUNLOCK();
-                   if (tcall)
-                       code1 = rx_EndCall(tcall, code);
-                   RX_AFS_GLOCK();
-               } else {
-                   code = -1;
-               }
-               if (!code && code1)
-                   code = code1;
+                   code = afs_CacheFetchProc(tc, file, Position, tdc,
+                                              avc, size, tsmall);
+               } else
+                  code = -1;
 
                if (code == 0) {
-                   /* callback could have been broken (or expired) in a race here, 
+                   /* callback could have been broken (or expired) in a race here,
                     * but we return the data anyway.  It's as good as we knew about
                     * when we started. */
-                   /* 
-                    * validPos is updated by CacheFetchProc, and can only be 
-                    * modifed under a dcache write lock, which we've blocked out 
+                   /*
+                    * validPos is updated by CacheFetchProc, and can only be
+                    * modifed under a dcache write lock, which we've blocked out
                     */
                    size = tdc->validPos - Position;    /* actual segment size */
                    if (size < 0)
@@ -2570,10 +2362,10 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
     /* Fix up LRU info */
 
     if (tdc) {
-       MObtainWriteLock(&afs_xdcache, 602);
+       ObtainWriteLock(&afs_xdcache, 602);
        hset(afs_indexTimes[tdc->index], afs_indexCounter);
        hadd32(afs_indexCounter, 1);
-       MReleaseWriteLock(&afs_xdcache);
+       ReleaseWriteLock(&afs_xdcache);
 
        /* return the data */
        if (vType(avc) == VDIR)
@@ -2671,8 +2463,8 @@ afs_GetDCache(register struct vcache *avc, afs_size_t abyte,
 void
 afs_WriteThroughDSlots(void)
 {
-    register struct dcache *tdc;
-    register afs_int32 i, touchedit = 0;
+    struct dcache *tdc;
+    afs_int32 i, touchedit = 0;
 
     struct afs_q DirtyQ, *tq;
 
@@ -2683,7 +2475,7 @@ afs_WriteThroughDSlots(void)
      * holding afs_xdcache.  So we enter xdcache, get a reference
      * for every dcache entry, and exit xdcache.
      */
-    MObtainWriteLock(&afs_xdcache, 283);
+    ObtainWriteLock(&afs_xdcache, 283);
     QInit(&DirtyQ);
     for (i = 0; i < afs_cacheFiles; i++) {
        tdc = afs_indexTable[i];
@@ -2697,7 +2489,7 @@ afs_WriteThroughDSlots(void)
            QAdd(&DirtyQ, &tdc->dirty);
        }
     }
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 
     /*
      * Now, for each dcache entry we found, check if it's dirty.
@@ -2718,9 +2510,9 @@ afs_WriteThroughDSlots(void)
            /* Now that we have the write lock, double-check */
            if (wrLock && (tdc->dflags & DFEntryMod)) {
                tdc->dflags &= ~DFEntryMod;
-               MObtainWriteLock(&afs_xdcache, 620);
+               ObtainWriteLock(&afs_xdcache, 620);
                afs_WriteDCache(tdc, 1);
-               MReleaseWriteLock(&afs_xdcache);
+               ReleaseWriteLock(&afs_xdcache);
                touchedit = 1;
            }
            if (wrLock)
@@ -2730,7 +2522,7 @@ afs_WriteThroughDSlots(void)
        afs_PutDCache(tdc);
     }
 
-    MObtainWriteLock(&afs_xdcache, 617);
+    ObtainWriteLock(&afs_xdcache, 617);
     if (!touchedit && (cacheDiskType != AFS_FCACHE_TYPE_MEM)) {
        /* Touch the file to make sure that the mtime on the file is kept
         * up-to-date to avoid losing cached files on cold starts because
@@ -2742,9 +2534,10 @@ afs_WriteThroughDSlots(void)
        theader.firstCSize = AFS_FIRSTCSIZE;
        theader.otherCSize = AFS_OTHERCSIZE;
        theader.version = AFS_CI_VERSION;
+       theader.dataSize = sizeof(struct fcache);
        afs_osi_Write(afs_cacheInodep, 0, &theader, sizeof(theader));
     }
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 }
 
 /*
@@ -2763,9 +2556,9 @@ afs_WriteThroughDSlots(void)
  */
 
 struct dcache *
-afs_MemGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
+afs_MemGetDSlot(afs_int32 aslot, struct dcache *tmpdc)
 {
-    register struct dcache *tdc;
+    struct dcache *tdc;
     int existing = 0;
 
     AFS_STATCNT(afs_MemGetDSlot);
@@ -2789,7 +2582,8 @@ afs_MemGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
        if (!afs_freeDSList) {
            /* none free, making one is better than a panic */
            afs_stats_cmperf.dcacheXAllocs++;   /* count in case we have a leak */
-           tdc = (struct dcache *)afs_osi_Alloc(sizeof(struct dcache));
+           tdc = afs_osi_Alloc(sizeof(struct dcache));
+           osi_Assert(tdc != NULL);
 #ifdef KERNEL_HAVE_PIN
            pin((char *)tdc, sizeof(struct dcache));    /* XXX */
 #endif
@@ -2853,10 +2647,10 @@ unsigned int last_error = 0, lasterrtime = 0;
  *     afs_xdcache lock write-locked.
  */
 struct dcache *
-afs_UFSGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
+afs_UFSGetDSlot(afs_int32 aslot, struct dcache *tmpdc)
 {
-    register afs_int32 code;
-    register struct dcache *tdc;
+    afs_int32 code;
+    struct dcache *tdc;
     int existing = 0;
     int entryok;
 
@@ -2886,7 +2680,8 @@ afs_UFSGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
        if (!afs_freeDSList) {
            /* none free, making one is better than a panic */
            afs_stats_cmperf.dcacheXAllocs++;   /* count in case we have a leak */
-           tdc = (struct dcache *)afs_osi_Alloc(sizeof(struct dcache));
+           tdc = afs_osi_Alloc(sizeof(struct dcache));
+           osi_Assert(tdc != NULL);
 #ifdef KERNEL_HAVE_PIN
            pin((char *)tdc, sizeof(struct dcache));    /* XXX */
 #endif
@@ -2939,9 +2734,9 @@ afs_UFSGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
            } else if (tdc->f.states & DBackup) {
                afs_DCMoveBucket(tdc, 0, 1);
            } else {
-               afs_DCMoveBucket(tdc, 0, 1); 
+               afs_DCMoveBucket(tdc, 0, 1);
            }
-       } 
+       }
     }
     tdc->refCount = 1;
     tdc->index = aslot;
@@ -2987,9 +2782,9 @@ afs_UFSGetDSlot(register afs_int32 aslot, register struct dcache *tmpdc)
  */
 
 int
-afs_WriteDCache(register struct dcache *adc, int atime)
+afs_WriteDCache(struct dcache *adc, int atime)
 {
-    register afs_int32 code;
+    afs_int32 code;
 
     if (cacheDiskType == AFS_FCACHE_TYPE_MEM)
        return 0;
@@ -3023,10 +2818,10 @@ afs_WriteDCache(register struct dcache *adc, int atime)
  *     Nothing interesting.
  */
 int
-afs_wakeup(register struct vcache *avc)
+afs_wakeup(struct vcache *avc)
 {
-    register int i;
-    register struct brequest *tb;
+    int i;
+    struct brequest *tb;
     tb = afs_brs;
     AFS_STATCNT(afs_wakeup);
     for (i = 0; i < NBRS; i++, tb++) {
@@ -3071,25 +2866,25 @@ afs_wakeup(register struct vcache *avc)
 int
 afs_InitCacheFile(char *afile, ino_t ainode)
 {
-    register afs_int32 code;
+    afs_int32 code;
     afs_int32 index;
     int fileIsBad;
     struct osi_file *tfile;
     struct osi_stat tstat;
-    register struct dcache *tdc;
+    struct dcache *tdc;
 
     AFS_STATCNT(afs_InitCacheFile);
     index = afs_stats_cmperf.cacheNumEntries;
     if (index >= afs_cacheFiles)
        return EINVAL;
 
-    MObtainWriteLock(&afs_xdcache, 282);
+    ObtainWriteLock(&afs_xdcache, 282);
     tdc = afs_GetDSlot(index, NULL);
     ReleaseReadLock(&tdc->tlock);
-    MReleaseWriteLock(&afs_xdcache);
+    ReleaseWriteLock(&afs_xdcache);
 
     ObtainWriteLock(&tdc->lock, 621);
-    MObtainWriteLock(&afs_xdcache, 622);
+    ObtainWriteLock(&afs_xdcache, 622);
     if (afile) {
        code = afs_LookupInodeByPath(afile, &tdc->f.inode.ufs, NULL);
        if (code) {
@@ -3100,7 +2895,7 @@ afs_InitCacheFile(char *afile, ino_t ainode)
        }
     } else {
        /* Add any other 'complex' inode types here ... */
-#if defined(UKERNEL) || !defined(LINUX_USE_FH)
+#if !defined(AFS_LINUX26_ENV) && !defined(AFS_CACHE_VNODE_PATH)
        tdc->f.inode.ufs = ainode;
 #else
        osi_Panic("Can't init cache with inode numbers when complex inodes are "
@@ -3200,7 +2995,7 @@ afs_InitCacheFile(char *afile, ino_t ainode)
  * Initialize dcache related variables.
  *
  * \param afiles
- * \param ablocks 
+ * \param ablocks
  * \param aDentries
  * \param achunk
  * \param aflags
@@ -3209,7 +3004,7 @@ afs_InitCacheFile(char *afile, ino_t ainode)
 void
 afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk, int aflags)
 {
-    register struct dcache *tdp;
+    struct dcache *tdp;
     int i;
     int code;
 
@@ -3244,12 +3039,12 @@ afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk, int aflags)
        /* ablocks is reported in 1K blocks */
        code = afs_InitMemCache(afiles, AFS_FIRSTCSIZE, aflags);
        if (code != 0) {
-           printf("afsd: memory cache too large for available memory.\n");
-           printf("afsd: AFS files cannot be accessed.\n\n");
+           afs_warn("afsd: memory cache too large for available memory.\n");
+           afs_warn("afsd: AFS files cannot be accessed.\n\n");
            dcacheDisabled = 1;
            afiles = ablocks = 0;
        } else
-           printf("Memory cache: Allocating %d dcache entries...",
+           afs_warn("Memory cache: Allocating %d dcache entries...",
                   aDentries);
     } else {
        cacheDiskType = AFS_FCACHE_TYPE_UFS;
@@ -3259,38 +3054,42 @@ afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk, int aflags)
     if (aDentries > 512)
        afs_dhashsize = 2048;
     /* initialize hash tables */
-    afs_dvhashTbl =
-       (afs_int32 *) afs_osi_Alloc(afs_dhashsize * sizeof(afs_int32));
-    afs_dchashTbl =
-       (afs_int32 *) afs_osi_Alloc(afs_dhashsize * sizeof(afs_int32));
+    afs_dvhashTbl = afs_osi_Alloc(afs_dhashsize * sizeof(afs_int32));
+    osi_Assert(afs_dvhashTbl != NULL);
+    afs_dchashTbl = afs_osi_Alloc(afs_dhashsize * sizeof(afs_int32));
+    osi_Assert(afs_dchashTbl != NULL);
     for (i = 0; i < afs_dhashsize; i++) {
        afs_dvhashTbl[i] = NULLIDX;
        afs_dchashTbl[i] = NULLIDX;
     }
-    afs_dvnextTbl = (afs_int32 *) afs_osi_Alloc(afiles * sizeof(afs_int32));
-    afs_dcnextTbl = (afs_int32 *) afs_osi_Alloc(afiles * sizeof(afs_int32));
+    afs_dvnextTbl = afs_osi_Alloc(afiles * sizeof(afs_int32));
+    osi_Assert(afs_dvnextTbl != NULL);
+    afs_dcnextTbl = afs_osi_Alloc(afiles * sizeof(afs_int32));
+    osi_Assert(afs_dcnextTbl != NULL);
     for (i = 0; i < afiles; i++) {
        afs_dvnextTbl[i] = NULLIDX;
        afs_dcnextTbl[i] = NULLIDX;
     }
 
     /* Allocate and zero the pointer array to the dcache entries */
-    afs_indexTable = (struct dcache **)
-       afs_osi_Alloc(sizeof(struct dcache *) * afiles);
-    memset((char *)afs_indexTable, 0, sizeof(struct dcache *) * afiles);
-    afs_indexTimes =
-       (afs_hyper_t *) afs_osi_Alloc(afiles * sizeof(afs_hyper_t));
-    memset((char *)afs_indexTimes, 0, afiles * sizeof(afs_hyper_t));
-    afs_indexUnique =
-       (afs_int32 *) afs_osi_Alloc(afiles * sizeof(afs_uint32));
-    memset((char *)afs_indexUnique, 0, afiles * sizeof(afs_uint32));
-    afs_indexFlags = (u_char *) afs_osi_Alloc(afiles * sizeof(u_char));
-    memset((char *)afs_indexFlags, 0, afiles * sizeof(char));
+    afs_indexTable = afs_osi_Alloc(sizeof(struct dcache *) * afiles);
+    osi_Assert(afs_indexTable != NULL);
+    memset(afs_indexTable, 0, sizeof(struct dcache *) * afiles);
+    afs_indexTimes = afs_osi_Alloc(afiles * sizeof(afs_hyper_t));
+    osi_Assert(afs_indexTimes != NULL);
+    memset(afs_indexTimes, 0, afiles * sizeof(afs_hyper_t));
+    afs_indexUnique = afs_osi_Alloc(afiles * sizeof(afs_uint32));
+    osi_Assert(afs_indexUnique != NULL);
+    memset(afs_indexUnique, 0, afiles * sizeof(afs_uint32));
+    afs_indexFlags = afs_osi_Alloc(afiles * sizeof(u_char));
+    osi_Assert(afs_indexFlags != NULL);
+    memset(afs_indexFlags, 0, afiles * sizeof(char));
 
     /* Allocate and thread the struct dcache entries themselves */
     tdp = afs_Initial_freeDSList =
-       (struct dcache *)afs_osi_Alloc(aDentries * sizeof(struct dcache));
-    memset((char *)tdp, 0, aDentries * sizeof(struct dcache));
+       afs_osi_Alloc(aDentries * sizeof(struct dcache));
+    osi_Assert(tdp != NULL);
+    memset(tdp, 0, aDentries * sizeof(struct dcache));
 #ifdef KERNEL_HAVE_PIN
     pin((char *)afs_indexTable, sizeof(struct dcache *) * afiles);     /* XXX */
     pin((char *)afs_indexTimes, sizeof(afs_hyper_t) * afiles); /* XXX */
@@ -3321,8 +3120,8 @@ afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk, int aflags)
 
     afs_dcentries = aDentries;
     afs_blocksUsed = 0;
-    afs_stats_cmperf.cacheBucket0_Discarded = 
-       afs_stats_cmperf.cacheBucket1_Discarded = 
+    afs_stats_cmperf.cacheBucket0_Discarded =
+       afs_stats_cmperf.cacheBucket1_Discarded =
        afs_stats_cmperf.cacheBucket2_Discarded = 0;
     afs_DCSizeInit();
     QInit(&afs_DLRU);
@@ -3337,6 +3136,18 @@ shutdown_dcache(void)
 {
     int i;
 
+#ifdef AFS_CACHE_VNODE_PATH
+    if (cacheDiskType != AFS_FCACHE_TYPE_MEM) {
+       struct dcache *tdc;
+       for (i = 0; i < afs_cacheFiles; i++) {
+           tdc = afs_indexTable[i];
+           if (tdc) {
+               afs_osi_FreeStr(tdc->f.inode.ufs);
+           }
+       }
+    }
+#endif
+
     afs_osi_Free(afs_dvnextTbl, afs_cacheFiles * sizeof(afs_int32));
     afs_osi_Free(afs_dcnextTbl, afs_cacheFiles * sizeof(afs_int32));
     afs_osi_Free(afs_indexTable, afs_cacheFiles * sizeof(struct dcache *));
@@ -3365,8 +3176,8 @@ shutdown_dcache(void)
     afs_osi_Free(afs_dchashTbl, afs_dhashsize * sizeof(afs_int32));
 
     afs_blocksUsed = afs_dcentries = 0;
-    afs_stats_cmperf.cacheBucket0_Discarded = 
-       afs_stats_cmperf.cacheBucket1_Discarded = 
+    afs_stats_cmperf.cacheBucket0_Discarded =
+       afs_stats_cmperf.cacheBucket1_Discarded =
        afs_stats_cmperf.cacheBucket2_Discarded = 0;
     hzero(afs_indexCounter);
 
@@ -3383,9 +3194,9 @@ shutdown_dcache(void)
 /*!
  * Get a dcache ready for writing, respecting the current cache size limits
  *
- * len is required because afs_GetDCache with flag == 4 expects the length 
- * field to be filled. It decides from this whether it's necessary to fetch 
- * data into the chunk before writing or not (when the whole chunk is 
+ * len is required because afs_GetDCache with flag == 4 expects the length
+ * field to be filled. It decides from this whether it's necessary to fetch
+ * data into the chunk before writing or not (when the whole chunk is
  * overwritten!).
  *
  * \param avc          The vcache to fetch a dcache for
@@ -3395,17 +3206,18 @@ shutdown_dcache(void)
  * \param noLock
  *
  * \return If successful, a reference counted dcache with tdc->lock held. Lock
- *         must be released and afs_PutDCache() called to free dcache. 
+ *         must be released and afs_PutDCache() called to free dcache.
  *         NULL on  failure
  *
- * \note avc->lock must be held on entry. Function may release and reobtain 
+ * \note avc->lock must be held on entry. Function may release and reobtain
  *       avc->lock and GLOCK.
  */
 
 struct dcache *
-afs_ObtainDCacheForWriting(struct vcache *avc, afs_size_t filePos, 
+afs_ObtainDCacheForWriting(struct vcache *avc, afs_size_t filePos,
                           afs_size_t len, struct vrequest *areq,
-                          int noLock) {
+                          int noLock)
+{
     struct dcache *tdc = NULL;
     afs_size_t offset;
 
@@ -3464,8 +3276,6 @@ afs_ObtainDCacheForWriting(struct vcache *avc, afs_size_t filePos,
     return tdc;
 }
 
-#if defined(AFS_DISCON_ENV)
-
 /*!
  * Make a shadow copy of a dir's dcache. It's used for disconnected
  * operations like remove/create/rename to keep the original directory data.
@@ -3480,7 +3290,8 @@ afs_ObtainDCacheForWriting(struct vcache *avc, afs_size_t filePos,
  * \note The vcache entry must be write locked.
  * \note The dcache entry must be read locked.
  */
-int afs_MakeShadowDir(struct vcache *avc, struct dcache *adc)
+int
+afs_MakeShadowDir(struct vcache *avc, struct dcache *adc)
 {
     int i, code, ret_code = 0, written, trans_size;
     struct dcache *new_dc = NULL;
@@ -3518,7 +3329,7 @@ int afs_MakeShadowDir(struct vcache *avc, struct dcache *adc)
     new_dc->f.chunkBytes = adc->f.chunkBytes;
 
     ReleaseReadLock(&adc->mflock);
-    
+
     /* Now add to the two hash chains */
     i = DCHash(&shadow_fid, 0);
     afs_dcnextTbl[new_dc->index] = afs_dchashTbl[i];
@@ -3531,9 +3342,9 @@ int afs_MakeShadowDir(struct vcache *avc, struct dcache *adc)
     ReleaseWriteLock(&afs_xdcache);
 
     /* Alloc a 4k block. */
-    data = (char *) afs_osi_Alloc(4096);
+    data = afs_osi_Alloc(4096);
     if (!data) {
-       printf("afs_MakeShadowDir: could not alloc data\n");
+       afs_warn("afs_MakeShadowDir: could not alloc data\n");
        ret_code = ENOMEM;
        goto done;
     }
@@ -3580,7 +3391,7 @@ int afs_MakeShadowDir(struct vcache *avc, struct dcache *adc)
        ObtainWriteLock(&afs_xvcache, 763);
        ObtainWriteLock(&afs_disconDirtyLock, 765);
        QAdd(&afs_disconShadow, &avc->shadowq);
-       osi_vnhold(avc, 0);
+       osi_Assert((afs_RefVCache(avc) == 0));
        ReleaseWriteLock(&afs_disconDirtyLock);
        ReleaseWriteLock(&afs_xvcache);
 
@@ -3599,7 +3410,8 @@ done:
  *
  * \note avc must be write locked.
  */
-void afs_DeleteShadowDir(struct vcache *avc)
+void
+afs_DeleteShadowDir(struct vcache *avc)
 {
     struct dcache *tdc;
     struct VenusFid shadow_fid;
@@ -3631,25 +3443,27 @@ void afs_DeleteShadowDir(struct vcache *avc)
  * \param alen  The new length of the file
  *
  */
-void afs_PopulateDCache(struct vcache *avc, afs_size_t apos, struct vrequest *areq) {
+void
+afs_PopulateDCache(struct vcache *avc, afs_size_t apos, struct vrequest *areq)
+{
     struct dcache *tdc;
     afs_size_t len, offset;
     afs_int32 start, end;
 
     /* We're doing this to deal with the situation where we extend
-     * by writing after lseek()ing past the end of the file . If that 
-     * extension skips chunks, then those chunks won't be created, and 
-     * GetDCache will assume that they have to be fetched from the server. 
-     * So, for each chunk between the current file position, and the new 
+     * by writing after lseek()ing past the end of the file . If that
+     * extension skips chunks, then those chunks won't be created, and
+     * GetDCache will assume that they have to be fetched from the server.
+     * So, for each chunk between the current file position, and the new
      * length we GetDCache for that chunk.
      */
 
-    if (AFS_CHUNK(apos) == 0 || apos <= avc->f.m.Length) 
+    if (AFS_CHUNK(apos) == 0 || apos <= avc->f.m.Length)
        return;
 
     if (avc->f.m.Length == 0)
        start = 0;
-    else 
+    else
        start = AFS_CHUNK(avc->f.m.Length)+1;
 
     end = AFS_CHUNK(apos);
@@ -3662,5 +3476,3 @@ void afs_PopulateDCache(struct vcache *avc, afs_size_t apos, struct vrequest *ar
        start++;
     }
 }
-
-#endif