Remove some explicit sbrk() usage
[openafs.git] / src / viced / afsfileprocs.c
index 18fe4f2..bfaac8d 100644 (file)
 /* ********************************************************************** */
 
 /*
+ * GetVolumePackage disables Rx keepalives; PutVolumePackage re-enables.
+ * If callbacks are to be broken, keepalives should be enabled in the
+ * stub while that occurs; disabled while disk I/O is in process.
+ */
+
+/*
  * in Check_PermissionRights, certain privileges are afforded to the owner
  * of the volume, or the owner of a file.  Are these considered "use of
  * privilege"?
 #endif
 #endif /* AFS_HPUX_ENV */
 
-#include <rx/xdr.h>
+#include <afs/opr.h>
+#include <rx/rx_queue.h>
+#include <opr/lock.h>
+#include <opr/proc.h>
 #include <afs/nfs.h>
-#include <afs/afs_assert.h>
-#include <lwp.h>
-#include <lock.h>
 #include <afs/afsint.h>
 #include <afs/vldbint.h>
 #include <afs/errors.h>
@@ -102,9 +108,7 @@ extern void SetDirHandle(DirHandle * dir, Vnode * vnode);
 extern void FidZap(DirHandle * file);
 extern void FidZero(DirHandle * file);
 
-#ifdef AFS_PTHREAD_ENV
 pthread_mutex_t fileproc_glock_mutex;
-#endif /* AFS_PTHREAD_ENV */
 
 /* Useful local defines used by this module */
 
@@ -152,13 +156,9 @@ extern afs_int32 dataVersionHigh;
 
 extern int SystemId;
 static struct AFSCallStatistics AFSCallStats;
-#if FS_STATS_DETAILED
 struct fs_stats_FullPerfStats afs_FullPerfStats;
 extern int AnonymousID;
-#endif /* FS_STATS_DETAILED */
-#if OPENAFS_VOL_STATS
 static const char nullString[] = "";
-#endif /* OPENAFS_VOL_STATS */
 
 struct afs_FSStats {
     afs_int32 NothingYet;
@@ -246,7 +246,7 @@ SetVolumeSync(struct AFSVolSync *async, Volume * avol)
     /* date volume instance was created */
     if (async) {
        if (avol)
-           async->spare1 = avol->header->diskstuff.creationDate;
+           async->spare1 = V_creationDate(avol);
        else
            async->spare1 = 0;
        async->spare2 = 0;
@@ -284,8 +284,8 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
 
        fdP = IH_OPEN(vnp->handle);
        if (fdP == NULL) {
-           ViceLog(0, ("CheckLength: cannot open inode for fid %lu.%lu.%lu\n",
-                       afs_printable_uint32_lu(vp->hashid),
+           ViceLog(0, ("CheckLength: cannot open inode for fid %" AFS_VOLID_FMT ".%lu.%lu\n",
+                       afs_printable_VolumeId_lu(vp->hashid),
                        afs_printable_uint32_lu(Vn_id(vnp)),
                        afs_printable_uint32_lu(vnp->disk.uniquifier)));
            return -1;
@@ -294,9 +294,9 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
        FDH_CLOSE(fdP);
        if (alen < 0) {
            afs_int64 alen64 = alen;
-           ViceLog(0, ("CheckLength: cannot get size for inode for fid "
-                       "%lu.%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
-                       afs_printable_uint32_lu(vp->hashid),
+           ViceLog(0, ("CheckLength: cannot get size for inode for fid %"
+                       AFS_VOLID_FMT ".%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
+                       afs_printable_VolumeId_lu(vp->hashid),
                        afs_printable_uint32_lu(Vn_id(vnp)),
                        afs_printable_uint32_lu(vnp->disk.uniquifier),
                        alen64));
@@ -306,9 +306,9 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
 
     if (alen != vlen) {
        afs_int64 alen64 = alen, vlen64 = vlen;
-       ViceLog(0, ("Fid %lu.%lu.%lu has inconsistent length (index "
+       ViceLog(0, ("Fid %" AFS_VOLID_FMT ".%lu.%lu has inconsistent length (index "
                    "%lld inode %lld ); volume must be salvaged\n",
-                   afs_printable_uint32_lu(vp->hashid),
+                   afs_printable_VolumeId_lu(vp->hashid),
                    afs_printable_uint32_lu(Vn_id(vnp)),
                    afs_printable_uint32_lu(vnp->disk.uniquifier),
                    vlen64, alen64));
@@ -317,23 +317,48 @@ CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
     return 0;
 }
 
+static void
+LogClientError(const char *message, struct rx_connection *tcon, afs_int32 viceid, struct AFSFid *Fid)
+{
+    char hoststr[16];
+    if (Fid) {
+       ViceLog(0, ("%s while handling request from host %s:%d viceid %d "
+                   "fid %" AFS_VOLID_FMT ".%lu.%lu, failing request\n",
+                   message,
+                   afs_inet_ntoa_r(rx_HostOf(rx_PeerOf(tcon)), hoststr),
+                   (int)ntohs(rx_PortOf(rx_PeerOf(tcon))),
+                   viceid,
+                   afs_printable_VolumeId_lu(Fid->Volume),
+                   afs_printable_uint32_lu(Fid->Vnode),
+                   afs_printable_uint32_lu(Fid->Unique)));
+    } else {
+       ViceLog(0, ("%s while handling request from host %s:%d viceid %d "
+                   "fid (none), failing request\n",
+                   message,
+                   afs_inet_ntoa_r(rx_HostOf(rx_PeerOf(tcon)), hoststr),
+                   (int)ntohs(rx_PortOf(rx_PeerOf(tcon))),
+                   viceid));
+    }
+}
+
 /*
  * Note that this function always returns a held host, so
  * that CallPostamble can block without the host's disappearing.
  * Call returns rx connection in passed in *tconn
+ *
+ * 'Fid' is optional, and is just used for printing log messages.
  */
 static int
-CallPreamble(struct rx_call *acall, int activecall,
+CallPreamble(struct rx_call *acall, int activecall, struct AFSFid *Fid,
             struct rx_connection **tconn, struct host **ahostp)
 {
     struct host *thost;
     struct client *tclient;
+    afs_int32 viceid = -1;
     int retry_flag = 1;
     int code = 0;
     char hoststr[16], hoststr2[16];
-#ifdef AFS_PTHREAD_ENV
     struct ubik_client *uclient;
-#endif
     *ahostp = NULL;
 
     if (!tconn) {
@@ -344,10 +369,10 @@ CallPreamble(struct rx_call *acall, int activecall,
 
     H_LOCK;
   retry:
-    tclient = h_FindClient_r(*tconn);
+    tclient = h_FindClient_r(*tconn, &viceid);
     if (!tclient) {
-       ViceLog(0, ("CallPreamble: Couldn't get CPS. Too many lockers\n"));
        H_UNLOCK;
+       LogClientError("Client host too busy", *tconn, viceid, Fid);
        return VBUSY;
     }
     thost = tclient->host;
@@ -355,8 +380,8 @@ CallPreamble(struct rx_call *acall, int activecall,
        if (!retry_flag) {
            h_ReleaseClient_r(tclient);
            h_Release_r(thost);
-           ViceLog(0, ("CallPreamble: Couldn't get CPS. Fail\n"));
            H_UNLOCK;
+           LogClientError("Cannot get CPS for client", *tconn, viceid, Fid);
            return -1001;
        }
        retry_flag = 0;         /* Retry once */
@@ -364,7 +389,6 @@ CallPreamble(struct rx_call *acall, int activecall,
        /* Take down the old connection and re-read the key file */
        ViceLog(0,
                ("CallPreamble: Couldn't get CPS. Reconnect to ptserver\n"));
-#ifdef AFS_PTHREAD_ENV
        uclient = (struct ubik_client *)pthread_getspecific(viced_uclient_key);
 
        /* Is it still necessary to drop this? We hit the net, we should... */
@@ -376,16 +400,15 @@ CallPreamble(struct rx_call *acall, int activecall,
        code = hpr_Initialize(&uclient);
 
        if (!code)
-           osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
+           opr_Verify(pthread_setspecific(viced_uclient_key,
+                                          (void *)uclient) == 0);
        H_LOCK;
-#else
-       code = pr_Initialize(2, AFSDIR_SERVER_ETC_DIRPATH, 0);
-#endif
+
        if (code) {
            h_ReleaseClient_r(tclient);
            h_Release_r(thost);
            H_UNLOCK;
-           ViceLog(0, ("CallPreamble: couldn't reconnect to ptserver\n"));
+           LogClientError("Cannot reconnect to ptserver", *tconn, viceid, Fid);
            return -1001;
        }
 
@@ -395,7 +418,7 @@ CallPreamble(struct rx_call *acall, int activecall,
        goto retry;
     }
 
-    tclient->LastCall = thost->LastCall = FT_ApproxTime();
+    tclient->LastCall = thost->LastCall = time(NULL);
     if (activecall)            /* For all but "GetTime", "GetStats", and "GetCaps" calls */
        thost->ActiveCall = thost->LastCall;
 
@@ -454,7 +477,7 @@ CallPostamble(struct rx_connection *aconn, afs_int32 ret,
     int translate = 0;
 
     H_LOCK;
-    tclient = h_FindClient_r(aconn);
+    tclient = h_FindClient_r(aconn, NULL);
     if (!tclient)
        goto busyout;
     thost = tclient->host;
@@ -520,18 +543,14 @@ CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
                VRESTARTING
 #endif
                ;
-#ifdef AFS_PTHREAD_ENV
            static const struct timespec timeout_ts = { 0, 0 };
            static const struct timespec * const ts = &timeout_ts;
-#else
-           static const struct timespec * const ts = NULL;
-#endif
 
            errorCode = 0;
            *volptr = VGetVolumeWithCall(&local_errorCode, &errorCode,
                                               fid->Volume, ts, cbv);
            if (!errorCode) {
-               osi_Assert(*volptr);
+               opr_Assert(*volptr);
                break;
            }
            if ((errorCode == VOFFLINE) && (VInit < 2)) {
@@ -584,7 +603,7 @@ CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
                if (restartedat.tv_sec == 0) {
                    /* I'm not really worried about when we restarted, I'm   */
                    /* just worried about when the first VBUSY was returned. */
-                   FT_GetTimeOfDay(&restartedat, 0);
+                   gettimeofday(&restartedat, 0);
                    if (busyonrst) {
                        FS_LOCK;
                        afs_perfstats.fs_nBusies++;
@@ -593,7 +612,7 @@ CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
                    return (busyonrst ? VBUSY : restarting);
                } else {
                    struct timeval now;
-                   FT_GetTimeOfDay(&now, 0);
+                   gettimeofday(&now, 0);
                    if ((now.tv_sec - restartedat.tv_sec) < (11 * 60)) {
                        if (busyonrst) {
                            FS_LOCK;
@@ -624,7 +643,7 @@ CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
                return (errorCode);
        }
     }
-    osi_Assert(*volptr);
+    opr_Assert(*volptr);
 
     /* get the vnode  */
     *vptr = VGetVnode(&errorCode, *volptr, fid->Vnode, lock);
@@ -632,7 +651,7 @@ CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
        return (errorCode);
     if ((*vptr)->disk.uniquifier != fid->Unique) {
        VPutVnode(&fileCode, *vptr);
-       osi_Assert(fileCode == 0);
+       opr_Assert(fileCode == 0);
        *vptr = 0;
        return (VNOVNODE);      /* return the right error code, at least */
     }
@@ -662,7 +681,7 @@ SetAccessList(Vnode ** targetptr, Volume ** volume,
        *ACLSize = VAclSize(*targetptr);
        return (0);
     } else {
-       osi_Assert(Fid != 0);
+       opr_Assert(Fid != 0);
        while (1) {
            VnodeId parentvnode;
            Error errorCode = 0;
@@ -729,9 +748,6 @@ GetRights(struct client *client, struct acl_accessList *ACL,
 {
     extern prlist SystemAnyUserCPS;
     afs_int32 hrights = 0;
-#ifndef AFS_PTHREAD_ENV
-    int code;
-#endif
 
     if (acl_CheckRights(ACL, &SystemAnyUserCPS, anyrights) != 0) {
        ViceLog(0, ("CheckRights failed\n"));
@@ -745,13 +761,7 @@ GetRights(struct client *client, struct acl_accessList *ACL,
     H_LOCK;
     while (client->host->hostFlags & HCPS_INPROGRESS) {
        client->host->hostFlags |= HCPS_WAITING;        /* I am waiting */
-#ifdef AFS_PTHREAD_ENV
-       CV_WAIT(&client->host->cond, &host_glock_mutex);
-#else /* AFS_PTHREAD_ENV */
-       if ((code =
-            LWP_WaitProcess(&(client->host->hostFlags))) != LWP_SUCCESS)
-           ViceLog(0, ("LWP_WaitProcess returned %d\n", code));
-#endif /* AFS_PTHREAD_ENV */
+       opr_cv_wait(&client->host->cond, &host_glock_mutex);
     }
 
     if (!client->host->hcps.prlist_len || !client->host->hcps.prlist_val) {
@@ -789,111 +799,187 @@ VanillaUser(struct client *client)
 }                              /*VanillaUser */
 
 
-/*
- * This unusual afs_int32-parameter routine encapsulates all volume package related
- * operations together in a single function; it's called by almost all AFS
- * interface calls.
- */
+/*------------------------------------------------------------------------
+ * GetVolumePackageWithCall
+ *
+ * Description:
+ *      This unusual afs_int32-parameter routine encapsulates all volume
+ *      package related operations together in a single function; it's
+ *      called by almost all AFS interface calls.
+ *
+ * Arguments:
+ *      acall               : Ptr to Rx call on which this request came in.
+ *      cbv                 : struct containing the RX call for offline cancels
+ *      Fid                 : the AFS fid the caller is acting on
+ *      volptr              : returns a pointer to the volume struct
+ *      targetptr           : returns a pointer to the vnode struct
+ *      chkforDir           : whether to check for if vnode is a dir
+ *      parent              : returns a pointer to the parent of this vnode
+ *      client              : returns a pointer to the calling client
+ *      locktype            : indicates what kind of lock to take on vnodes
+ *      rights              : returns a pointer to caller's rights
+ *      anyrights           : returns a pointer to anonymous' rights
+ *      remote             : indicates that the volume is a remote RW replica
+ *
+ * Returns:
+ *      0 on success
+ *      appropriate error based on permission or invalid operation.
+ *
+ * Environment:
+ *      Nothing interesting.
+ *
+ * Side Effects:
+ *      On success, disables keepalives on the call. Caller should re-enable
+ *      after completing disk I/O.
+ *------------------------------------------------------------------------*/
 static afs_int32
-GetVolumePackageWithCall(struct rx_connection *tcon, struct VCallByVol *cbv,
+GetVolumePackageWithCall(struct rx_call *acall, struct VCallByVol *cbv,
                          AFSFid * Fid, Volume ** volptr, Vnode ** targetptr,
-                         int chkforDir, Vnode ** parent, struct client **client,
-                         int locktype, afs_int32 * rights, afs_int32 * anyrights)
+                         int chkforDir, Vnode ** parent,
+                        struct client **client, int locktype,
+                        afs_int32 * rights, afs_int32 * anyrights, int remote)
 {
-    struct acl_accessList *aCL;        /* Internal access List */
+    struct acl_accessList *aCL = NULL; /* Internal access List */
     int aCLSize;               /* size of the access list */
     Error errorCode = 0;               /* return code to caller */
+    struct rx_connection *tcon = rx_ConnectionOf(acall);
+
+    rx_KeepAliveOff(acall);
 
     if ((errorCode = CheckVnodeWithCall(Fid, volptr, cbv, targetptr, locktype)))
-       return (errorCode);
+       goto gvpdone;
+
     if (chkforDir) {
        if (chkforDir == MustNOTBeDIR
-           && ((*targetptr)->disk.type == vDirectory))
-           return (EISDIR);
+           && ((*targetptr)->disk.type == vDirectory)) {
+           errorCode = EISDIR;
+           goto gvpdone;
+       }
        else if (chkforDir == MustBeDIR
-                && ((*targetptr)->disk.type != vDirectory))
-           return (ENOTDIR);
-    }
-    if ((errorCode =
-        SetAccessList(targetptr, volptr, &aCL, &aCLSize, parent,
-                      (chkforDir == MustBeDIR ? (AFSFid *) 0 : Fid),
-                      (chkforDir == MustBeDIR ? 0 : locktype))) != 0)
-       return (errorCode);
-    if (chkforDir == MustBeDIR)
-       osi_Assert((*parent) == 0);
-    if (!(*client)) {
-       if ((errorCode = GetClient(tcon, client)) != 0)
-           return (errorCode);
-       if (!(*client))
-           return (EINVAL);
-    }
-    GetRights(*client, aCL, rights, anyrights);
-    /* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
-    if ((*targetptr)->disk.type != vDirectory) {
-       /* anyuser can't be owner, so only have to worry about rights, not anyrights */
-       if ((*targetptr)->disk.owner == (*client)->ViceId)
-           (*rights) |= PRSFS_ADMINISTER;
-       else
-           (*rights) &= ~PRSFS_ADMINISTER;
+                && ((*targetptr)->disk.type != vDirectory)) {
+           errorCode = ENOTDIR;
+           goto gvpdone;
+       }
     }
+    /*
+     * If the remote flag is set, the current call is dealing with a remote RW
+     * replica, and it can be assumed that the appropriate access checks were
+     * done by the calling server hosting the master volume.
+     */
+    if (!remote) {
+       if ((errorCode = SetAccessList(targetptr, volptr, &aCL, &aCLSize, parent,
+               (chkforDir == MustBeDIR ? (AFSFid *) 0 : Fid),
+               (chkforDir == MustBeDIR ? 0 : locktype))) != 0)
+           goto gvpdone;
+       if (chkforDir == MustBeDIR)
+           opr_Assert((*parent) == 0);
+       if (!(*client)) {
+           if ((errorCode = GetClient(tcon, client)) != 0)
+               goto gvpdone;
+           if (!(*client)) {
+               errorCode = EINVAL;
+               goto gvpdone;
+           }
+       }
+       GetRights(*client, aCL, rights, anyrights);
+       /* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
+       if ((*targetptr)->disk.type != vDirectory) {
+           /* anyuser can't be owner, so only have to worry about rights, not anyrights */
+           if ((*targetptr)->disk.owner == (*client)->ViceId)
+               (*rights) |= PRSFS_ADMINISTER;
+           else
+               (*rights) &= ~PRSFS_ADMINISTER;
+       }
 #ifdef ADMIN_IMPLICIT_LOOKUP
-    /* admins get automatic lookup on everything */
-    if (!VanillaUser(*client))
-       (*rights) |= PRSFS_LOOKUP;
+       /* admins get automatic lookup on everything */
+       if (!VanillaUser(*client))
+           (*rights) |= PRSFS_LOOKUP;
 #endif /* ADMIN_IMPLICIT_LOOKUP */
+    }
+gvpdone:
+    if (errorCode)
+       rx_KeepAliveOn(acall);
     return errorCode;
 
 }                              /*GetVolumePackage */
 
 static_inline afs_int32
-GetVolumePackage(struct rx_connection *tcon, AFSFid * Fid, Volume ** volptr,
+GetVolumePackage(struct rx_call *acall, AFSFid * Fid, Volume ** volptr,
                 Vnode ** targetptr, int chkforDir, Vnode ** parent,
                 struct client **client, int locktype, afs_int32 * rights,
                 afs_int32 * anyrights)
 {
-    return GetVolumePackageWithCall(tcon, NULL, Fid, volptr, targetptr,
+    return GetVolumePackageWithCall(acall, NULL, Fid, volptr, targetptr,
                                     chkforDir, parent, client, locktype,
-                                    rights, anyrights);
+                                    rights, anyrights, 0);
 }
 
 
-/*
- * This is the opposite of GetVolumePackage(), and is always used at the end of
- * AFS calls to put back all used vnodes and the volume in the proper order!
- */
+/*------------------------------------------------------------------------
+ * PutVolumePackageWithCall
+ *
+ * Description:
+ *      This is the opposite of GetVolumePackage(), and is always used at
+ *      the end of AFS calls to put back all used vnodes and the volume
+ *      in the proper order!
+ *
+ * Arguments:
+ *      acall               : Ptr to Rx call on which this request came in.
+ *      parentwhentargetnotdir : a pointer to the parent when the target isn't
+ *                            a directory vnode
+ *      targetptr           : a pointer to the vnode struct
+ *      parentptr           : a pointer to the parent of this vnode
+ *      volptr              : a pointer to the volume structure
+ *      client              : a pointer to the calling client
+ *      cbv                 : struct containing the RX call for offline cancels
+ *
+ * Returns:
+ *      Nothing
+ *
+ * Environment:
+ *      Nothing interesting.
+ *
+ * Side Effects:
+ *      Enables keepalives on the call.
+ *------------------------------------------------------------------------*/
 static void
-PutVolumePackageWithCall(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+PutVolumePackageWithCall(struct rx_call *acall, Vnode *
+                        parentwhentargetnotdir, Vnode * targetptr,
                          Vnode * parentptr, Volume * volptr,
                          struct client **client, struct VCallByVol *cbv)
 {
     Error fileCode = 0;                /* Error code returned by the volume package */
 
+    rx_KeepAliveOff(acall);
     if (parentwhentargetnotdir) {
        VPutVnode(&fileCode, parentwhentargetnotdir);
-       osi_Assert(!fileCode || (fileCode == VSALVAGE));
+       opr_Assert(!fileCode || (fileCode == VSALVAGE));
     }
     if (targetptr) {
        VPutVnode(&fileCode, targetptr);
-       osi_Assert(!fileCode || (fileCode == VSALVAGE));
+       opr_Assert(!fileCode || (fileCode == VSALVAGE));
     }
     if (parentptr) {
        VPutVnode(&fileCode, parentptr);
-       osi_Assert(!fileCode || (fileCode == VSALVAGE));
+       opr_Assert(!fileCode || (fileCode == VSALVAGE));
     }
     if (volptr) {
        VPutVolumeWithCall(volptr, cbv);
     }
+    rx_KeepAliveOn(acall);
+
     if (*client) {
        PutClient(client);
     }
 }                              /*PutVolumePackage */
 
 static_inline void
-PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
-                Vnode * parentptr, Volume * volptr, struct client **client)
+PutVolumePackage(struct rx_call *acall, Vnode * parentwhentargetnotdir,
+                Vnode * targetptr, Vnode * parentptr, Volume * volptr,
+                struct client **client)
 {
-    PutVolumePackageWithCall(parentwhentargetnotdir, targetptr, parentptr,
-                             volptr, client, NULL);
+    PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
+                            parentptr, volptr, client, NULL);
 }
 
 static int
@@ -1162,6 +1248,26 @@ RXStore_AccessList(Vnode * targetptr, struct AFSOpaque *AccessList)
 
 }                              /*RXStore_AccessList */
 
+static int
+CheckLink(Volume *volptr, FdHandle_t *fdP, const char *descr)
+{
+    int code;
+    afs_ino_str_t ino;
+
+    code = FDH_ISUNLINKED(fdP);
+    if (code < 0) {
+       ViceLog(0, ("CopyOnWrite: error fstating volume %u inode %s (%s), errno %d\n",
+                   V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr, errno));
+       return -1;
+    }
+    if (code) {
+       ViceLog(0, ("CopyOnWrite corruption prevention: detected zero nlink for "
+                   "volume %u inode %s (%s), forcing volume offline\n",
+                   V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr));
+       return -1;
+    }
+    return 0;
+}
 
 /* In our current implementation, each successive data store (new file
  * data version) creates a new inode. This function creates the new
@@ -1175,7 +1281,8 @@ RXStore_AccessList(Vnode * targetptr, struct AFSOpaque *AccessList)
 static int
 CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
 {
-    Inode ino, nearInode;
+    Inode ino;
+    Inode nearInode AFS_UNUSED;
     ssize_t rdlen;
     ssize_t wrlen;
     afs_fsize_t size;
@@ -1198,7 +1305,7 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
     if (size > len)
        size = len;
 
-    buff = (char *)malloc(COPYBUFFSIZE);
+    buff = malloc(COPYBUFFSIZE);
     if (buff == NULL) {
        return EIO;
     }
@@ -1207,16 +1314,16 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
     if (!VALID_INO(ino)) {
        free(buff);
        VTakeOffline(volptr);
-       ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                   volptr->hashid));
+       ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                   afs_printable_VolumeId_lu(volptr->hashid)));
        return EIO;
     }
     targFdP = IH_OPEN(targetptr->handle);
     if (targFdP == NULL) {
        rc = errno;
        ViceLog(0,
-               ("CopyOnWrite failed: Failed to open target vnode %u in volume %u (errno = %d)\n",
-                targetptr->vnodeNumber, V_id(volptr), rc));
+               ("CopyOnWrite failed: Failed to open target vnode %u in volume %" AFS_VOLID_FMT " (errno = %d)\n",
+                targetptr->vnodeNumber, afs_printable_VolumeId_lu(V_id(volptr)), rc));
        free(buff);
        VTakeOffline(volptr);
        return rc;
@@ -1231,15 +1338,29 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                  (int)targetptr->disk.dataVersion);
     if (!VALID_INO(ino)) {
        ViceLog(0,
-               ("CopyOnWrite failed: Partition %s that contains volume %u may be out of free inodes(errno = %d)\n",
-                volptr->partition->name, V_id(volptr), errno));
+               ("CopyOnWrite failed: Partition %s that contains volume %" AFS_VOLID_FMT " may be out of free inodes(errno = %d)\n",
+                volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr)), errno));
        FDH_CLOSE(targFdP);
        free(buff);
        return ENOSPC;
     }
     IH_INIT(newH, V_device(volptr), V_id(volptr), ino);
     newFdP = IH_OPEN(newH);
-    osi_Assert(newFdP != NULL);
+    opr_Assert(newFdP != NULL);
+
+    rc = CheckLink(volptr, targFdP, "source");
+    if (!rc) {
+       rc = CheckLink(volptr, newFdP, "dest");
+    }
+    if (rc) {
+       FDH_REALLYCLOSE(newFdP);
+       IH_RELEASE(newH);
+       FDH_REALLYCLOSE(targFdP);
+       IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
+       free(buff);
+       VTakeOffline(volptr);
+       return VSALVAGE;
+    }
 
     done = off;
     while (size > 0) {
@@ -1268,17 +1389,17 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
        if ((rdlen != length) || (wrlen != length)) {
            if ((wrlen < 0) && (errno == ENOSPC)) {     /* disk full */
                ViceLog(0,
-                       ("CopyOnWrite failed: Partition %s containing volume %u is full\n",
-                        volptr->partition->name, V_id(volptr)));
+                       ("CopyOnWrite failed: Partition %s containing volume %" AFS_VOLID_FMT " is full\n",
+                        volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr))));
                /* remove destination inode which was partially copied till now */
                FDH_REALLYCLOSE(newFdP);
                IH_RELEASE(newH);
                FDH_REALLYCLOSE(targFdP);
                rc = IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
-               if (!rc) {
+               if (rc) {
                    ViceLog(0,
-                           ("CopyOnWrite failed: error %u after i_dec on disk full, volume %u in partition %s needs salvage\n",
-                            rc, V_id(volptr), volptr->partition->name));
+                           ("CopyOnWrite failed: error %u after i_dec on disk full, volume %" AFS_VOLID_FMT " in partition %s needs salvage\n",
+                            rc, afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name));
                    VTakeOffline(volptr);
                }
                free(buff);
@@ -1289,8 +1410,8 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                 * time, just case to an unsigned int for printing */
 
                ViceLog(0,
-                       ("CopyOnWrite failed: volume %u in partition %s  (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
-                        V_id(volptr), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
+                       ("CopyOnWrite failed: volume %" AFS_VOLID_FMT " in partition %s  (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
+                        afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
                         (unsigned)wrlen, errno));
 #if defined(AFS_DEMAND_ATTACH_FS)
                ViceLog(0, ("CopyOnWrite failed: requesting salvage\n"));
@@ -1301,24 +1422,21 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
                FDH_REALLYCLOSE(newFdP);
                IH_RELEASE(newH);
                FDH_REALLYCLOSE(targFdP);
-               rc = IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
+               IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
                free(buff);
                VTakeOffline(volptr);
                return EIO;
            }
        }
-#ifndef AFS_PTHREAD_ENV
-       IOMGR_Poll();
-#endif /* !AFS_PTHREAD_ENV */
     }
     FDH_REALLYCLOSE(targFdP);
     rc = IH_DEC(V_linkHandle(volptr), VN_GET_INO(targetptr),
                V_parentId(volptr));
-    osi_Assert(!rc);
+    opr_Assert(!rc);
     IH_RELEASE(targetptr->handle);
 
     rc = FDH_SYNC(newFdP);
-    osi_Assert(rc == 0);
+    opr_Assert(rc == 0);
     FDH_CLOSE(newFdP);
     targetptr->handle = newH;
     VN_SET_INO(targetptr, ino);
@@ -1329,48 +1447,6 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
     return 0;                  /* success */
 }                              /*CopyOnWrite */
 
-static int
-CopyOnWrite2(FdHandle_t *targFdP, FdHandle_t *newFdP, afs_foff_t off,
-             afs_sfsize_t size)
-{
-    char *buff = malloc(COPYBUFFSIZE);
-    size_t length;
-    ssize_t rdlen;
-    ssize_t wrlen;
-    int rc = 0;
-    afs_foff_t done = off;
-
-    if (size > FDH_SIZE(targFdP) - off)
-       size = FDH_SIZE(targFdP) - off;
-
-    while (size > 0) {
-       if (size > COPYBUFFSIZE) {      /* more than a buffer */
-           length = COPYBUFFSIZE;
-           size -= COPYBUFFSIZE;
-       } else {
-           length = size;
-           size = 0;
-       }
-       rdlen = FDH_PREAD(targFdP, buff, length, done);
-       if (rdlen == length) {
-           wrlen = FDH_PWRITE(newFdP, buff, length, done);
-           done += rdlen;
-       }
-       else
-           wrlen = 0;
-
-       if ((rdlen != length) || (wrlen != length)) {
-           /* no error recovery, at the worst we'll have a "hole"
-            * in the file */
-           rc = 1;
-           break;
-       }
-    }
-    free(buff);
-    return rc;
-}
-
-
 /*
  * Common code to handle with removing the Name (file when it's called from
  * SAFS_RemoveFile() or an empty dir when called from SAFS_rmdir()) from a
@@ -1433,8 +1509,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
     if ((*targetptr)->disk.uniquifier != fileFid->Unique) {
        VTakeOffline(volptr);
        ViceLog(0,
-               ("Volume %u now offline, must be salvaged.\n",
-                volptr->hashid));
+               ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                afs_printable_VolumeId_lu(volptr->hashid)));
        errorCode = VSALVAGE;
        return errorCode;
     }
@@ -1465,8 +1541,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
                {
                    VTakeOffline(volptr);
                    ViceLog(0,
-                           ("Volume %u now offline, must be salvaged.\n",
-                            volptr->hashid));
+                           ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                            afs_printable_VolumeId_lu(volptr->hashid)));
                    return (EIO);
                }
                DT1++;
@@ -1491,8 +1567,8 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
                   Directory) ? "directory" : "file")));
        VTakeOffline(volptr);
        ViceLog(0,
-               ("Volume %u now offline, must be salvaged.\n",
-                volptr->hashid));
+               ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                afs_printable_VolumeId_lu(volptr->hashid)));
        if (!errorCode)
            errorCode = code;
     }
@@ -1511,20 +1587,15 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
  */
 static void
 Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
-                        int author, int linkcount,
-#if FS_STATS_DETAILED
-                        char a_inSameNetwork
-#endif                         /* FS_STATS_DETAILED */
-    )
+                        int author, int linkcount, char a_inSameNetwork)
 {
     afs_fsize_t newlength;     /* Holds new directory length */
     afs_fsize_t parentLength;
     Error errorCode;
-#if FS_STATS_DETAILED
     Date currDate;             /*Current date */
     int writeIdx;              /*Write index to bump */
     int timeIdx;               /*Authorship time index to bump */
-#endif /* FS_STATS_DETAILED */
+    time_t now;
 
     parentptr->disk.dataVersion++;
     newlength = (afs_fsize_t) afs_dir_Length(dir);
@@ -1542,7 +1613,6 @@ Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
     }
     VN_SET_LEN(parentptr, newlength);
 
-#if FS_STATS_DETAILED
     /*
      * Update directory write stats for this volume.  Note that the auth
      * counter is located immediately after its associated ``distance''
@@ -1562,7 +1632,8 @@ Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
      * directory operation.  Get the current time, decide to which time
      * slot this operation belongs, and bump the appropriate slot.
      */
-    currDate = (FT_ApproxTime() - parentptr->disk.unixModifyTime);
+    now = time(NULL);
+    currDate = (now - parentptr->disk.unixModifyTime);
     timeIdx =
        (currDate < VOL_STATS_TIME_CAP_0 ? VOL_STATS_TIME_IDX_0 : currDate <
         VOL_STATS_TIME_CAP_1 ? VOL_STATS_TIME_IDX_1 : currDate <
@@ -1574,12 +1645,11 @@ Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
     } else {
        V_stat_dirDiffAuthor(volptr, timeIdx)++;
     }
-#endif /* FS_STATS_DETAILED */
 
     parentptr->disk.author = author;
     parentptr->disk.linkCount = linkcount;
-    parentptr->disk.unixModifyTime = FT_ApproxTime();  /* This should be set from CLIENT!! */
-    parentptr->disk.serverModifyTime = FT_ApproxTime();
+    parentptr->disk.unixModifyTime = now;      /* This should be set from CLIENT!! */
+    parentptr->disk.serverModifyTime = now;
     parentptr->changed_newTime = 1;    /* vnode changed, write it back. */
 }
 
@@ -1588,6 +1658,8 @@ Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
  * Update the target file's (or dir's) status block after the specified
  * operation is complete. Note that some other fields maybe updated by
  * the individual module.
+ * If remote is set, the volume is a RW replica and access checks can
+ * be skipped.
  */
 
 /* XXX INCOMPLETE - More attention is needed here! */
@@ -1595,13 +1667,11 @@ static void
 Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
                         struct client *client, AFSStoreStatus * InStatus,
                         Vnode * parentptr, Volume * volptr,
-                        afs_fsize_t length)
+                        afs_fsize_t length, int remote)
 {
-#if FS_STATS_DETAILED
     Date currDate;             /*Current date */
     int writeIdx;              /*Write index to bump */
     int timeIdx;               /*Authorship time index to bump */
-#endif /* FS_STATS_DETAILED */
 
     if (Caller & (TVS_CFILE | TVS_SLINK | TVS_MKDIR)) {        /* initialize new file */
        targetptr->disk.parent = parentptr->vnodeNumber;
@@ -1613,7 +1683,6 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
        targetptr->disk.linkCount = (Caller & TVS_MKDIR ? 2 : 1);
        /* the inode was created in Alloc_NewVnode() */
     }
-#if FS_STATS_DETAILED
     /*
      * Update file write stats for this volume.  Note that the auth
      * counter is located immediately after its associated ``distance''
@@ -1639,7 +1708,7 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
         * file operation.  Get the current time, decide to which time
         * slot this operation belongs, and bump the appropriate slot.
         */
-       currDate = (FT_ApproxTime() - targetptr->disk.unixModifyTime);
+       currDate = (time(NULL) - targetptr->disk.unixModifyTime);
        timeIdx =
            (currDate <
             VOL_STATS_TIME_CAP_0 ? VOL_STATS_TIME_IDX_0 : currDate <
@@ -1654,16 +1723,17 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
            V_stat_fileDiffAuthor(volptr, timeIdx)++;
        }
     }
-#endif /* FS_STATS_DETAILED */
 
     if (!(Caller & TVS_SSTATUS))
        targetptr->disk.author = client->ViceId;
     if (Caller & TVS_SDATA) {
        targetptr->disk.dataVersion++;
-       if (VanillaUser(client)) {
-           targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+       if (!remote && VanillaUser(client)) {
+           /* turn off suid */
+           targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
 #ifdef CREATE_SGUID_ADMIN_ONLY
-           targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+           /* turn off sgid */
+           targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
 #endif
        }
     }
@@ -1674,14 +1744,16 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
     } else {                   /* other: date always changes, but perhaps to what is specified by caller */
        targetptr->disk.unixModifyTime =
            (InStatus->Mask & AFS_SETMODTIME ? InStatus->
-            ClientModTime : FT_ApproxTime());
+            ClientModTime : time(NULL));
     }
     if (InStatus->Mask & AFS_SETOWNER) {
        /* admin is allowed to do chmod, chown as well as chown, chmod. */
-       if (VanillaUser(client)) {
-           targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+       if (!remote && VanillaUser(client)) {
+           /* turn off suid */
+           targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
 #ifdef CREATE_SGUID_ADMIN_ONLY
-           targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+           /* turn off sgid */
+           targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
 #endif
        }
        targetptr->disk.owner = InStatus->Owner;
@@ -1696,10 +1768,10 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
        int modebits = InStatus->UnixModeBits;
 #define        CREATE_SGUID_ADMIN_ONLY 1
 #ifdef CREATE_SGUID_ADMIN_ONLY
-       if (VanillaUser(client))
+       if (!remote && VanillaUser(client))
            modebits = modebits & 0777;
 #endif
-       if (VanillaUser(client)) {
+       if (!remote && VanillaUser(client)) {
            targetptr->disk.modeBits = modebits;
        } else {
            targetptr->disk.modeBits = modebits;
@@ -1718,7 +1790,7 @@ Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
            }
        }
     }
-    targetptr->disk.serverModifyTime = FT_ApproxTime();
+    targetptr->disk.serverModifyTime = time(NULL);
     if (InStatus->Mask & AFS_SETGROUP)
        targetptr->disk.group = InStatus->Group;
     /* vnode changed : to be written back by VPutVnode */
@@ -1739,7 +1811,7 @@ SetCallBackStruct(afs_uint32 CallBackTime, struct AFSCallBack *CallBack)
        ViceLog(0, ("WARNING: CallBackTime == 0!\n"));
        CallBack->ExpirationTime = 0;
     } else
-       CallBack->ExpirationTime = CallBackTime - FT_ApproxTime();
+       CallBack->ExpirationTime = CallBackTime - time(NULL);
     CallBack->CallBackVersion = CALLBACK_VERSION;
     CallBack->CallBackType = CB_SHARED;        /* The default for now */
 
@@ -1765,14 +1837,16 @@ AdjustDiskUsage(Volume * volptr, afs_sfsize_t length,
        VAdjustDiskUsage(&nc, volptr, -length, 0);
        if (rc == VOVERQUOTA) {
            ViceLog(2,
-                   ("Volume %u (%s) is full\n", V_id(volptr),
+                   ("Volume %" AFS_VOLID_FMT " (%s) is full\n",
+                    afs_printable_VolumeId_lu(V_id(volptr)),
                     V_name(volptr)));
            return (rc);
        }
        if (rc == VDISKFULL) {
            ViceLog(0,
-                   ("Partition %s that contains volume %u is full\n",
-                    volptr->partition->name, V_id(volptr)));
+                   ("Partition %s that contains volume %" AFS_VOLID_FMT " is full\n",
+                    volptr->partition->name,
+                    afs_printable_VolumeId_lu(V_id(volptr))));
            return (rc);
        }
        ViceLog(0, ("Got error return %d from VAdjustDiskUsage\n", rc));
@@ -1794,7 +1868,7 @@ Alloc_NewVnode(Vnode * parentptr, DirHandle * dir, Volume * volptr,
     Error errorCode = 0;               /* Error code returned back */
     Error temp;
     Inode inode = 0;
-    Inode nearInode;           /* hint for inode allocation in solaris */
+    Inode nearInode AFS_UNUSED;         /* hint for inode allocation in solaris */
     afs_ino_str_t stmp;
 
     if ((errorCode =
@@ -1812,7 +1886,7 @@ Alloc_NewVnode(Vnode * parentptr, DirHandle * dir, Volume * volptr,
        return VSALVAGE;
     }
 
-    *targetptr = VAllocVnode(&errorCode, volptr, FileType);
+    *targetptr = VAllocVnode(&errorCode, volptr, FileType, 0, 0);
     if (errorCode != 0) {
        VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
        return (errorCode);
@@ -1833,8 +1907,8 @@ Alloc_NewVnode(Vnode * parentptr, DirHandle * dir, Volume * volptr,
     /* error in creating inode */
     if (!VALID_INO(inode)) {
        ViceLog(0,
-               ("Volume : %u vnode = %u Failed to create inode: errno = %d\n",
-                (*targetptr)->volumePtr->header->diskstuff.id,
+               ("Volume : %" AFS_VOLID_FMT " vnode = %u Failed to create inode: errno = %d\n",
+                afs_printable_VolumeId_lu(V_id((*targetptr)->volumePtr)),
                 (*targetptr)->vnodeNumber, errno));
        VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
        (*targetptr)->delete = 1;       /* delete vnode */
@@ -1894,7 +1968,7 @@ HandleLocking(Vnode * targetptr, struct client *client, afs_int32 rights, ViceLo
     int writeVnode = targetptr->changed_oldTime;       /* save original status */
 
     targetptr->changed_oldTime = 1;    /* locking doesn't affect any time stamp */
-    Time = FT_ApproxTime();
+    Time = time(NULL);
     switch (LockingType) {
     case LockRead:
     case LockWrite:
@@ -1980,16 +2054,10 @@ RXUpdate_VolumeStatus(Volume * volptr, AFSStoreVolumeStatus * StoreVolStatus,
     if (strlen(Name) > 0) {
        strcpy(V_name(volptr), Name);
     }
-#if OPENAFS_VOL_STATS
     /*
      * We don't overwrite the motd field, since it's now being used
      * for stats
      */
-#else
-    if (strlen(Motd) > 0) {
-       strcpy(V_motd(volptr), Motd);
-    }
-#endif /* FS_STATS_DETAILED */
     VUpdateVolume(&errorCode, volptr);
     return (errorCode);
 
@@ -2000,7 +2068,6 @@ static afs_int32
 RXGetVolumeStatus(AFSFetchVolumeStatus * status, char **name, char **offMsg,
                  char **motd, Volume * volptr)
 {
-    int temp;
 
     status->Vid = V_id(volptr);
     status->ParentId = V_parentId(volptr);
@@ -2015,36 +2082,23 @@ RXGetVolumeStatus(AFSFetchVolumeStatus * status, char **name, char **offMsg,
     status->MinQuota = V_minquota(volptr);
     status->MaxQuota = V_maxquota(volptr);
     status->BlocksInUse = V_diskused(volptr);
-    status->PartBlocksAvail = RoundInt64ToInt32(volptr->partition->free);
-    status->PartMaxBlocks = RoundInt64ToInt32(volptr->partition->totalUsable);
+    status->PartBlocksAvail = RoundInt64ToInt31(volptr->partition->free);
+    status->PartMaxBlocks = RoundInt64ToInt31(volptr->partition->totalUsable);
 
     /* now allocate and copy these things; they're freed by the RXGEN stub */
-    temp = strlen(V_name(volptr)) + 1;
-    *name = malloc(temp);
+    *name = strdup(V_name(volptr));
     if (!*name) {
        ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
     }
-    strcpy(*name, V_name(volptr));
-    temp = strlen(V_offlineMessage(volptr)) + 1;
-    *offMsg = malloc(temp);
+    *offMsg = strdup(V_offlineMessage(volptr));
     if (!*offMsg) {
        ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
     }
-    strcpy(*offMsg, V_offlineMessage(volptr));
-#if OPENAFS_VOL_STATS
     *motd = malloc(1);
     if (!*motd) {
        ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
     }
     strcpy(*motd, nullString);
-#else
-    temp = strlen(V_motd(volptr)) + 1;
-    *motd = malloc(temp);
-    if (!*motd) {
-       ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
-    }
-    strcpy(*motd, V_motd(volptr));
-#endif /* OPENAFS_VOL_STATS */
     return 0;
 }                              /*RXGetVolumeStatus */
 
@@ -2152,6 +2206,8 @@ static
 GetStatus(Vnode * targetptr, AFSFetchStatus * status, afs_int32 rights,
          afs_int32 anyrights, Vnode * parentptr)
 {
+    int Time = time(NULL);
+
     /* initialize return status from a vnode  */
     status->InterfaceVersion = 1;
     status->SyncCounter = status->dataVersionHigh = status->lockCount =
@@ -2186,13 +2242,12 @@ GetStatus(Vnode * targetptr, AFSFetchStatus * status, afs_int32 rights,
         Directory ? targetptr->disk.uniquifier : parentptr->disk.uniquifier);
     status->ServerModTime = targetptr->disk.serverModifyTime;
     status->Group = targetptr->disk.group;
-    status->lockCount = targetptr->disk.lock.lockCount;
+    status->lockCount = Time > targetptr->disk.lock.lockTime ? 0 : targetptr->disk.lock.lockCount;
     status->errorCode = 0;
 
 }                              /*GetStatus */
 
-static
-  afs_int32
+static afs_int32
 common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
                   afs_sfsize_t Pos, afs_sfsize_t Len,
                   struct AFSFetchStatus *OutStatus,
@@ -2216,10 +2271,7 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
     struct fsstats fsstats;
     afs_sfsize_t bytesToXfer;  /* # bytes to xfer */
     afs_sfsize_t bytesXferred; /* # bytes actually xferred */
-
-#if FS_STATS_DETAILED
     int readIdx;               /* Index of read stats array to bump */
-#endif /* FS_STATS_DETAILED */
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHDATA);
 
@@ -2229,7 +2281,7 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
     FS_LOCK;
     AFSCallStats.FetchData++, AFSCallStats.TotalCalls++;
     FS_UNLOCK;
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_FetchData;
 
     /* Get ptr to client data for user Id for logging */
@@ -2249,14 +2301,13 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
      * it are also returned
      */
     if ((errorCode =
-        GetVolumePackageWithCall(tcon, cbv, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackageWithCall(acall, cbv, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, READ_LOCK,
-                         &rights, &anyrights)))
+                         &rights, &anyrights, 0)))
        goto Bad_FetchData;
 
     SetVolumeSync(Sync, volptr);
 
-#if FS_STATS_DETAILED
     /*
      * Remember that another read operation was performed.
      */
@@ -2270,7 +2321,6 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
        V_stat_reads(volptr, readIdx + 1)++;
     }
     FS_UNLOCK;
-#endif /* FS_STATS_DETAILED */
     /* Check whether the caller has permission access to fetch the data */
     if ((errorCode =
         Check_PermissionRights(targetptr, client, rights, CHK_FETCHDATA, 0)))
@@ -2283,11 +2333,11 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
     if (parentwhentargetnotdir != NULL) {
        tparentwhentargetnotdir = *parentwhentargetnotdir;
        VPutVnode(&fileCode, parentwhentargetnotdir);
-       osi_Assert(!fileCode || (fileCode == VSALVAGE));
+       opr_Assert(!fileCode || (fileCode == VSALVAGE));
        parentwhentargetnotdir = NULL;
     }
 
-    fsstats_StartXfer(&fsstats);
+    fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_FETCHDATA);
 
     /* actually do the data transfer */
     errorCode =
@@ -2304,6 +2354,8 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
     GetStatus(targetptr, OutStatus, rights, anyrights,
              &tparentwhentargetnotdir);
 
+    rx_KeepAliveOn(acall); /* I/O done */
+
     /* if a r/w volume, promise a callback to the caller */
     if (VolumeWriteable(volptr))
        SetCallBackStruct(AddCallBack(client->host, Fid), CallBack);
@@ -2316,7 +2368,7 @@ common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
 
   Bad_FetchData:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackageWithCall(parentwhentargetnotdir, targetptr,
+    (void)PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
                                    (Vnode *) 0, volptr, &client, cbv);
     ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
     errorCode = CallPostamble(tcon, errorCode, thost);
@@ -2381,7 +2433,7 @@ SRXAFS_FetchACL(struct rx_call * acall, struct AFSFid * Fid,
     FS_LOCK;
     AFSCallStats.FetchACL++, AFSCallStats.TotalCalls++;
     FS_UNLOCK;
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_FetchACL;
 
     /* Get ptr to client data for user Id for logging */
@@ -2403,7 +2455,7 @@ SRXAFS_FetchACL(struct rx_call * acall, struct AFSFid * Fid,
      * are also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, READ_LOCK,
                          &rights, &anyrights)))
        goto Bad_FetchACL;
@@ -2426,8 +2478,8 @@ SRXAFS_FetchACL(struct rx_call * acall, struct AFSFid * Fid,
 
   Bad_FetchACL:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     ViceLog(2,
            ("SAFS_FetchACL returns %d (ACL=%s)\n", errorCode,
             AccessList->AFSOpaque_val));
@@ -2447,8 +2499,7 @@ SRXAFS_FetchACL(struct rx_call * acall, struct AFSFid * Fid,
  * This routine is called exclusively by SRXAFS_FetchStatus(), and should be
  * merged into it when possible.
  */
-static
-  afs_int32
+static afs_int32
 SAFSS_FetchStatus(struct rx_call *acall, struct AFSFid *Fid,
                  struct AFSFetchStatus *OutStatus,
                  struct AFSCallBack *CallBack, struct AFSVolSync *Sync)
@@ -2478,11 +2529,13 @@ SAFSS_FetchStatus(struct rx_call *acall, struct AFSFid *Fid,
      * also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, READ_LOCK,
                          &rights, &anyrights)))
        goto Bad_FetchStatus;
 
+    rx_KeepAliveOn(acall);
+
     /* set volume synchronization information */
     SetVolumeSync(Sync, volptr);
 
@@ -2513,8 +2566,8 @@ SAFSS_FetchStatus(struct rx_call *acall, struct AFSFid *Fid,
 
   Bad_FetchStatus:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     ViceLog(2, ("SAFS_FetchStatus returns %d\n", errorCode));
     return errorCode;
 
@@ -2553,33 +2606,35 @@ SRXAFS_BulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
     }
 
     /* allocate space for return output parameters */
-    OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
-       malloc(nfiles * sizeof(struct AFSFetchStatus));
+    OutStats->AFSBulkStats_val = malloc(nfiles * sizeof(struct AFSFetchStatus));
     if (!OutStats->AFSBulkStats_val) {
        ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
     }
     OutStats->AFSBulkStats_len = nfiles;
-    CallBacks->AFSCBs_val = (struct AFSCallBack *)
-       malloc(nfiles * sizeof(struct AFSCallBack));
+    CallBacks->AFSCBs_val = malloc(nfiles * sizeof(struct AFSCallBack));
     if (!CallBacks->AFSCBs_val) {
        ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
     }
     CallBacks->AFSCBs_len = nfiles;
 
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    tfid = Fids->AFSCBFids_val;
+
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, tfid, &tcon, &thost)))
        goto Bad_BulkStatus;
 
-    tfid = Fids->AFSCBFids_val;
     for (i = 0; i < nfiles; i++, tfid++) {
        /*
         * Get volume/vnode for the fetched file; caller's rights to it
         * are also returned
         */
        if ((errorCode =
-            GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+            GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
                              &parentwhentargetnotdir, &client, READ_LOCK,
                              &rights, &anyrights)))
            goto Bad_BulkStatus;
+
+       rx_KeepAliveOn(acall);
+
        /* set volume synchronization information, but only once per call */
        if (i == 0)
            SetVolumeSync(Sync, volptr);
@@ -2612,8 +2667,8 @@ SRXAFS_BulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
        }
 
        /* put back the file ID and volume */
-       (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                              volptr, &client);
+       (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                              (Vnode *) 0, volptr, &client);
        parentwhentargetnotdir = (Vnode *) 0;
        targetptr = (Vnode *) 0;
        volptr = (Volume *) 0;
@@ -2622,8 +2677,8 @@ SRXAFS_BulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
 
   Bad_BulkStatus:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     errorCode = CallPostamble(tcon, errorCode, thost);
 
     t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
@@ -2674,42 +2729,45 @@ SRXAFS_InlineBulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
     }
 
     /* allocate space for return output parameters */
-    OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
-       malloc(nfiles * sizeof(struct AFSFetchStatus));
+    OutStats->AFSBulkStats_val = calloc(nfiles, sizeof(struct AFSFetchStatus));
     if (!OutStats->AFSBulkStats_val) {
        ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
     }
     OutStats->AFSBulkStats_len = nfiles;
-    CallBacks->AFSCBs_val = (struct AFSCallBack *)
-       malloc(nfiles * sizeof(struct AFSCallBack));
+    CallBacks->AFSCBs_val = calloc(nfiles, sizeof(struct AFSCallBack));
     if (!CallBacks->AFSCBs_val) {
        ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
     }
     CallBacks->AFSCBs_len = nfiles;
 
     /* Zero out return values to avoid leaking information on partial succes */
-    memset(OutStats->AFSBulkStats_val, 0, nfiles * sizeof(struct AFSFetchStatus));
-    memset(CallBacks->AFSCBs_val, 0, nfiles * sizeof(struct AFSCallBack));
     memset(Sync, 0, sizeof(*Sync));
 
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))) {
+    tfid = Fids->AFSCBFids_val;
+
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, tfid, &tcon, &thost))) {
        goto Bad_InlineBulkStatus;
     }
 
-    tfid = Fids->AFSCBFids_val;
     for (i = 0; i < nfiles; i++, tfid++) {
        /*
         * Get volume/vnode for the fetched file; caller's rights to it
         * are also returned
         */
        if ((errorCode =
-            GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+            GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
                              &parentwhentargetnotdir, &client, READ_LOCK,
                              &rights, &anyrights))) {
            tstatus = &OutStats->AFSBulkStats_val[i];
-           tstatus->errorCode = errorCode;
-           PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                            volptr, &client);
+
+           if (thost->hostFlags & HERRORTRANS) {
+               tstatus->errorCode = sys_error_to_et(errorCode);
+           } else {
+               tstatus->errorCode = errorCode;
+           }
+
+           PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                            (Vnode *) 0, volptr, &client);
            parentwhentargetnotdir = (Vnode *) 0;
            targetptr = (Vnode *) 0;
            volptr = (Volume *) 0;
@@ -2717,6 +2775,8 @@ SRXAFS_InlineBulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
            continue;
        }
 
+       rx_KeepAliveOn(acall);
+
        /* set volume synchronization information, but only once per call */
        if (!VolSync_set) {
            SetVolumeSync(Sync, volptr);
@@ -2729,9 +2789,16 @@ SRXAFS_InlineBulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
                 Check_PermissionRights(targetptr, client, rights,
                                        CHK_FETCHSTATUS, 0))) {
                tstatus = &OutStats->AFSBulkStats_val[i];
-               tstatus->errorCode = errorCode;
-               (void)PutVolumePackage(parentwhentargetnotdir, targetptr,
-                                      (Vnode *) 0, volptr, &client);
+
+               if (thost->hostFlags & HERRORTRANS) {
+                   tstatus->errorCode = sys_error_to_et(errorCode);
+               } else {
+                   tstatus->errorCode = errorCode;
+               }
+
+               (void)PutVolumePackage(acall, parentwhentargetnotdir,
+                                      targetptr, (Vnode *) 0, volptr,
+                                      &client);
                parentwhentargetnotdir = (Vnode *) 0;
                targetptr = (Vnode *) 0;
                volptr = (Volume *) 0;
@@ -2758,18 +2825,19 @@ SRXAFS_InlineBulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
        }
 
        /* put back the file ID and volume */
-       (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                              volptr, &client);
+       (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                              (Vnode *) 0, volptr, &client);
        parentwhentargetnotdir = (Vnode *) 0;
        targetptr = (Vnode *) 0;
        volptr = (Volume *) 0;
        client = (struct client *)0;
     }
+    errorCode = 0;
 
   Bad_InlineBulkStatus:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     errorCode = CallPostamble(tcon, errorCode, thost);
 
     t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
@@ -2781,7 +2849,7 @@ SRXAFS_InlineBulkStatus(struct rx_call * acall, struct AFSCBFids * Fids,
     osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
                AUD_ID, t_client ? t_client->ViceId : 0,
                AUD_FIDS, Fids, AUD_END);
-    return 0;
+    return errorCode;
 
 }                              /*SRXAFS_InlineBulkStatus */
 
@@ -2799,7 +2867,7 @@ SRXAFS_FetchStatus(struct rx_call * acall, struct AFSFid * Fid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHSTATUS);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_FetchStatus;
 
     code = SAFSS_FetchStatus(acall, Fid, OutStatus, CallBack, Sync);
@@ -2851,7 +2919,7 @@ common_StoreData64(struct rx_call *acall, struct AFSFid *Fid,
     FS_LOCK;
     AFSCallStats.StoreData++, AFSCallStats.TotalCalls++;
     FS_UNLOCK;
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_StoreData;
 
     /* Get ptr to client data for user Id for logging */
@@ -2867,16 +2935,18 @@ common_StoreData64(struct rx_call *acall, struct AFSFid *Fid,
      * are also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, MustNOTBeDIR,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, MustNOTBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_StoreData;
     }
 
+    rx_KeepAliveOn(acall);
+
     /* set volume synchronization information */
     SetVolumeSync(Sync, volptr);
 
-    if ((targetptr->disk.type == vSymlink)) {
+    if (targetptr->disk.type == vSymlink) {
        /* Should we return a better error code here??? */
        errorCode = EISDIR;
        goto Bad_StoreData;
@@ -2895,12 +2965,14 @@ common_StoreData64(struct rx_call *acall, struct AFSFid *Fid,
      */
     if (parentwhentargetnotdir != NULL) {
        tparentwhentargetnotdir = *parentwhentargetnotdir;
+       rx_KeepAliveOff(acall);
        VPutVnode(&fileCode, parentwhentargetnotdir);
-       osi_Assert(!fileCode || (fileCode == VSALVAGE));
+       rx_KeepAliveOn(acall);
+       opr_Assert(!fileCode || (fileCode == VSALVAGE));
        parentwhentargetnotdir = NULL;
     }
 
-    fsstats_StartXfer(&fsstats);
+    fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_STOREDATA);
 
     errorCode =
        StoreData_RXStyle(volptr, targetptr, Fid, client, acall, Pos, Length,
@@ -2913,9 +2985,11 @@ common_StoreData64(struct rx_call *acall, struct AFSFid *Fid,
     if (errorCode && (!targetptr->changed_newTime))
        goto Bad_StoreData;
 
+    rx_KeepAliveOff(acall);
     /* Update the status of the target's vnode */
     Update_TargetVnodeStatus(targetptr, TVS_SDATA, client, InStatus,
-                            targetptr, volptr, 0);
+                            targetptr, volptr, 0, 0);
+    rx_KeepAliveOn(acall);
 
     /* Get the updated File's status back to the caller */
     GetStatus(targetptr, OutStatus, rights, anyrights,
@@ -2923,8 +2997,8 @@ common_StoreData64(struct rx_call *acall, struct AFSFid *Fid,
 
   Bad_StoreData:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     ViceLog(2, ("SAFS_StoreData        returns %d\n", errorCode));
 
     errorCode = CallPostamble(tcon, errorCode, thost);
@@ -2993,7 +3067,7 @@ SRXAFS_StoreACL(struct rx_call * acall, struct AFSFid * Fid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STOREACL);
 
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_StoreACL;
 
     /* Get ptr to client data for user Id for logging */
@@ -3013,7 +3087,7 @@ SRXAFS_StoreACL(struct rx_call * acall, struct AFSFid * Fid,
      * are also returned.
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, MustBeDIR,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_StoreACL;
@@ -3038,7 +3112,9 @@ SRXAFS_StoreACL(struct rx_call * acall, struct AFSFid * Fid,
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, targetptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
+
+    rx_KeepAliveOn(acall);
 
     /* break call backs on the directory  */
     BreakCallBack(client->host, Fid, 0);
@@ -3048,7 +3124,7 @@ SRXAFS_StoreACL(struct rx_call * acall, struct AFSFid * Fid,
 
   Bad_StoreACL:
     /* Update and store volume/vnode and parent vnodes back */
-    PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+    PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
                     volptr, &client);
     ViceLog(2, ("SAFS_StoreACL returns %d\n", errorCode));
     errorCode = CallPostamble(tcon, errorCode, thost);
@@ -3097,7 +3173,7 @@ SAFSS_StoreStatus(struct rx_call *acall, struct AFSFid *Fid,
      * also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_StoreStatus;
@@ -3124,11 +3200,13 @@ SAFSS_StoreStatus(struct rx_call *acall, struct AFSFid *Fid,
     /* Update the status of the target's vnode */
     Update_TargetVnodeStatus(targetptr, TVS_SSTATUS, client, InStatus,
                             (parentwhentargetnotdir ? parentwhentargetnotdir
-                             : targetptr), volptr, 0);
+                             : targetptr), volptr, 0, 0);
+
+    rx_KeepAliveOn(acall);
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, targetptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
 
     /* Break call backs on Fid */
     BreakCallBack(client->host, Fid, 0);
@@ -3139,7 +3217,7 @@ SAFSS_StoreStatus(struct rx_call *acall, struct AFSFid *Fid,
 
   Bad_StoreStatus:
     /* Update and store volume/vnode and parent vnodes back */
-    PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+    PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
                     volptr, &client);
     ViceLog(2, ("SAFS_StoreStatus returns %d\n", errorCode));
     return errorCode;
@@ -3161,7 +3239,7 @@ SRXAFS_StoreStatus(struct rx_call * acall, struct AFSFid * Fid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STORESTATUS);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_StoreStatus;
 
     code = SAFSS_StoreStatus(acall, Fid, InStatus, OutStatus, Sync);
@@ -3218,7 +3296,7 @@ SAFSS_RemoveFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_RemoveFile;
@@ -3239,14 +3317,11 @@ SAFSS_RemoveFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     }
 
     /* Update the vnode status of the parent dir */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
                             parentptr->disk.linkCount,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
-                            parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+
+    rx_KeepAliveOn(acall);
 
     /* Return the updated parent dir's status back to caller */
     GetStatus(parentptr, OutDirStatus, rights, anyrights, 0);
@@ -3257,14 +3332,14 @@ SAFSS_RemoveFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
        DeleteFileCallBacks(&fileFid);
        /* convert the parent lock to a read lock before breaking callbacks */
        VVnodeWriteToRead(&errorCode, parentptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
     } else {
        /* convert the parent lock to a read lock before breaking callbacks */
        VVnodeWriteToRead(&errorCode, parentptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
        /* convert the target lock to a read lock before breaking callbacks */
        VVnodeWriteToRead(&errorCode, targetptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
        /* tell all the file has changed */
        BreakCallBack(client->host, &fileFid, 1);
     }
@@ -3274,7 +3349,7 @@ SAFSS_RemoveFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
   Bad_RemoveFile:
     /* Update and store volume/vnode and parent vnodes back */
-    PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                     volptr, &client);
     FidZap(&dir);
     ViceLog(2, ("SAFS_RemoveFile returns %d\n", errorCode));
@@ -3296,7 +3371,7 @@ SRXAFS_RemoveFile(struct rx_call * acall, struct AFSFid * DirFid, char *Name,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEFILE);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_RemoveFile;
 
     code = SAFSS_RemoveFile(acall, DirFid, Name, OutDirStatus, Sync);
@@ -3361,7 +3436,7 @@ SAFSS_CreateFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * also returned
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_CreateFile;
@@ -3374,26 +3449,23 @@ SAFSS_CreateFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))) {
        goto Bad_CreateFile;
     }
+
     /* get a new vnode for the file to be created and set it up */
     if ((errorCode =
         Alloc_NewVnode(parentptr, &dir, volptr, &targetptr, Name, OutFid,
-                       vFile, nBlocks(0)))) {
+                       vFile, nBlocks(0))))
        goto Bad_CreateFile;
-    }
 
     /* update the status of the parent vnode */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
                             parentptr->disk.linkCount,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
-                            parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
 
     /* update the status of the new file's vnode */
     Update_TargetVnodeStatus(targetptr, TVS_CFILE, client, InStatus,
-                            parentptr, volptr, 0);
+                            parentptr, volptr, 0, 0);
+
+    rx_KeepAliveOn(acall);
 
     /* set up the return status for the parent dir and the newly created file, and since the newly created file is owned by the creator, give it PRSFS_ADMINISTER to tell the client its the owner of the file */
     GetStatus(targetptr, OutFidStatus, rights | PRSFS_ADMINISTER, anyrights, parentptr);
@@ -3401,7 +3473,7 @@ SAFSS_CreateFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, parentptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
 
     /* break call back on parent dir */
     BreakCallBack(client->host, DirFid, 0);
@@ -3411,7 +3483,7 @@ SAFSS_CreateFile(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
   Bad_CreateFile:
     /* Update and store volume/vnode and parent vnodes back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                           volptr, &client);
     FidZap(&dir);
     ViceLog(2, ("SAFS_CreateFile returns %d\n", errorCode));
@@ -3437,7 +3509,7 @@ SRXAFS_CreateFile(struct rx_call * acall, struct AFSFid * DirFid, char *Name,
 
     memset(OutFid, 0, sizeof(struct AFSFid));
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_CreateFile;
 
     code =
@@ -3533,7 +3605,7 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
 
     if (OldDirFid->Vnode <= NewDirFid->Vnode) {
        if ((errorCode =
-            GetVolumePackage(tcon, OldDirFid, &volptr, &oldvptr, MustBeDIR,
+            GetVolumePackage(acall, OldDirFid, &volptr, &oldvptr, MustBeDIR,
                              &parent, &client, WRITE_LOCK, &rights,
                              &anyrights))) {
            DFlush();
@@ -3544,7 +3616,7 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
            newrights = rights, newanyrights = anyrights;
        } else
            if ((errorCode =
-                GetVolumePackage(tcon, NewDirFid, &volptr, &newvptr,
+                GetVolumePackage(acall, NewDirFid, &volptr, &newvptr,
                                  MustBeDIR, &parent, &client, WRITE_LOCK,
                                  &newrights, &newanyrights))) {
            DFlush();
@@ -3552,14 +3624,14 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
        }
     } else {
        if ((errorCode =
-            GetVolumePackage(tcon, NewDirFid, &volptr, &newvptr, MustBeDIR,
+            GetVolumePackage(acall, NewDirFid, &volptr, &newvptr, MustBeDIR,
                              &parent, &client, WRITE_LOCK, &newrights,
                              &newanyrights))) {
            DFlush();
            goto Bad_Rename;
        }
        if ((errorCode =
-            GetVolumePackage(tcon, OldDirFid, &volptr, &oldvptr, MustBeDIR,
+            GetVolumePackage(acall, OldDirFid, &volptr, &oldvptr, MustBeDIR,
                              &parent, &client, WRITE_LOCK, &rights,
                              &anyrights))) {
            DFlush();
@@ -3728,18 +3800,18 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
            }
            if (testnode == 1) top = 1;
            testvptr = VGetVnode(&errorCode, volptr, testnode, READ_LOCK);
-           osi_Assert(errorCode == 0);
+           opr_Assert(errorCode == 0);
            testnode = testvptr->disk.parent;
            VPutVnode(&errorCode, testvptr);
            if ((top == 1) && (testnode != 0)) {
                VTakeOffline(volptr);
                ViceLog(0,
-                       ("Volume %u now offline, must be salvaged.\n",
-                        volptr->hashid));
+                       ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                        afs_printable_VolumeId_lu(volptr->hashid)));
                errorCode = EIO;
                goto Bad_Rename;
            }
-           osi_Assert(errorCode == 0);
+           opr_Assert(errorCode == 0);
        }
     }
 
@@ -3767,6 +3839,9 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
        ViceLog(25, ("Rename : calling CopyOnWrite on  target dir\n"));
        if ((errorCode = CopyOnWrite(fileptr, volptr, 0, MAXFSIZE)))
            goto Bad_Rename;
+       /* since copyonwrite would mean fileptr has a new handle, do it here */
+       FidZap(&filedir);
+       SetDirHandle(&filedir, fileptr);
     }
 
     /* If the new name exists already, delete it and the file it points to */
@@ -3774,7 +3849,7 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
     if (newfileptr) {
        /* Delete NewName from its directory */
        code = afs_dir_Delete(&newdir, NewName);
-       osi_Assert(code == 0);
+       opr_Assert(code == 0);
 
        /* Drop the link count */
        newfileptr->disk.linkCount--;
@@ -3821,20 +3896,13 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
        goto Bad_Rename;
 
     /* Delete the old name */
-    osi_Assert(afs_dir_Delete(&olddir, OldName) == 0);
+    opr_Assert(afs_dir_Delete(&olddir, OldName) == 0);
 
     /* if the directory length changes, reflect it in the statistics */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
                             oldvptr->disk.linkCount, client->InSameNetwork);
     Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
                             newvptr->disk.linkCount, client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
-                            oldvptr->disk.linkCount);
-    Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
-                            newvptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
 
     if (oldvptr == newvptr)
        oldvptr->disk.dataVersion--;    /* Since it was bumped by 2! */
@@ -3847,13 +3915,13 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
     /* if we are dealing with a rename of a directory, and we need to
      * update the .. entry of that directory */
     if (updatefile) {
-       osi_Assert(!fileptr->disk.cloned);
+       opr_Assert(!fileptr->disk.cloned);
 
        fileptr->changed_newTime = 1;   /* status change of moved file */
 
        /* fix .. to point to the correct place */
        afs_dir_Delete(&filedir, ".."); /* No assert--some directories may be bad */
-       osi_Assert(afs_dir_Create(&filedir, "..", NewDirFid) == 0);
+       opr_Assert(afs_dir_Create(&filedir, "..", NewDirFid) == 0);
        fileptr->disk.dataVersion++;
 
        /* if the parent directories are different the link counts have to be   */
@@ -3875,17 +3943,19 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
 
     /* convert the write locks to a read locks before breaking callbacks */
     VVnodeWriteToRead(&errorCode, newvptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
     if (oldvptr != newvptr) {
        VVnodeWriteToRead(&errorCode, oldvptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
     }
     if (newfileptr && !doDelete) {
        /* convert the write lock to a read lock before breaking callbacks */
        VVnodeWriteToRead(&errorCode, newfileptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
     }
 
+    rx_KeepAliveOn(acall);
+
     /* break call back on NewDirFid, OldDirFid, NewDirFid and newFileFid  */
     BreakCallBack(client->host, NewDirFid, 0);
     if (oldvptr != newvptr) {
@@ -3912,10 +3982,11 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
 
   Bad_Rename:
     if (newfileptr) {
+       rx_KeepAliveOff(acall);
        VPutVnode(&fileCode, newfileptr);
-       osi_Assert(fileCode == 0);
+       opr_Assert(fileCode == 0);
     }
-    (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
+    (void)PutVolumePackage(acall, fileptr, (newvptr && newvptr != oldvptr ?
                                     newvptr : 0), oldvptr, volptr, &client);
     FidZap(&olddir);
     FidZap(&newdir);
@@ -3942,7 +4013,7 @@ SRXAFS_Rename(struct rx_call * acall, struct AFSFid * OldDirFid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RENAME);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, OldDirFid, &tcon, &thost)))
        goto Bad_Rename;
 
     code =
@@ -4012,19 +4083,17 @@ SAFSS_Symlink(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
-                         &rights, &anyrights))) {
+                         &rights, &anyrights)))
        goto Bad_SymLink;
-    }
 
     /* set volume synchronization information */
     SetVolumeSync(Sync, volptr);
 
     /* Does the caller has insert (and write) access to the parent directory? */
-    if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))) {
+    if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT)))
        goto Bad_SymLink;
-    }
 
     /*
      * If we're creating a mount point (any x bits clear), we must have
@@ -4055,27 +4124,22 @@ SAFSS_Symlink(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     }
 
     /* update the status of the parent vnode */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
                             parentptr->disk.linkCount,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
-                            parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
 
     /* update the status of the new symbolic link file vnode */
     Update_TargetVnodeStatus(targetptr, TVS_SLINK, client, InStatus,
-                            parentptr, volptr, strlen((char *)LinkContents));
+                            parentptr, volptr, strlen((char *)LinkContents), 0);
 
     /* Write the contents of the symbolic link name into the target inode */
     fdP = IH_OPEN(targetptr->handle);
     if (fdP == NULL) {
-       (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
-                              volptr, &client);
+       (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                              parentptr, volptr, &client);
        VTakeOffline(volptr);
-       ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                   volptr->hashid));
+       ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                   afs_printable_VolumeId_lu(volptr->hashid)));
        return EIO;
     }
     len = strlen((char *) LinkContents);
@@ -4092,14 +4156,16 @@ SAFSS_Symlink(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, parentptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
+
+    rx_KeepAliveOn(acall);
 
     /* break call back on the parent dir */
     BreakCallBack(client->host, DirFid, 0);
 
   Bad_SymLink:
     /* Write the all modified vnodes (parent, new files) and volume back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                           volptr, &client);
     FidZap(&dir);
     ViceLog(2, ("SAFS_Symlink returns %d\n", errorCode));
@@ -4127,7 +4193,7 @@ SRXAFS_Symlink(struct rx_call *acall,     /* Rx call */
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SYMLINK);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_Symlink;
 
     code =
@@ -4198,7 +4264,7 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_Link;
@@ -4229,6 +4295,7 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
         CheckVnode(ExistingFid, &volptr, &targetptr, WRITE_LOCK))) {
        goto Bad_Link;
     }
+
     if (targetptr->disk.type != vFile) {
        errorCode = EISDIR;
        goto Bad_Link;
@@ -4251,14 +4318,9 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* update the status in the parent vnode */
     /**WARNING** --> disk.author SHOULDN'T be modified???? */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
                             parentptr->disk.linkCount,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
-                            parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
 
     targetptr->disk.linkCount++;
     targetptr->disk.author = client->ViceId;
@@ -4270,9 +4332,11 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* convert the write locks to read locks before breaking callbacks */
     VVnodeWriteToRead(&errorCode, targetptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
     VVnodeWriteToRead(&errorCode, parentptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
+
+    rx_KeepAliveOn(acall);
 
     /* break call back on DirFid */
     BreakCallBack(client->host, DirFid, 0);
@@ -4284,7 +4348,7 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
   Bad_Link:
     /* Write the all modified vnodes (parent, new files) and volume back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                           volptr, &client);
     FidZap(&dir);
     ViceLog(2, ("SAFS_Link returns %d\n", errorCode));
@@ -4306,7 +4370,7 @@ SRXAFS_Link(struct rx_call * acall, struct AFSFid * DirFid, char *Name,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_LINK);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_Link;
 
     code =
@@ -4378,7 +4442,7 @@ SAFSS_MakeDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * rights to it.
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_MakeDir;
@@ -4412,29 +4476,24 @@ SAFSS_MakeDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     }
 
     /* Update the status for the parent dir */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
                             parentptr->disk.linkCount + 1,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
-                            parentptr->disk.linkCount + 1);
-#endif /* FS_STATS_DETAILED */
 
     /* Point to target's ACL buffer and copy the parent's ACL contents to it */
-    osi_Assert((SetAccessList
-           (&targetptr, &volptr, &newACL, &newACLSize,
-            &parentwhentargetnotdir, (AFSFid *) 0, 0)) == 0);
-    osi_Assert(parentwhentargetnotdir == 0);
+    opr_Verify((SetAccessList(&targetptr, &volptr, &newACL, &newACLSize,
+                             &parentwhentargetnotdir, NULL, 0))  == 0);
+    opr_Assert(parentwhentargetnotdir == 0);
     memcpy((char *)newACL, (char *)VVnodeACL(parentptr), VAclSize(parentptr));
 
     /* update the status for the target vnode */
     Update_TargetVnodeStatus(targetptr, TVS_MKDIR, client, InStatus,
-                            parentptr, volptr, 0);
+                            parentptr, volptr, 0, 0);
 
     /* Actually create the New directory in the directory package */
     SetDirHandle(&dir, targetptr);
-    osi_Assert(!(afs_dir_MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
+    opr_Verify(!(afs_dir_MakeDir(&dir, (afs_int32 *)OutFid,
+                                (afs_int32 *)DirFid)));
     DFlush();
     VN_SET_LEN(targetptr, (afs_fsize_t) afs_dir_Length(&dir));
 
@@ -4444,7 +4503,9 @@ SAFSS_MakeDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, parentptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
+
+    rx_KeepAliveOn(acall);
 
     /* break call back on DirFid */
     BreakCallBack(client->host, DirFid, 0);
@@ -4454,7 +4515,7 @@ SAFSS_MakeDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
   Bad_MakeDir:
     /* Write the all modified vnodes (parent, new files) and volume back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                           volptr, &client);
     FidZap(&dir);
     FidZap(&parentdir);
@@ -4479,7 +4540,7 @@ SRXAFS_MakeDir(struct rx_call * acall, struct AFSFid * DirFid, char *Name,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_MAKEDIR);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_MakeDir;
 
     code =
@@ -4540,7 +4601,7 @@ SAFSS_RemoveDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+        GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_RemoveDir;
@@ -4562,14 +4623,9 @@ SAFSS_RemoveDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     }
 
     /* Update the status for the parent dir; link count is also adjusted */
-#if FS_STATS_DETAILED
     Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
                             parentptr->disk.linkCount - 1,
                             client->InSameNetwork);
-#else
-    Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
-                            parentptr->disk.linkCount - 1);
-#endif /* FS_STATS_DETAILED */
 
     /* Return to the caller the updated parent dir status */
     GetStatus(parentptr, OutDirStatus, rights, anyrights, NULL);
@@ -4583,14 +4639,16 @@ SAFSS_RemoveDir(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
 
     /* convert the write lock to a read lock before breaking callbacks */
     VVnodeWriteToRead(&errorCode, parentptr);
-    osi_Assert(!errorCode || errorCode == VSALVAGE);
+    opr_Assert(!errorCode || errorCode == VSALVAGE);
+
+    rx_KeepAliveOn(acall);
 
     /* break call back on DirFid and fileFid */
     BreakCallBack(client->host, DirFid, 0);
 
   Bad_RemoveDir:
     /* Write the all modified vnodes (parent, new files) and volume back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
                           volptr, &client);
     FidZap(&dir);
     ViceLog(2, ("SAFS_RemoveDir        returns %d\n", errorCode));
@@ -4612,7 +4670,7 @@ SRXAFS_RemoveDir(struct rx_call * acall, struct AFSFid * DirFid, char *Name,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEDIR);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
        goto Bad_RemoveDir;
 
     code = SAFSS_RemoveDir(acall, DirFid, Name, OutDirStatus, Sync);
@@ -4670,7 +4728,7 @@ SAFSS_SetLock(struct rx_call *acall, struct AFSFid *Fid, ViceLockType type,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_SetLock;
@@ -4684,8 +4742,8 @@ SAFSS_SetLock(struct rx_call *acall, struct AFSFid *Fid, ViceLockType type,
 
   Bad_SetLock:
     /* Write the all modified vnodes (parent, new files) and volume back */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
 
     if ((errorCode == VREADONLY) && (type == LockRead))
        errorCode = 0;          /* allow read locks on RO volumes without saving state */
@@ -4716,7 +4774,7 @@ SRXAFS_SetLock(struct rx_call * acall, struct AFSFid * Fid, ViceLockType type,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETLOCK);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_SetLock;
 
     code = SAFSS_SetLock(acall, Fid, type, Sync);
@@ -4768,7 +4826,7 @@ SAFSS_ExtendLock(struct rx_call *acall, struct AFSFid *Fid,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_ExtendLock;
@@ -4782,10 +4840,10 @@ SAFSS_ExtendLock(struct rx_call *acall, struct AFSFid *Fid,
 
   Bad_ExtendLock:
     /* Put back file's vnode and volume */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
 
-    if ((errorCode == VREADONLY))      /* presumably, we already granted this lock */
+    if (errorCode == VREADONLY)        /* presumably, we already granted this lock */
        errorCode = 0;          /* under our generous policy re RO vols */
 
     ViceLog(2, ("SAFS_ExtendLock returns %d\n", errorCode));
@@ -4814,7 +4872,7 @@ SRXAFS_ExtendLock(struct rx_call * acall, struct AFSFid * Fid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_EXTENDLOCK);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_ExtendLock;
 
     code = SAFSS_ExtendLock(acall, Fid, Sync);
@@ -4867,7 +4925,7 @@ SAFSS_ReleaseLock(struct rx_call *acall, struct AFSFid *Fid,
      * rights to it
      */
     if ((errorCode =
-        GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+        GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
                          &parentwhentargetnotdir, &client, WRITE_LOCK,
                          &rights, &anyrights))) {
        goto Bad_ReleaseLock;
@@ -4882,18 +4940,19 @@ SAFSS_ReleaseLock(struct rx_call *acall, struct AFSFid *Fid,
 
     /* if no more locks left, a callback would be triggered here */
     if (targetptr->disk.lock.lockCount <= 0) {
+       rx_KeepAliveOn(acall);
        /* convert the write lock to a read lock before breaking callbacks */
        VVnodeWriteToRead(&errorCode, targetptr);
-       osi_Assert(!errorCode || errorCode == VSALVAGE);
+       opr_Assert(!errorCode || errorCode == VSALVAGE);
        BreakCallBack(client->host, Fid, 0);
     }
 
   Bad_ReleaseLock:
     /* Put back file's vnode and volume */
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
 
-    if ((errorCode == VREADONLY))      /* presumably, we already granted this lock */
+    if (errorCode == VREADONLY)        /* presumably, we already granted this lock */
        errorCode = 0;          /* under our generous policy re RO vols */
 
     ViceLog(2, ("SAFS_ReleaseLock returns %d\n", errorCode));
@@ -4922,7 +4981,7 @@ SRXAFS_ReleaseLock(struct rx_call * acall, struct AFSFid * Fid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RELEASELOCK);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
        goto Bad_ReleaseLock;
 
     code = SAFSS_ReleaseLock(acall, Fid, Sync);
@@ -4947,11 +5006,8 @@ SetSystemStats(struct AFSStatistics *stats)
 {
     /* Fix this sometime soon.. */
     /* Because hey, it's not like we have a network monitoring protocol... */
-    struct timeval time;
 
-    /* this works on all system types */
-    FT_GetTimeOfDay(&time, 0);
-    stats->CurrentTime = time.tv_sec;
+    stats->CurrentTime = time(NULL);
 }                              /*SetSystemStats */
 
 void
@@ -4984,15 +5040,11 @@ SetAFSStats(struct AFSStatistics *stats)
     if (seconds <= 0)
        seconds = 1;
     stats->StoreDataRate = AFSCallStats.TotalStoredBytes / seconds;
-#ifdef AFS_NT40_ENV
-    stats->ProcessSize = -1;   /* TODO: */
-#else
-    stats->ProcessSize = (afs_int32) ((long)sbrk(0) >> 10);
-#endif
+    stats->ProcessSize = opr_procsize();
     FS_UNLOCK;
     h_GetWorkStats((int *)&(stats->WorkStations),
                   (int *)&(stats->ActiveWorkStations), (int *)0,
-                  (afs_int32) (FT_ApproxTime()) - (15 * 60));
+                  (afs_int32) (time(NULL)) - (15 * 60));
 
 }                              /*SetAFSStats */
 
@@ -5006,8 +5058,8 @@ SetVolumeStats(struct AFSStatistics *stats)
 
     for (part = DiskPartitionList; part && i < AFS_MSTATDISKS;
         part = part->next) {
-       stats->Disks[i].TotalBlocks = RoundInt64ToInt32(part->totalUsable);
-       stats->Disks[i].BlocksAvailable = RoundInt64ToInt32(part->free);
+       stats->Disks[i].TotalBlocks = RoundInt64ToInt31(part->totalUsable);
+       stats->Disks[i].BlocksAvailable = RoundInt64ToInt31(part->free);
        memset(stats->Disks[i].Name, 0, AFS_DISKNAMESIZE);
        strncpy(stats->Disks[i].Name, part->name, AFS_DISKNAMESIZE);
        i++;
@@ -5029,7 +5081,7 @@ SRXAFS_GetStatistics(struct rx_call *acall, struct ViceStatistics *Statistics)
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
 
-    if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetStatistics;
 
     ViceLog(1, ("SAFS_GetStatistics Received\n"));
@@ -5063,17 +5115,16 @@ SRXAFS_GetStatistics64(struct rx_call *acall, afs_int32 statsVersion, ViceStatis
     struct rx_connection *tcon = rx_ConnectionOf(acall);
     struct host *thost;
     struct client *t_client = NULL;    /* tmp ptr to client data */
-    struct timeval time;
     struct fsstats fsstats;
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
 
-    if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetStatistics64;
 
     ViceLog(1, ("SAFS_GetStatistics64 Received\n"));
     Statistics->ViceStatistics64_val =
-       malloc(statsVersion*sizeof(afs_int64));
+       malloc(statsVersion*sizeof(afs_uint64));
     Statistics->ViceStatistics64_len = statsVersion;
     FS_LOCK;
     AFSCallStats.GetStatistics++, AFSCallStats.TotalCalls++;
@@ -5106,23 +5157,14 @@ SRXAFS_GetStatistics64(struct rx_call *acall, afs_int32 statsVersion, ViceStatis
         seconds = 1;
     Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
        AFSCallStats.TotalStoredBytes / seconds;
-#ifdef AFS_NT40_ENV
-    Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = -1;
-#else
-    Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
-       (afs_int32) ((long)sbrk(0) >> 10);
-#endif
+    Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = opr_procsize();
     FS_UNLOCK;
     h_GetWorkStats64(&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
                      &(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
                     0,
-                     (afs_int32) (FT_ApproxTime()) - (15 * 60));
+                     (afs_int32) (time(NULL)) - (15 * 60));
 
-
-
-    /* this works on all system types */
-    FT_GetTimeOfDay(&time, 0);
-    Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time.tv_sec;
+    Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time(NULL);
 
   Bad_GetStatistics64:
     code = CallPostamble(tcon, code, thost);
@@ -5350,7 +5392,7 @@ SRXAFS_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
      * Record the time of day and the server version number.
      */
     *a_srvVersionNumP = AFS_XSTAT_VERSION;
-    *a_timeP = FT_ApproxTime();
+    *a_timeP = (afs_int32) time(NULL);
 
     /*
      * Stuff the appropriate data in there (assume victory)
@@ -5385,7 +5427,7 @@ SRXAFS_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
         * for the File Server.
         */
        dataBytes = sizeof(struct afs_Stats);
-       dataBuffP = (afs_int32 *) malloc(dataBytes);
+       dataBuffP = malloc(dataBytes);
        memcpy(dataBuffP, &afs_cmstats, dataBytes);
        a_dataP->AFS_CollData_len = dataBytes >> 2;
        a_dataP->AFS_CollData_val = dataBuffP;
@@ -5412,7 +5454,7 @@ SRXAFS_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
         */
 
        dataBytes = sizeof(struct afs_PerfStats);
-       dataBuffP = (afs_int32 *) malloc(dataBytes);
+       dataBuffP = malloc(dataBytes);
        memcpy(dataBuffP, &afs_perfstats, dataBytes);
        a_dataP->AFS_CollData_len = dataBytes >> 2;
        a_dataP->AFS_CollData_val = dataBuffP;
@@ -5430,7 +5472,6 @@ SRXAFS_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
         */
 
        afs_perfstats.numPerfCalls++;
-#if FS_STATS_DETAILED
        afs_FullPerfStats.overall.numPerfCalls = afs_perfstats.numPerfCalls;
        FillPerfValues(&afs_FullPerfStats.overall);
 
@@ -5439,18 +5480,17 @@ SRXAFS_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
         */
 
        dataBytes = sizeof(struct fs_stats_FullPerfStats);
-       dataBuffP = (afs_int32 *) malloc(dataBytes);
+       dataBuffP = malloc(dataBytes);
        memcpy(dataBuffP, &afs_FullPerfStats, dataBytes);
        a_dataP->AFS_CollData_len = dataBytes >> 2;
        a_dataP->AFS_CollData_val = dataBuffP;
-#endif
        break;
 
     case AFS_XSTATSCOLL_CBSTATS:
        afs_perfstats.numPerfCalls++;
 
        dataBytes = sizeof(struct cbcounters);
-       dataBuffP = (afs_int32 *) malloc(dataBytes);
+       dataBuffP = malloc(dataBytes);
        {
            extern struct cbcounters cbstuff;
            dataBuffP[0]=cbstuff.DeleteFiles;
@@ -5513,13 +5553,13 @@ common_GiveUpCallBacks(struct rx_call *acall, struct AFSCBFids *FidArray,
     FS_LOCK;
     AFSCallStats.GiveUpCallBacks++, AFSCallStats.TotalCalls++;
     FS_UNLOCK;
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GiveUpCallBacks;
 
     if (!FidArray && !CallBackArray) {
        ViceLog(1,
                ("SAFS_GiveUpAllCallBacks: host=%x\n",
-                (tcon->peer ? tcon->peer->host : 0)));
+                (rx_PeerOf(tcon) ? rx_HostOf(rx_PeerOf(tcon)) : 0)));
        errorCode = GetClient(tcon, &client);
        if (!errorCode) {
            H_LOCK;
@@ -5532,7 +5572,7 @@ common_GiveUpCallBacks(struct rx_call *acall, struct AFSCBFids *FidArray,
            ViceLog(0,
                    ("GiveUpCallBacks: #Fids %d < #CallBacks %d, host=%x\n",
                     FidArray->AFSCBFids_len, CallBackArray->AFSCBs_len,
-                    (tcon->peer ? tcon->peer->host : 0)));
+                    (rx_PeerOf(tcon) ? rx_HostOf(rx_PeerOf(tcon)) : 0)));
            errorCode = EINVAL;
            goto Bad_GiveUpCallBacks;
        }
@@ -5612,11 +5652,11 @@ SRXAFS_GetCapabilities(struct rx_call * acall, Capabilities * capabilities)
     FS_UNLOCK;
     ViceLog(2, ("SAFS_GetCapabilties\n"));
 
-    if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetCaps;
 
     dataBytes = 1 * sizeof(afs_int32);
-    dataBuffP = (afs_uint32 *) malloc(dataBytes);
+    dataBuffP = malloc(dataBytes);
     dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
     dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
     if (saneacls)
@@ -5629,6 +5669,25 @@ SRXAFS_GetCapabilities(struct rx_call * acall, Capabilities * capabilities)
     code = CallPostamble(tcon, code, thost);
 
 
+    return code;
+}
+
+/* client is held, but not locked */
+static int
+FlushClientCPS(struct client *client, void *arock)
+{
+    ObtainWriteLock(&client->lock);
+
+    client->prfail = 2;        /* Means re-eval client's cps */
+
+    if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
+       free(client->CPS.prlist_val);
+       client->CPS.prlist_val = NULL;
+       client->CPS.prlist_len = 0;
+    }
+
+    ReleaseWriteLock(&client->lock);
+
     return 0;
 }
 
@@ -5641,12 +5700,17 @@ SRXAFS_FlushCPS(struct rx_call * acall, struct ViceIds * vids,
     afs_int32 nids, naddrs;
     afs_int32 *vd, *addr;
     Error errorCode = 0;               /* return code to caller */
-    struct client *client = 0;
 
     ViceLog(1, ("SRXAFS_FlushCPS\n"));
     FS_LOCK;
     AFSCallStats.TotalCalls++;
     FS_UNLOCK;
+
+    if (!viced_SuperUser(acall)) {
+       errorCode = EPERM;
+       goto Bad_FlushCPS;
+    }
+
     nids = vids->ViceIds_len;  /* # of users in here */
     naddrs = addrs->IPAddrs_len;       /* # of hosts in here */
     if (nids < 0 || naddrs < 0) {
@@ -5658,23 +5722,7 @@ SRXAFS_FlushCPS(struct rx_call * acall, struct ViceIds * vids,
     for (i = 0; i < nids; i++, vd++) {
        if (!*vd)
            continue;
-       client = h_ID2Client(*vd);      /* returns write locked and refCounted, or NULL */
-       if (!client)
-           continue;
-
-       client->prfail = 2;     /* Means re-eval client's cps */
-#ifdef notdef
-       if (client->tcon) {
-           rx_SetRock(((struct rx_connection *)client->tcon), 0);
-       }
-#endif
-       if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
-           free(client->CPS.prlist_val);
-           client->CPS.prlist_val = NULL;
-           client->CPS.prlist_len = 0;
-       }
-       ReleaseWriteLock(&client->lock);
-       PutClient(&client);
+       h_EnumerateClients(*vd, FlushClientCPS, NULL);
     }
 
     addr = addrs->IPAddrs_val;
@@ -5786,7 +5834,7 @@ TryLocalVLServer(char *avolid, struct VolumeInfo *avolinfo)
            rx_NewConnection(htonl(0x7f000001), htons(7003), 52, vlSec, 0);
        rx_SetConnDeadTime(vlConn, 15); /* don't wait long */
     }
-    if (down && (FT_ApproxTime() < lastDownTime + 180)) {
+    if (down && (time(NULL) < lastDownTime + 180)) {
        return 1;               /* failure */
     }
 
@@ -5795,7 +5843,7 @@ TryLocalVLServer(char *avolid, struct VolumeInfo *avolinfo)
        down = 0;               /* call worked */
     if (code) {
        if (code < 0) {
-           lastDownTime = FT_ApproxTime();     /* last time we tried an RPC */
+           lastDownTime = time(NULL);  /* last time we tried an RPC */
            down = 1;
        }
        return code;
@@ -5822,7 +5870,7 @@ SRXAFS_GetVolumeInfo(struct rx_call * acall, char *avolid,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMEINFO);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetVolumeInfo;
 
     FS_LOCK;
@@ -5865,7 +5913,7 @@ SRXAFS_GetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMESTATUS);
 
     ViceLog(1, ("SAFS_GetVolumeStatus for volume %u\n", avolid));
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetVolumeStatus;
 
     FS_LOCK;
@@ -5879,32 +5927,28 @@ SRXAFS_GetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
        (afs_int32) ROOTVNODE, dummyFid.Unique = 1;
 
     if ((errorCode =
-        GetVolumePackage(tcon, &dummyFid, &volptr, &targetptr, MustBeDIR,
+        GetVolumePackage(acall, &dummyFid, &volptr, &targetptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, READ_LOCK,
                          &rights, &anyrights)))
        goto Bad_GetVolumeStatus;
 
-    if ((VanillaUser(client)) && (!(rights & PRSFS_READ))) {
-       errorCode = EACCES;
-       goto Bad_GetVolumeStatus;
-    }
     (void)RXGetVolumeStatus(FetchVolStatus, Name, OfflineMsg, Motd, volptr);
 
   Bad_GetVolumeStatus:
-    (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
-                          volptr, &client);
+    (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+                          (Vnode *) 0, volptr, &client);
     ViceLog(2, ("SAFS_GetVolumeStatus returns %d\n", errorCode));
     /* next is to guarantee out strings exist for stub */
     if (*Name == 0) {
-       *Name = (char *)malloc(1);
+       *Name = malloc(1);
        **Name = 0;
     }
     if (*Motd == 0) {
-       *Motd = (char *)malloc(1);
+       *Motd = malloc(1);
        **Motd = 0;
     }
     if (*OfflineMsg == 0) {
-       *OfflineMsg = (char *)malloc(1);
+       *OfflineMsg = malloc(1);
        **OfflineMsg = 0;
     }
     errorCode = CallPostamble(tcon, errorCode, thost);
@@ -5941,7 +5985,7 @@ SRXAFS_SetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETVOLUMESTATUS);
 
     ViceLog(1, ("SAFS_SetVolumeStatus for volume %u\n", avolid));
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_SetVolumeStatus;
 
     FS_LOCK;
@@ -5955,7 +5999,7 @@ SRXAFS_SetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
        (afs_int32) ROOTVNODE, dummyFid.Unique = 1;
 
     if ((errorCode =
-        GetVolumePackage(tcon, &dummyFid, &volptr, &targetptr, MustBeDIR,
+        GetVolumePackage(acall, &dummyFid, &volptr, &targetptr, MustBeDIR,
                          &parentwhentargetnotdir, &client, READ_LOCK,
                          &rights, &anyrights)))
        goto Bad_SetVolumeStatus;
@@ -5973,7 +6017,7 @@ SRXAFS_SetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
        RXUpdate_VolumeStatus(volptr, StoreVolStatus, Name, OfflineMsg, Motd);
 
   Bad_SetVolumeStatus:
-    PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+    PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
                     volptr, &client);
     ViceLog(2, ("SAFS_SetVolumeStatus returns %d\n", errorCode));
     errorCode = CallPostamble(tcon, errorCode, thost);
@@ -6008,7 +6052,7 @@ SRXAFS_GetRootVolume(struct rx_call * acall, char **VolumeName)
     return FSERR_EOPNOTSUPP;
 
 #ifdef notdef
-    if (errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))
+    if (errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost))
        goto Bad_GetRootVolume;
     FS_LOCK;
     AFSCallStats.GetRootVolume++, AFSCallStats.TotalCalls++;
@@ -6059,7 +6103,7 @@ SRXAFS_CheckToken(struct rx_call * acall, afs_int32 AfsId,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_CHECKTOKEN);
 
-    if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_CheckToken;
 
     code = FSERR_ECONNREFUSED;
@@ -6085,13 +6129,13 @@ SRXAFS_GetTime(struct rx_call * acall, afs_uint32 * Seconds,
 
     fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETTIME);
 
-    if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+    if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
        goto Bad_GetTime;
 
     FS_LOCK;
     AFSCallStats.GetTime++, AFSCallStats.TotalCalls++;
     FS_UNLOCK;
-    FT_GetTimeOfDay(&tpl, 0);
+    gettimeofday(&tpl, 0);
     *Seconds = tpl.tv_sec;
     *USeconds = tpl.tv_usec;
 
@@ -6165,13 +6209,13 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
        rx_Write(Call, (char *)&zero, sizeof(afs_int32));       /* send 0-length  */
        return (0);
     }
-    FT_GetTimeOfDay(&StartTime, 0);
+    gettimeofday(&StartTime, 0);
     ihP = targetptr->handle;
     fdP = IH_OPEN(ihP);
     if (fdP == NULL) {
        VTakeOffline(volptr);
-       ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                   volptr->hashid));
+       ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                   afs_printable_VolumeId_lu(volptr->hashid)));
        return EIO;
     }
     optSize = sendBufSize;
@@ -6181,8 +6225,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
     if (tlen < 0) {
        FDH_CLOSE(fdP);
        VTakeOffline(volptr);
-       ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                   volptr->hashid));
+       ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                   afs_printable_VolumeId_lu(volptr->hashid)));
        return EIO;
     }
     if (CheckLength(volptr, targetptr, tlen)) {
@@ -6200,7 +6244,7 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
     {
        afs_int32 high, low;
        SplitOffsetOrSize(Len, high, low);
-       osi_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
+       opr_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
        if (Int64Mode) {
            high = htonl(high);
            rx_Write(Call, (char *)&high, sizeof(afs_int32));   /* High order bits */
@@ -6225,8 +6269,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
            FDH_CLOSE(fdP);
            FreeSendBuffer((struct afs_buffer *)tbuffer);
            VTakeOffline(volptr);
-           ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                       volptr->hashid));
+           ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                       afs_printable_VolumeId_lu(volptr->hashid)));
            return EIO;
        }
        nBytes = rx_Write(Call, tbuffer, wlen);
@@ -6241,8 +6285,8 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
        if (nBytes != wlen) {
            FDH_CLOSE(fdP);
            VTakeOffline(volptr);
-           ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                       volptr->hashid));
+           ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                       afs_printable_VolumeId_lu(volptr->hashid)));
            return EIO;
        }
        nBytes = rx_Writev(Call, tiov, tnio, wlen);
@@ -6271,7 +6315,7 @@ FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
     FreeSendBuffer((struct afs_buffer *)tbuffer);
 #endif /* HAVE_PIOV */
     FDH_CLOSE(fdP);
-    FT_GetTimeOfDay(&StopTime, 0);
+    gettimeofday(&StopTime, 0);
 
     /* Adjust all Fetch Data related stats */
     FS_LOCK;
@@ -6353,7 +6397,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
                  afs_sfsize_t * a_bytesStoredP)
 {
     afs_sfsize_t bytesTransfered;      /* number of bytes actually transfered */
-    struct timeval StartTime, StopTime;        /* Used to measure how long the store takes */
     Error errorCode = 0;               /* Returned error code to caller */
 #ifndef HAVE_PIOV
     char *tbuffer;     /* data copying buffer */
@@ -6369,9 +6412,8 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     afs_fsize_t NewLength;     /* size after this store completes */
     afs_sfsize_t adjustSize;   /* bytes to call VAdjust... with */
     int linkCount = 0;         /* link count on inode */
-    afs_fsize_t CoW_off, CoW_len;
     ssize_t nBytes;
-    FdHandle_t *fdP, *origfdP = NULL;
+    FdHandle_t *fdP;
     struct in_addr logHostAddr;        /* host ip holder for inet_ntoa */
     afs_ino_str_t stmp;
 
@@ -6397,6 +6439,7 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
                 inet_ntoa(logHostAddr), ntohs(rxr_PortOf(rx_ConnectionOf(Call)))));
        return ENOENT;          /* is this proper error code? */
     } else {
+       rx_KeepAliveOff(Call);
        /*
         * See if the file has several links (from other volumes).  If it
         * does, then we have to make a copy before changing it to avoid
@@ -6411,8 +6454,8 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
        if (GetLinkCountAndSize(volptr, fdP, &linkCount, &DataLength) < 0) {
            FDH_CLOSE(fdP);
            VTakeOffline(volptr);
-           ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
-                       volptr->hashid));
+           ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                       afs_printable_VolumeId_lu(volptr->hashid)));
            return EIO;
        }
        if (CheckLength(volptr, targetptr, DataLength)) {
@@ -6434,32 +6477,20 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
             * mechanisms (i.e. copy on write overhead.) Also the right size
             * of the disk will be recorded...
             */
-           origfdP = fdP;
+           FDH_CLOSE(fdP);
            VN_GET_LEN(size, targetptr);
            volptr->partition->flags &= ~PART_DONTUPDATE;
            VSetPartitionDiskUsage(volptr->partition);
            volptr->partition->flags |= PART_DONTUPDATE;
            if ((errorCode = VDiskUsage(volptr, nBlocks(size)))) {
                volptr->partition->flags &= ~PART_DONTUPDATE;
-               FDH_CLOSE(origfdP);
                return (errorCode);
            }
 
-           CoW_len = (FileLength >= (Length + Pos)) ? FileLength - Length : Pos;
-           CopyOnWrite_calls++;
-           if (CoW_len == 0) CopyOnWrite_size0++;
-           if (Pos == 0) CopyOnWrite_off0++;
-           if (CoW_len > CopyOnWrite_maxsize) CopyOnWrite_maxsize = CoW_len;
-
-           ViceLog(1, ("StoreData : calling CopyOnWrite on vnode %u.%u (%s) "
-                       "off 0x0 size 0x%llx\n",
-                       afs_printable_VolumeId_u(V_id(volptr)),
-                       afs_printable_VnodeId_u(targetptr->vnodeNumber),
-                       V_name(volptr), Pos));
-           if ((errorCode = CopyOnWrite(targetptr, volptr, 0, Pos))) {
+           ViceLog(25, ("StoreData : calling CopyOnWrite on  target dir\n"));
+           if ((errorCode = CopyOnWrite(targetptr, volptr, 0, MAXFSIZE))) {
                ViceLog(25, ("StoreData : CopyOnWrite failed\n"));
                volptr->partition->flags &= ~PART_DONTUPDATE;
-               FDH_CLOSE(origfdP);
                return (errorCode);
            }
            volptr->partition->flags &= ~PART_DONTUPDATE;
@@ -6468,7 +6499,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
            if (fdP == NULL) {
                ViceLog(25,
                        ("StoreData : Reopen after CopyOnWrite failed\n"));
-               FDH_REALLYCLOSE(origfdP);
                return ENOENT;
            }
        }
@@ -6476,8 +6506,8 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     }
     if (!VALID_INO(tinode)) {
        VTakeOffline(volptr);
-       ViceLog(0,("Volume %u now offline, must be salvaged.\n",
-                  volptr->hashid));
+       ViceLog(0,("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+                  afs_printable_VolumeId_lu(volptr->hashid)));
        return EIO;
     }
 
@@ -6500,7 +6530,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
         AdjustDiskUsage(volptr, adjustSize,
                         adjustSize - SpareComp(volptr)))) {
        FDH_CLOSE(fdP);
-       if (origfdP) FDH_REALLYCLOSE(origfdP);
        return (errorCode);
     }
 
@@ -6508,8 +6537,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     /* this bit means that the locks are set and protections are OK */
     rx_SetLocalStatus(Call, 1);
 
-    FT_GetTimeOfDay(&StartTime, 0);
-
     optSize = sendBufSize;
     ViceLog(25,
            ("StoreData_RXStyle: Pos %llu, DataLength %llu, FileLength %llu, Length %llu\n",
@@ -6534,6 +6561,7 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
        /* Set the file's length; we've already done an lseek to the right
         * spot above.
         */
+       tlen = 0; /* Just a source of data for the write */
        nBytes = FDH_PWRITE(fdP, &tlen, 1, Pos);
        if (nBytes != 1) {
            errorCode = -1;
@@ -6583,42 +6611,30 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     FreeSendBuffer((struct afs_buffer *)tbuffer);
 #endif /* HAVE_PIOV */
     if (sync) {
-       FDH_SYNC(fdP);
+       (void) FDH_SYNC(fdP);
     }
     if (errorCode) {
+       Error tmp_errorCode = 0;
        afs_sfsize_t nfSize = FDH_SIZE(fdP);
-       osi_Assert(nfSize >= 0);
+       opr_Assert(nfSize >= 0);
        /* something went wrong: adjust size and return */
        VN_SET_LEN(targetptr, nfSize);  /* set new file size. */
        /* changed_newTime is tested in StoreData to detemine if we
         * need to update the target vnode.
         */
        targetptr->changed_newTime = 1;
-       if (origfdP && (bytesTransfered < Length))      /* Need to "finish" CopyOnWrite still */
-           CopyOnWrite2(origfdP, fdP, Pos + bytesTransfered, NewLength - Pos - bytesTransfered);
-       if (origfdP) FDH_REALLYCLOSE(origfdP);
        FDH_CLOSE(fdP);
        /* set disk usage to be correct */
-       VAdjustDiskUsage(&errorCode, volptr,
+       VAdjustDiskUsage(&tmp_errorCode, volptr,
                         (afs_sfsize_t) (nBlocks(nfSize) -
                                         nBlocks(NewLength)), 0);
-       return errorCode;
-    }
-    if (origfdP) {                                     /* finish CopyOnWrite */
-       if ( (CoW_off = Pos + Length) < NewLength) {
-           errorCode = CopyOnWrite2(origfdP, fdP, CoW_off, CoW_len = NewLength - CoW_off);
-           ViceLog(1, ("StoreData : CopyOnWrite2 on vnode %u.%u (%s) "
-                       "off 0x%llx size 0x%llx returns %d\n",
-                        afs_printable_VolumeId_u(V_id(volptr)),
-                       afs_printable_VnodeId_u(targetptr->vnodeNumber),
-                       V_name(volptr), CoW_off, CoW_len, errorCode));
+       if (tmp_errorCode) {
+           errorCode = tmp_errorCode;
        }
-       FDH_REALLYCLOSE(origfdP);
+       return errorCode;
     }
     FDH_CLOSE(fdP);
 
-    FT_GetTimeOfDay(&StopTime, 0);
-
     VN_SET_LEN(targetptr, NewLength);
 
     /* Update all StoreData related stats */
@@ -6806,18 +6822,20 @@ SRXAFS_CallBackRxConnAddr (struct rx_call * acall, afs_int32 *addr)
     static struct rx_securityClass *sc = 0;
     int i,j;
     struct rx_connection *conn;
+    afs_int32 viceid = -1;
 #endif
 
-    if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &tcallhost)))
+    if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &tcallhost)))
            goto Bad_CallBackRxConnAddr1;
 
 #ifndef __EXPERIMENTAL_CALLBACK_CONN_MOVING
     errorCode = 1;
 #else
     H_LOCK;
-    tclient = h_FindClient_r(tcon);
+    tclient = h_FindClient_r(tcon, &viceid);
     if (!tclient) {
        errorCode = VBUSY;
+       LogClientError("Client host too busy (CallBackRxConnAddr)", tcon, viceid, NULL);
        goto Bad_CallBackRxConnAddr;
     }
     thost = tclient->host;