#include <afsconfig.h>
#include <afs/param.h>
+#include <afs/stds.h>
+#include <roken.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
#ifdef AFS_SGI_ENV
#undef SHARED /* XXX */
#endif
-#ifdef AFS_NT40_ENV
-#include <fcntl.h>
-#else
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <string.h>
-
-#ifndef AFS_LINUX20_ENV
+
+#ifdef HAVE_NET_IF_H
#include <net/if.h>
-#ifndef AFS_ARM_DARWIN_ENV
+#endif
+
+#ifdef HAVE_NETINET_IF_ETHER_H
#include <netinet/if_ether.h>
#endif
+
+#if !defined(AFS_SGI_ENV) && defined(HAVE_SYS_MAP_H)
+#include <sys/map.h>
+#endif
+
+#ifdef HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+
+#ifdef HAVE_SYS_LOCKF_H
+#include <sys/lockf.h>
#endif
+
+#ifdef HAVE_SYS_DK_H
+#include <sys/dk.h>
#endif
+
#ifdef AFS_HPUX_ENV
/* included early because of name conflict on IOPEN */
#include <sys/inode.h>
#undef IOPEN
#endif
#endif /* AFS_HPUX_ENV */
-#include <afs/stds.h>
+
#include <rx/xdr.h>
#include <afs/nfs.h>
-#include <afs/assert.h>
#include <lwp.h>
#include <lock.h>
#include <afs/afsint.h>
#include <afs/acl.h>
#include <rx/rx.h>
#include <rx/rx_globals.h>
-#include <sys/stat.h>
-#if ! defined(AFS_SGI_ENV) && ! defined(AFS_AIX32_ENV) && ! defined(AFS_NT40_ENV) && ! defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
-#include <sys/map.h>
-#endif
-#if !defined(AFS_NT40_ENV)
-#include <unistd.h>
-#endif
-#if !defined(AFS_SGI_ENV) && !defined(AFS_NT40_ENV)
-#ifdef AFS_AIX_ENV
-#include <sys/statfs.h>
-#include <sys/lockf.h>
-#else
-#if !defined(AFS_SUN5_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
-#include <sys/dk.h>
-#endif
-#endif
-#endif
+
#include <afs/cellconfig.h>
#include <afs/keys.h>
-#include <signal.h>
#include <afs/partition.h>
#include "viced_prototypes.h"
#include "viced.h"
pthread_mutex_t fileproc_glock_mutex;
#endif /* AFS_PTHREAD_ENV */
-#ifdef O_LARGEFILE
-#define afs_stat stat64
-#define afs_fstat fstat64
-#define afs_open open64
-#else /* !O_LARGEFILE */
-#define afs_stat stat
-#define afs_fstat fstat
-#define afs_open open
-#endif /* !O_LARGEFILE */
-
-
/* Useful local defines used by this module */
#define DONTCHECK 0
extern int HTs, HTBlocks;
-afs_int32 FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
- struct rx_call *Call, afs_sfsize_t Pos,
- afs_sfsize_t Len, afs_int32 Int64Mode,
-#if FS_STATS_DETAILED
- afs_sfsize_t * a_bytesToFetchP,
- afs_sfsize_t * a_bytesFetchedP
-#endif /* FS_STATS_DETAILED */
- );
+static afs_int32 FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
+ struct rx_call *Call, afs_sfsize_t Pos,
+ afs_sfsize_t Len, afs_int32 Int64Mode,
+ afs_sfsize_t * a_bytesToFetchP,
+ afs_sfsize_t * a_bytesFetchedP);
-afs_int32 StoreData_RXStyle(Volume * volptr, Vnode * targetptr,
- struct AFSFid *Fid, struct client *client,
- struct rx_call *Call, afs_fsize_t Pos,
- afs_fsize_t Length, afs_fsize_t FileLength,
- int sync,
-#if FS_STATS_DETAILED
- afs_sfsize_t * a_bytesToStoreP,
- afs_sfsize_t * a_bytesStoredP
-#endif /* FS_STATS_DETAILED */
- );
+static afs_int32 StoreData_RXStyle(Volume * volptr, Vnode * targetptr,
+ struct AFSFid *Fid, struct client *client,
+ struct rx_call *Call, afs_fsize_t Pos,
+ afs_fsize_t Length, afs_fsize_t FileLength,
+ int sync,
+ afs_sfsize_t * a_bytesToStoreP,
+ afs_sfsize_t * a_bytesStoredP);
#ifdef AFS_SGI_XFS_IOPS_ENV
#include <afs/xfsattrs.h>
FS_UNLOCK;
} /*SetVolumeSync */
+/**
+ * Verify that the on-disk size for a vnode matches the length in the vnode
+ * index.
+ *
+ * @param[in] vp Volume pointer
+ * @param[in] vnp Vnode pointer
+ * @param[in] alen Size of the vnode on disk, if known. If unknown, give -1,
+ * and CheckLength itself will determine the on-disk size.
+ *
+ * @return operation status
+ * @retval 0 lengths match
+ * @retval nonzero Error; either the lengths do not match or there was an
+ * error determining the on-disk size. The volume should be
+ * taken offline and salvaged.
+ */
+static int
+CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
+{
+ afs_sfsize_t vlen;
+ VN_GET_LEN(vlen, vnp);
+
+ if (alen < 0) {
+ FdHandle_t *fdP;
+
+ 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),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier)));
+ return -1;
+ }
+ alen = FDH_SIZE(fdP);
+ 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),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier),
+ alen64));
+ return -1;
+ }
+ }
+
+ if (alen != vlen) {
+ afs_int64 alen64 = alen, vlen64 = vlen;
+ ViceLog(0, ("Fid %lu.%lu.%lu has inconsistent length (index "
+ "%lld inode %lld ); volume must be salvaged\n",
+ afs_printable_uint32_lu(vp->hashid),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier),
+ vlen64, alen64));
+ return -1;
+ }
+ return 0;
+}
+
/*
* Note that this function always returns a held host, so
* that CallPostamble can block without the host's disappearing.
retry:
tclient = h_FindClient_r(*tconn);
if (!tclient) {
- ViceLog(0, ("CallPreamble: Couldn't get CPS. Too many lockers\n"));
+ ViceLog(0, ("CallPreamble: Couldn't get client.\n"));
H_UNLOCK;
return VBUSY;
}
code = hpr_Initialize(&uclient);
if (!code)
- assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
+ osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
H_LOCK;
#else
code = pr_Initialize(2, AFSDIR_SERVER_ETC_DIRPATH, 0);
* are incremented and they must be eventualy released.
*/
static afs_int32
-CheckVnode(AFSFid * fid, Volume ** volptr, Vnode ** vptr, int lock)
+CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
+ Vnode ** vptr, int lock)
{
Error fileCode = 0;
Error local_errorCode, errorCode = -1;
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 = VGetVolumeNoWait(&local_errorCode, &errorCode, (afs_int32) fid->Volume);
+ *volptr = VGetVolumeWithCall(&local_errorCode, &errorCode,
+ fid->Volume, ts, cbv);
if (!errorCode) {
- assert(*volptr);
+ osi_Assert(*volptr);
break;
}
if ((errorCode == VOFFLINE) && (VInit < 2)) {
return (errorCode);
}
}
- assert(*volptr);
+ osi_Assert(*volptr);
/* get the vnode */
*vptr = VGetVnode(&errorCode, *volptr, fid->Vnode, lock);
return (errorCode);
if ((*vptr)->disk.uniquifier != fid->Unique) {
VPutVnode(&fileCode, *vptr);
- assert(fileCode == 0);
+ osi_Assert(fileCode == 0);
*vptr = 0;
return (VNOVNODE); /* return the right error code, at least */
}
return (0);
} /*CheckVnode */
+static_inline afs_int32
+CheckVnode(AFSFid * fid, Volume ** volptr, Vnode ** vptr, int lock)
+{
+ return CheckVnodeWithCall(fid, volptr, NULL, vptr, lock);
+}
+
/*
* This routine returns the ACL associated with the targetptr. If the
* targetptr isn't a directory, we access its parent dir and get the ACL
*ACLSize = VAclSize(*targetptr);
return (0);
} else {
- assert(Fid != 0);
+ osi_Assert(Fid != 0);
while (1) {
VnodeId parentvnode;
Error errorCode = 0;
while (client->host->hostFlags & HCPS_INPROGRESS) {
client->host->hostFlags |= HCPS_WAITING; /* I am waiting */
#ifdef AFS_PTHREAD_ENV
- pthread_cond_wait(&client->host->cond, &host_glock_mutex);
+ CV_WAIT(&client->host->cond, &host_glock_mutex);
#else /* AFS_PTHREAD_ENV */
if ((code =
LWP_WaitProcess(&(client->host->hostFlags))) != LWP_SUCCESS)
* interface calls.
*/
static afs_int32
-GetVolumePackage(struct rx_connection *tcon, AFSFid * Fid, Volume ** volptr,
- Vnode ** targetptr, int chkforDir, Vnode ** parent,
- struct client **client, int locktype, afs_int32 * rights,
- afs_int32 * anyrights)
+GetVolumePackageWithCall(struct rx_connection *tcon, struct VCallByVol *cbv,
+ AFSFid * Fid, Volume ** volptr, Vnode ** targetptr,
+ int chkforDir, Vnode ** parent, struct client **client,
+ int locktype, afs_int32 * rights, afs_int32 * anyrights)
{
struct acl_accessList *aCL; /* Internal access List */
int aCLSize; /* size of the access list */
Error errorCode = 0; /* return code to caller */
- if ((errorCode = CheckVnode(Fid, volptr, targetptr, locktype)))
+ if ((errorCode = CheckVnodeWithCall(Fid, volptr, cbv, targetptr, locktype)))
return (errorCode);
if (chkforDir) {
if (chkforDir == MustNOTBeDIR
(chkforDir == MustBeDIR ? 0 : locktype))) != 0)
return (errorCode);
if (chkforDir == MustBeDIR)
- assert((*parent) == 0);
+ osi_Assert((*parent) == 0);
if (!(*client)) {
if ((errorCode = GetClient(tcon, client)) != 0)
return (errorCode);
} /*GetVolumePackage */
+static_inline afs_int32
+GetVolumePackage(struct rx_connection *tcon, 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,
+ chkforDir, parent, client, locktype,
+ rights, anyrights);
+}
+
/*
* 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!
*/
static void
-PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
- Vnode * parentptr, Volume * volptr, struct client **client)
+PutVolumePackageWithCall(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+ Vnode * parentptr, Volume * volptr,
+ struct client **client, struct VCallByVol *cbv)
{
Error fileCode = 0; /* Error code returned by the volume package */
if (parentwhentargetnotdir) {
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (targetptr) {
VPutVnode(&fileCode, targetptr);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (parentptr) {
VPutVnode(&fileCode, parentptr);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (volptr) {
- VPutVolume(volptr);
+ VPutVolumeWithCall(volptr, cbv);
}
if (*client) {
PutClient(client);
}
} /*PutVolumePackage */
+static_inline void
+PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+ Vnode * parentptr, Volume * volptr, struct client **client)
+{
+ PutVolumePackageWithCall(parentwhentargetnotdir, targetptr, parentptr,
+ volptr, client, NULL);
+}
+
static int
VolumeOwner(struct client *client, Vnode * targetptr)
{
} else { /* file */
/* must have read access, or be owner and have insert access */
if (!(rights & PRSFS_READ)
- && !(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)))
+ && !((OWNSp(client, targetptr) && (rights & PRSFS_INSERT)
+ && (client->ViceId != AnonymousID))))
return (EACCES);
}
if (CallingRoutine == CHK_FETCHDATA
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;
+ afs_foff_t done;
size_t length;
char *buff;
int rc; /* return code */
}
IH_INIT(newH, V_device(volptr), V_id(volptr), ino);
newFdP = IH_OPEN(newH);
- assert(newFdP != NULL);
+ osi_Assert(newFdP != NULL);
- FDH_SEEK(targFdP, off, SEEK_SET);
- FDH_SEEK(newFdP, off, SEEK_SET);
+ done = off;
while (size > 0) {
if (size > COPYBUFFSIZE) { /* more than a buffer */
length = COPYBUFFSIZE;
length = size;
size = 0;
}
- rdlen = FDH_READ(targFdP, buff, length);
- if (rdlen == length)
- wrlen = FDH_WRITE(newFdP, buff, length);
- else
+ rdlen = FDH_PREAD(targFdP, buff, length, done);
+ if (rdlen == length) {
+ wrlen = FDH_PWRITE(newFdP, buff, length, done);
+ done += rdlen;
+ } else
wrlen = 0;
/* Callers of this function are not prepared to recover
* from error that put the filesystem in an inconsistent
FDH_REALLYCLOSE(targFdP);
rc = IH_DEC(V_linkHandle(volptr), VN_GET_INO(targetptr),
V_parentId(volptr));
- assert(!rc);
+ osi_Assert(!rc);
IH_RELEASE(targetptr->handle);
rc = FDH_SYNC(newFdP);
- assert(rc == 0);
+ osi_Assert(rc == 0);
FDH_CLOSE(newFdP);
targetptr->handle = newH;
VN_SET_INO(targetptr, ino);
ssize_t rdlen;
ssize_t wrlen;
int rc = 0;
-
- FDH_SEEK(targFdP, off, SEEK_SET);
- FDH_SEEK(newFdP, off, SEEK_SET);
+ afs_foff_t done = off;
if (size > FDH_SIZE(targFdP) - off)
size = FDH_SIZE(targFdP) - off;
length = size;
size = 0;
}
- rdlen = FDH_READ(targFdP, buff, length);
- if (rdlen == length)
- wrlen = FDH_WRITE(newFdP, buff, length);
+ rdlen = FDH_PREAD(targFdP, buff, length, done);
+ if (rdlen == length) {
+ wrlen = FDH_PWRITE(newFdP, buff, length, done);
+ done += rdlen;
+ }
else
wrlen = 0;
/* watch for invalid names */
if (!strcmp(Name, ".") || !strcmp(Name, ".."))
return (EINVAL);
+
+ if (CheckLength(volptr, parentptr, -1)) {
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
+
if (parentptr->disk.cloned) {
ViceLog(25, ("DeleteTarget : CopyOnWrite called\n"));
if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) {
/* check that the file is in the directory */
SetDirHandle(dir, parentptr);
- if (Lookup(dir, Name, fileFid))
+ if (afs_dir_Lookup(dir, Name, fileFid))
return (ENOENT);
fileFid->Volume = V_id(volptr);
} else if ((*targetptr)->disk.type == vDirectory)
return (EISDIR);
- /*assert((*targetptr)->disk.uniquifier == fileFid->Unique); */
+ /*osi_Assert((*targetptr)->disk.uniquifier == fileFid->Unique); */
/**
* If the uniquifiers dont match then instead of asserting
* take the volume offline and return VSALVAGE
if (ChkForDir == MustBeDIR) {
SetDirHandle(&childdir, *targetptr);
- if (IsEmpty(&childdir) != 0)
+ if (afs_dir_IsEmpty(&childdir) != 0)
return (EEXIST);
- DZap((afs_int32 *) &childdir);
+ DZap(&childdir);
FidZap(&childdir);
(*targetptr)->delete = 1;
} else if ((--(*targetptr)->disk.linkCount) == 0)
(*targetptr)->changed_newTime = 1; /* Status change of deleted file/dir */
- code = Delete(dir, (char *)Name);
+ code = afs_dir_Delete(dir, Name);
if (code) {
ViceLog(0,
("Error %d deleting %s\n", code,
#endif /* FS_STATS_DETAILED */
parentptr->disk.dataVersion++;
- newlength = (afs_fsize_t) Length(dir);
+ newlength = (afs_fsize_t) afs_dir_Length(dir);
/*
* This is a called on both dir removals (i.e. remove, removedir, rename) but also in dir additions
* (create, symlink, link, makedir) so we need to check if we have enough space
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 =
AdjustDiskUsage(volptr, BlocksPreallocatedForVnode,
BlocksPreallocatedForVnode))) {
ViceLog(25,
- ("Insufficient space to allocate %" AFS_INT64_FMT " blocks\n",
+ ("Insufficient space to allocate %lld blocks\n",
(afs_intmax_t) BlocksPreallocatedForVnode));
return (errorCode);
}
+ if (CheckLength(volptr, parentptr, -1)) {
+ VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
+
*targetptr = VAllocVnode(&errorCode, volptr, FileType);
if (errorCode != 0) {
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
/* add the name to the directory */
SetDirHandle(dir, parentptr);
- if ((errorCode = Create(dir, (char *)Name, OutFid))) {
+ if ((errorCode = afs_dir_Create(dir, Name, OutFid))) {
(*targetptr)->delete = 1;
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
IH_REALLYCLOSE((*targetptr)->handle);
temp = strlen(V_name(volptr)) + 1;
*name = malloc(temp);
if (!*name) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*name, V_name(volptr));
temp = strlen(V_offlineMessage(volptr)) + 1;
*offMsg = malloc(temp);
if (!*offMsg) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*offMsg, V_offlineMessage(volptr));
#if OPENAFS_VOL_STATS
*motd = malloc(1);
if (!*motd) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*motd, nullString);
#else
temp = strlen(V_motd(volptr)) + 1;
*motd = malloc(temp);
if (!*motd) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*motd, V_motd(volptr));
-#endif /* FS_STATS_DETAILED */
+#endif /* OPENAFS_VOL_STATS */
return 0;
} /*RXGetVolumeStatus */
return code;
}
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
static struct afs_buffer {
struct afs_buffer *next;
} *freeBufferList = 0;
static int afs_buffersAlloced = 0;
-static
+static int
FreeSendBuffer(struct afs_buffer *adata)
{
FS_LOCK;
/* allocate space for sender */
static char *
-AllocSendBuffer()
+AllocSendBuffer(void)
{
struct afs_buffer *tp;
FS_UNLOCK;
tmp = malloc(sendBufSize);
if (!tmp) {
- ViceLog(0, ("Failed malloc in AllocSendBuffer\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in AllocSendBuffer\n"));
}
return tmp;
}
return (char *)tp;
} /*AllocSendBuffer */
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
/*
* This routine returns the status info associated with the targetptr vnode
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
+ struct VCallByVol tcbv, *cbv = NULL;
+ static int remainder = 0; /* shared access protected by FS_LOCK */
+ struct fsstats fsstats;
+ afs_sfsize_t bytesToXfer; /* # bytes to xfer */
+ afs_sfsize_t bytesXferred; /* # bytes actually xferred */
+
#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct fs_stats_xferData *xferP; /* Ptr to this op's byte size struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval xferStartTime, xferStopTime; /* Start/stop times for xfer portion */
- struct timeval elapsedTime; /* Transfer time */
- afs_sfsize_t bytesToXfer; /* # bytes to xfer */
- afs_sfsize_t bytesXferred; /* # bytes actually xferred */
int readIdx; /* Index of read stats array to bump */
- static afs_int32 tot_bytesXferred; /* shared access protected by FS_LOCK */
-
- /*
- * Set our stats pointers, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_FETCHDATA]);
- xferP = &(afs_FullPerfStats.det.xferOpTimes[FS_STATS_XFERIDX_FETCHDATA]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHDATA);
+
ViceLog(1,
("SRXAFS_FetchData, Fid = %u.%u.%u\n", Fid->Volume, Fid->Vnode,
Fid->Unique));
("SRXAFS_FetchData, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+
+ queue_NodeInit(&tcbv);
+ tcbv.call = acall;
+ cbv = &tcbv;
+
/*
* Get volume/vnode for the fetched file; caller's access rights to
* it are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackageWithCall(tcon, cbv, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_FetchData;
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
parentwhentargetnotdir = NULL;
}
-#if FS_STATS_DETAILED
- /*
- * Remember when the data transfer started.
- */
- FT_GetTimeOfDay(&xferStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+
+ fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_FETCHDATA);
/* actually do the data transfer */
-#if FS_STATS_DETAILED
errorCode =
FetchData_RXStyle(volptr, targetptr, acall, Pos, Len, type,
&bytesToXfer, &bytesXferred);
-#else
- if ((errorCode =
- FetchData_RXStyle(volptr, targetptr, acall, Pos, Len, type)))
- goto Bad_FetchData;
-#endif /* FS_STATS_DETAILED */
-
-#if FS_STATS_DETAILED
- /*
- * At this point, the data transfer is done, for good or ill. Remember
- * when the transfer ended, bump the number of successes/failures, and
- * integrate the transfer size and elapsed time into the stats. If the
- * operation failed, we jump to the appropriate point.
- */
- FT_GetTimeOfDay(&xferStopTime, 0);
- FS_LOCK;
- (xferP->numXfers)++;
- if (!errorCode) {
- (xferP->numSuccesses)++;
- /*
- * Bump the xfer sum by the number of bytes actually sent, NOT the
- * target number.
- */
- tot_bytesXferred += bytesXferred;
- (xferP->sumBytes) += (tot_bytesXferred >> 10);
- tot_bytesXferred &= 0x3FF;
- if (bytesXferred < xferP->minBytes)
- xferP->minBytes = bytesXferred;
- if (bytesXferred > xferP->maxBytes)
- xferP->maxBytes = bytesXferred;
-
- /*
- * Tally the size of the object. Note: we tally the actual size,
- * NOT the number of bytes that made it out over the wire.
- */
- if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET0)
- (xferP->count[0])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET1)
- (xferP->count[1])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET2)
- (xferP->count[2])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET3)
- (xferP->count[3])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET4)
- (xferP->count[4])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET5)
- (xferP->count[5])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET6)
- (xferP->count[6])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET7)
- (xferP->count[7])++;
- else
- (xferP->count[8])++;
+ fsstats_FinishXfer(&fsstats, errorCode, bytesToXfer, bytesXferred,
+ &remainder);
- fs_stats_GetDiff(elapsedTime, xferStartTime, xferStopTime);
- fs_stats_AddTo((xferP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((xferP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (xferP->minTime))) {
- fs_stats_TimeAssign((xferP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (xferP->maxTime))) {
- fs_stats_TimeAssign((xferP->maxTime), elapsedTime);
- }
- }
- FS_UNLOCK;
- /*
- * Finally, go off to tell our caller the bad news in case the
- * fetch failed.
- */
if (errorCode)
goto Bad_FetchData;
-#endif /* FS_STATS_DETAILED */
/* write back the OutStatus from the target vnode */
GetStatus(targetptr, OutStatus, rights, anyrights,
Bad_FetchData:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackageWithCall(parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client, cbv);
ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, FetchDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
int code;
afs_sfsize_t tPos, tLen;
-#ifdef AFS_64BIT_ENV
tPos = (afs_sfsize_t) Pos;
tLen = (afs_sfsize_t) Len;
-#else /* AFS_64BIT_ENV */
- if (Pos.high || Len.high)
- return EFBIG;
- tPos = Pos.low;
- tLen = Len.low;
-#endif /* AFS_64BIT_ENV */
code =
common_FetchData64(acall, Fid, tPos, tLen, OutStatus, CallBack, Sync,
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_FETCHACL]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHACL);
ViceLog(1,
("SAFS_FetchACL, Fid = %u.%u.%u\n", Fid->Volume, Fid->Vnode,
AccessList->AFSOpaque_len = 0;
AccessList->AFSOpaque_val = malloc(AFSOPAQUEMAX);
if (!AccessList->AFSOpaque_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchACL\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchACL\n"));
}
/*
AccessList->AFSOpaque_val));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, FetchACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
struct rx_connection *tcon = rx_ConnectionOf(acall);
struct host *thost;
struct client *t_client = NULL; /* tmp pointer to the client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_BULKSTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_BULKSTATUS);
ViceLog(1, ("SAFS_BulkStatus\n"));
FS_LOCK;
OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
CallBacks->AFSCBs_val = (struct AFSCallBack *)
malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
Audit_and_Return:
ViceLog(2, ("SAFS_BulkStatus returns %d\n", errorCode));
struct client *t_client = NULL; /* tmp ptr to client data */
AFSFetchStatus *tstatus;
int VolSync_set = 0;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_BULKSTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_BULKSTATUS);
ViceLog(1, ("SAFS_InlineBulkStatus\n"));
FS_LOCK;
OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
CallBacks->AFSCBs_val = (struct AFSCallBack *)
malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
Audit_and_Return:
ViceLog(2, ("SAFS_InlineBulkStatus returns %d\n", errorCode));
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_FETCHSTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHSTATUS);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_FetchStatus;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, FetchStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon;
struct host *thost;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct fs_stats_xferData *xferP; /* Ptr to this op's byte size struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval xferStartTime, xferStopTime; /* Start/stop times for xfer portion */
- struct timeval elapsedTime; /* Transfer time */
- afs_sfsize_t bytesToXfer; /* # bytes to xfer */
- afs_sfsize_t bytesXferred; /* # bytes actually xfer */
- static afs_int32 tot_bytesXferred; /* shared access protected by FS_LOCK */
+ struct fsstats fsstats;
+ afs_sfsize_t bytesToXfer;
+ afs_sfsize_t bytesXferred;
+ static int remainder = 0;
- /*
- * Set our stats pointers, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_STOREDATA]);
- xferP = &(afs_FullPerfStats.det.xferOpTimes[FS_STATS_XFERIDX_STOREDATA]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
ViceLog(1,
("StoreData: Fid = %u.%u.%u\n", Fid->Volume, Fid->Vnode,
Fid->Unique));
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STOREDATA);
FS_LOCK;
AFSCallStats.StoreData++, AFSCallStats.TotalCalls++;
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
parentwhentargetnotdir = NULL;
}
-#if FS_STATS_DETAILED
- /*
- * Remember when the data transfer started.
- */
- FT_GetTimeOfDay(&xferStartTime, 0);
-#endif /* FS_STATS_DETAILED */
- /* Do the actual storing of the data */
-#if FS_STATS_DETAILED
+ fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_STOREDATA);
+
errorCode =
StoreData_RXStyle(volptr, targetptr, Fid, client, acall, Pos, Length,
FileLength, (InStatus->Mask & AFS_FSYNC),
&bytesToXfer, &bytesXferred);
-#else
- errorCode =
- StoreData_RXStyle(volptr, targetptr, Fid, client, acall, Pos, Length,
- FileLength, (InStatus->Mask & AFS_FSYNC));
- if (errorCode && (!targetptr->changed_newTime))
- goto Bad_StoreData;
-#endif /* FS_STATS_DETAILED */
-#if FS_STATS_DETAILED
- /*
- * At this point, the data transfer is done, for good or ill. Remember
- * when the transfer ended, bump the number of successes/failures, and
- * integrate the transfer size and elapsed time into the stats. If the
- * operation failed, we jump to the appropriate point.
- */
- FT_GetTimeOfDay(&xferStopTime, 0);
- FS_LOCK;
- (xferP->numXfers)++;
- if (!errorCode) {
- (xferP->numSuccesses)++;
-
- /*
- * Bump the xfer sum by the number of bytes actually sent, NOT the
- * target number.
- */
- tot_bytesXferred += bytesXferred;
- (xferP->sumBytes) += (tot_bytesXferred >> 10);
- tot_bytesXferred &= 0x3FF;
- if (bytesXferred < xferP->minBytes)
- xferP->minBytes = bytesXferred;
- if (bytesXferred > xferP->maxBytes)
- xferP->maxBytes = bytesXferred;
- /*
- * Tally the size of the object. Note: we tally the actual size,
- * NOT the number of bytes that made it out over the wire.
- */
- if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET0)
- (xferP->count[0])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET1)
- (xferP->count[1])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET2)
- (xferP->count[2])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET3)
- (xferP->count[3])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET4)
- (xferP->count[4])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET5)
- (xferP->count[5])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET6)
- (xferP->count[6])++;
- else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET7)
- (xferP->count[7])++;
- else
- (xferP->count[8])++;
+ fsstats_FinishXfer(&fsstats, errorCode, bytesToXfer, bytesXferred,
+ &remainder);
- fs_stats_GetDiff(elapsedTime, xferStartTime, xferStopTime);
- fs_stats_AddTo((xferP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((xferP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (xferP->minTime))) {
- fs_stats_TimeAssign((xferP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (xferP->maxTime))) {
- fs_stats_TimeAssign((xferP->maxTime), elapsedTime);
- }
- }
- FS_UNLOCK;
- /*
- * Finally, go off to tell our caller the bad news in case the
- * store failed.
- */
if (errorCode && (!targetptr->changed_newTime))
goto Bad_StoreData;
-#endif /* FS_STATS_DETAILED */
/* Update the status of the target's vnode */
Update_TargetVnodeStatus(targetptr, TVS_SDATA, client, InStatus,
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
+
osi_auditU(acall, StoreDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
afs_fsize_t tLength;
afs_fsize_t tFileLength;
-#ifdef AFS_64BIT_ENV
tPos = (afs_fsize_t) Pos;
tLength = (afs_fsize_t) Length;
tFileLength = (afs_fsize_t) FileLength;
-#else /* AFS_64BIT_ENV */
- if (FileLength.high)
- return EFBIG;
- tPos = Pos.low;
- tLength = Length.low;
- tFileLength = FileLength.low;
-#endif /* AFS_64BIT_ENV */
code =
common_StoreData64(acall, Fid, InStatus, tPos, tLength, tFileLength,
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
+
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STOREACL);
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_STOREACL]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_StoreACL;
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call backs on the directory */
BreakCallBack(client->host, Fid, 0);
ViceLog(2, ("SAFS_StoreACL returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, StoreACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* Break call backs on Fid */
BreakCallBack(client->host, Fid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_STORESTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STORESTATUS);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_StoreStatus;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, StoreStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
DeleteFileCallBacks(&fileFid);
/* convert the parent lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
} else {
/* convert the parent lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* convert the target lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* tell all the file has changed */
BreakCallBack(client->host, &fileFid, 1);
}
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_REMOVEFILE]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEFILE);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_RemoveFile;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RemoveFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on parent dir */
BreakCallBack(client->host, DirFid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_CREATEFILE]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_CREATEFILE);
memset(OutFid, 0, sizeof(struct AFSFid));
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, CreateFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
goto Bad_Rename;
}
+ if (CheckLength(volptr, oldvptr, -1) ||
+ CheckLength(volptr, newvptr, -1)) {
+ VTakeOffline(volptr);
+ errorCode = VSALVAGE;
+ goto Bad_Rename;
+ }
+
/* The CopyOnWrite might return ENOSPC ( disk full). Even if the second
* call to CopyOnWrite returns error, it is not necessary to revert back
* the effects of the first call because the contents of the volume is
SetDirHandle(&newdir, newvptr);
/* Lookup the file to delete its vnode */
- if (Lookup(&olddir, OldName, &fileFid)) {
+ if (afs_dir_Lookup(&olddir, OldName, &fileFid)) {
errorCode = ENOENT;
goto Bad_Rename;
}
}
/* Lookup the new file */
- if (!(Lookup(&newdir, NewName, &newFileFid))) {
+ if (!(afs_dir_Lookup(&newdir, NewName, &newFileFid))) {
if (readonlyServer) {
errorCode = VREADONLY;
goto Bad_Rename;
errorCode = EISDIR;
goto Bad_Rename;
}
- if ((IsEmpty(&newfiledir))) {
+ if ((afs_dir_IsEmpty(&newfiledir))) {
errorCode = EEXIST;
goto Bad_Rename;
}
}
if (testnode == 1) top = 1;
testvptr = VGetVnode(&errorCode, volptr, testnode, READ_LOCK);
- assert(errorCode == 0);
+ osi_Assert(errorCode == 0);
testnode = testvptr->disk.parent;
VPutVnode(&errorCode, testvptr);
if ((top == 1) && (testnode != 0)) {
errorCode = EIO;
goto Bad_Rename;
}
- assert(errorCode == 0);
+ osi_Assert(errorCode == 0);
}
}
} else {
struct AFSFid unused;
- code = Lookup(&filedir, "..", &unused);
+ code = afs_dir_Lookup(&filedir, "..", &unused);
if (code == ENOENT) {
/* only update .. if it doesn't already exist */
updatefile = 1;
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 */
doDelete = 0;
if (newfileptr) {
/* Delete NewName from its directory */
- code = Delete(&newdir, NewName);
- assert(code == 0);
+ code = afs_dir_Delete(&newdir, NewName);
+ osi_Assert(code == 0);
/* Drop the link count */
newfileptr->disk.linkCount--;
* highly unlikely that it would work since it would involve issuing
* another create.
*/
- if ((errorCode = Create(&newdir, (char *)NewName, &fileFid)))
+ if ((errorCode = afs_dir_Create(&newdir, NewName, &fileFid)))
goto Bad_Rename;
/* Delete the old name */
- assert(Delete(&olddir, (char *)OldName) == 0);
+ osi_Assert(afs_dir_Delete(&olddir, OldName) == 0);
/* if the directory length changes, reflect it in the statistics */
#if FS_STATS_DETAILED
/* if we are dealing with a rename of a directory, and we need to
* update the .. entry of that directory */
if (updatefile) {
- assert(!fileptr->disk.cloned);
+ osi_Assert(!fileptr->disk.cloned);
fileptr->changed_newTime = 1; /* status change of moved file */
/* fix .. to point to the correct place */
- Delete(&filedir, ".."); /* No assert--some directories may be bad */
- assert(Create(&filedir, "..", NewDirFid) == 0);
+ afs_dir_Delete(&filedir, ".."); /* No assert--some directories may be bad */
+ osi_Assert(afs_dir_Create(&filedir, "..", NewDirFid) == 0);
fileptr->disk.dataVersion++;
/* if the parent directories are different the link counts have to be */
/* convert the write locks to a read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, newvptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
if (oldvptr != newvptr) {
VVnodeWriteToRead(&errorCode, oldvptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
}
if (newfileptr && !doDelete) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, newfileptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
}
/* break call back on NewDirFid, OldDirFid, NewDirFid and newFileFid */
Bad_Rename:
if (newfileptr) {
VPutVnode(&fileCode, newfileptr);
- assert(fileCode == 0);
+ osi_Assert(fileCode == 0);
}
(void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
newvptr : 0), oldvptr, volptr, &client);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_RENAME]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RENAME);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_Rename;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RenameFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
return EIO;
}
len = strlen((char *) LinkContents);
- code = (len == FDH_WRITE(fdP, (char *) LinkContents, len)) ? 0 : VDISKFULL;
+ code = (len == FDH_PWRITE(fdP, (char *) LinkContents, len, 0)) ? 0 : VDISKFULL;
if (code)
- ViceLog(0, ("SAFSS_Symlink FDH_WRITE failed for len=%d, Fid=%u.%d.%d\n", (int)len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
+ ViceLog(0, ("SAFSS_Symlink FDH_PWRITE failed for len=%d, Fid=%u.%d.%d\n", (int)len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
FDH_CLOSE(fdP);
/*
* Set up and return modified status for the parent dir and new symlink
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on the parent dir */
BreakCallBack(client->host, DirFid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_SYMLINK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SYMLINK);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_Symlink;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, SymlinkEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
goto Bad_Link;
}
+ if (CheckLength(volptr, parentptr, -1)) {
+ VTakeOffline(volptr);
+ errorCode = VSALVAGE;
+ goto Bad_Link;
+ }
+
/* get the file vnode */
if ((errorCode =
CheckVnode(ExistingFid, &volptr, &targetptr, WRITE_LOCK))) {
/* add the name to the directory */
SetDirHandle(&dir, parentptr);
- if ((errorCode = Create(&dir, (char *)Name, ExistingFid)))
+ if ((errorCode = afs_dir_Create(&dir, Name, ExistingFid)))
goto Bad_Link;
DFlush();
/* convert the write locks to read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_LINK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_LINK);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_Link;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, LinkEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
#endif /* FS_STATS_DETAILED */
/* Point to target's ACL buffer and copy the parent's ACL contents to it */
- assert((SetAccessList
+ osi_Assert((SetAccessList
(&targetptr, &volptr, &newACL, &newACLSize,
&parentwhentargetnotdir, (AFSFid *) 0, 0)) == 0);
- assert(parentwhentargetnotdir == 0);
+ osi_Assert(parentwhentargetnotdir == 0);
memcpy((char *)newACL, (char *)VVnodeACL(parentptr), VAclSize(parentptr));
/* update the status for the target vnode */
/* Actually create the New directory in the directory package */
SetDirHandle(&dir, targetptr);
- assert(!(MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
+ osi_Assert(!(afs_dir_MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
DFlush();
- VN_SET_LEN(targetptr, (afs_fsize_t) Length(&dir));
+ VN_SET_LEN(targetptr, (afs_fsize_t) afs_dir_Length(&dir));
/* set up return status */
GetStatus(targetptr, OutFidStatus, rights, anyrights, parentptr);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
+
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_MAKEDIR);
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_MAKEDIR]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_MakeDir;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, MakeDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
- Vnode debugvnode1, debugvnode2;
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon = rx_ConnectionOf(acall);
&rights, &anyrights))) {
goto Bad_RemoveDir;
}
- debugvnode1 = *parentptr;
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
goto Bad_RemoveDir;
}
- debugvnode2 = *parentptr;
/* Do the actual delete of the desired (empty) directory, Name */
if ((errorCode =
DeleteTarget(parentptr, volptr, &targetptr, &dir, &fileFid, Name,
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid and fileFid */
BreakCallBack(client->host, DirFid, 0);
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_REMOVEDIR]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEDIR);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_RemoveDir;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RemoveDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_SETLOCK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETLOCK);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_SetLock;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, SetLockEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_EXTENDLOCK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_EXTENDLOCK);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_ExtendLock;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, ExtendLockEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
if (targetptr->disk.lock.lockCount <= 0) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
BreakCallBack(client->host, Fid, 0);
}
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_RELEASELOCK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RELEASELOCK);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_ReleaseLock;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, ReleaseLockEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
struct rx_connection *tcon = rx_ConnectionOf(acall);
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETSTATISTICS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
goto Bad_GetStatistics;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
struct timeval time;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETSTATISTICS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
goto Bad_GetStatistics64;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
struct client *t_client = NULL; /* tmp ptr to client data */
struct rx_connection *tcon = rx_ConnectionOf(a_call);
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_XSTATSVERSION]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_XSTATSVERSION);
*a_versionP = AFS_XSTAT_VERSION;
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_LOCK;
- (opP->numSuccesses)++;
- FS_UNLOCK;
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, 0);
osi_auditU(a_call, XStatsVersionEvent, 0,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
static void
FillPerfValues(struct afs_PerfStats *a_perfP)
{ /*FillPerfValues */
- afs_uint32 hi, lo;
int dir_Buffers; /*# buffers in use by dir package */
int dir_Calls; /*# read calls in dir package */
int dir_IOs; /*# I/O ops in dir package */
+ struct rx_statistics *stats;
/*
* Vnode cache section.
a_perfP->vcache_S_Reads = VnodeClassInfo[vSmall].reads;
a_perfP->vcache_S_Writes = VnodeClassInfo[vSmall].writes;
a_perfP->vcache_H_Entries = VStats.hdr_cache_size;
- SplitInt64(VStats.hdr_gets, hi, lo);
- a_perfP->vcache_H_Gets = lo;
- SplitInt64(VStats.hdr_loads, hi, lo);
- a_perfP->vcache_H_Replacements = lo;
+ a_perfP->vcache_H_Gets = (int)VStats.hdr_gets;
+ a_perfP->vcache_H_Replacements = (int)VStats.hdr_loads;
/*
* Directory section.
/*
* Rx section.
*/
- a_perfP->rx_packetRequests = (afs_int32) rx_stats.packetRequests;
+ stats = rx_GetStatistics();
+
+ a_perfP->rx_packetRequests = (afs_int32) stats->packetRequests;
a_perfP->rx_noPackets_RcvClass =
- (afs_int32) rx_stats.receivePktAllocFailures;
+ (afs_int32) stats->receivePktAllocFailures;
a_perfP->rx_noPackets_SendClass =
- (afs_int32) rx_stats.sendPktAllocFailures;
+ (afs_int32) stats->sendPktAllocFailures;
a_perfP->rx_noPackets_SpecialClass =
- (afs_int32) rx_stats.specialPktAllocFailures;
- a_perfP->rx_socketGreedy = (afs_int32) rx_stats.socketGreedy;
- a_perfP->rx_bogusPacketOnRead = (afs_int32) rx_stats.bogusPacketOnRead;
- a_perfP->rx_bogusHost = (afs_int32) rx_stats.bogusHost;
- a_perfP->rx_noPacketOnRead = (afs_int32) rx_stats.noPacketOnRead;
+ (afs_int32) stats->specialPktAllocFailures;
+ a_perfP->rx_socketGreedy = (afs_int32) stats->socketGreedy;
+ a_perfP->rx_bogusPacketOnRead = (afs_int32) stats->bogusPacketOnRead;
+ a_perfP->rx_bogusHost = (afs_int32) stats->bogusHost;
+ a_perfP->rx_noPacketOnRead = (afs_int32) stats->noPacketOnRead;
a_perfP->rx_noPacketBuffersOnRead =
- (afs_int32) rx_stats.noPacketBuffersOnRead;
- a_perfP->rx_selects = (afs_int32) rx_stats.selects;
- a_perfP->rx_sendSelects = (afs_int32) rx_stats.sendSelects;
+ (afs_int32) stats->noPacketBuffersOnRead;
+ a_perfP->rx_selects = (afs_int32) stats->selects;
+ a_perfP->rx_sendSelects = (afs_int32) stats->sendSelects;
a_perfP->rx_packetsRead_RcvClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_RECEIVE];
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_RECEIVE];
a_perfP->rx_packetsRead_SendClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_SEND];
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_SEND];
a_perfP->rx_packetsRead_SpecialClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_SPECIAL];
- a_perfP->rx_dataPacketsRead = (afs_int32) rx_stats.dataPacketsRead;
- a_perfP->rx_ackPacketsRead = (afs_int32) rx_stats.ackPacketsRead;
- a_perfP->rx_dupPacketsRead = (afs_int32) rx_stats.dupPacketsRead;
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_SPECIAL];
+ a_perfP->rx_dataPacketsRead = (afs_int32) stats->dataPacketsRead;
+ a_perfP->rx_ackPacketsRead = (afs_int32) stats->ackPacketsRead;
+ a_perfP->rx_dupPacketsRead = (afs_int32) stats->dupPacketsRead;
a_perfP->rx_spuriousPacketsRead =
- (afs_int32) rx_stats.spuriousPacketsRead;
+ (afs_int32) stats->spuriousPacketsRead;
a_perfP->rx_packetsSent_RcvClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_RECEIVE];
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_RECEIVE];
a_perfP->rx_packetsSent_SendClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_SEND];
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_SEND];
a_perfP->rx_packetsSent_SpecialClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_SPECIAL];
- a_perfP->rx_ackPacketsSent = (afs_int32) rx_stats.ackPacketsSent;
- a_perfP->rx_pingPacketsSent = (afs_int32) rx_stats.pingPacketsSent;
- a_perfP->rx_abortPacketsSent = (afs_int32) rx_stats.abortPacketsSent;
- a_perfP->rx_busyPacketsSent = (afs_int32) rx_stats.busyPacketsSent;
- a_perfP->rx_dataPacketsSent = (afs_int32) rx_stats.dataPacketsSent;
- a_perfP->rx_dataPacketsReSent = (afs_int32) rx_stats.dataPacketsReSent;
- a_perfP->rx_dataPacketsPushed = (afs_int32) rx_stats.dataPacketsPushed;
- a_perfP->rx_ignoreAckedPacket = (afs_int32) rx_stats.ignoreAckedPacket;
- a_perfP->rx_totalRtt_Sec = (afs_int32) rx_stats.totalRtt.sec;
- a_perfP->rx_totalRtt_Usec = (afs_int32) rx_stats.totalRtt.usec;
- a_perfP->rx_minRtt_Sec = (afs_int32) rx_stats.minRtt.sec;
- a_perfP->rx_minRtt_Usec = (afs_int32) rx_stats.minRtt.usec;
- a_perfP->rx_maxRtt_Sec = (afs_int32) rx_stats.maxRtt.sec;
- a_perfP->rx_maxRtt_Usec = (afs_int32) rx_stats.maxRtt.usec;
- a_perfP->rx_nRttSamples = (afs_int32) rx_stats.nRttSamples;
- a_perfP->rx_nServerConns = (afs_int32) rx_stats.nServerConns;
- a_perfP->rx_nClientConns = (afs_int32) rx_stats.nClientConns;
- a_perfP->rx_nPeerStructs = (afs_int32) rx_stats.nPeerStructs;
- a_perfP->rx_nCallStructs = (afs_int32) rx_stats.nCallStructs;
- a_perfP->rx_nFreeCallStructs = (afs_int32) rx_stats.nFreeCallStructs;
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_SPECIAL];
+ a_perfP->rx_ackPacketsSent = (afs_int32) stats->ackPacketsSent;
+ a_perfP->rx_pingPacketsSent = (afs_int32) stats->pingPacketsSent;
+ a_perfP->rx_abortPacketsSent = (afs_int32) stats->abortPacketsSent;
+ a_perfP->rx_busyPacketsSent = (afs_int32) stats->busyPacketsSent;
+ a_perfP->rx_dataPacketsSent = (afs_int32) stats->dataPacketsSent;
+ a_perfP->rx_dataPacketsReSent = (afs_int32) stats->dataPacketsReSent;
+ a_perfP->rx_dataPacketsPushed = (afs_int32) stats->dataPacketsPushed;
+ a_perfP->rx_ignoreAckedPacket = (afs_int32) stats->ignoreAckedPacket;
+ a_perfP->rx_totalRtt_Sec = (afs_int32) stats->totalRtt.sec;
+ a_perfP->rx_totalRtt_Usec = (afs_int32) stats->totalRtt.usec;
+ a_perfP->rx_minRtt_Sec = (afs_int32) stats->minRtt.sec;
+ a_perfP->rx_minRtt_Usec = (afs_int32) stats->minRtt.usec;
+ a_perfP->rx_maxRtt_Sec = (afs_int32) stats->maxRtt.sec;
+ a_perfP->rx_maxRtt_Usec = (afs_int32) stats->maxRtt.usec;
+ a_perfP->rx_nRttSamples = (afs_int32) stats->nRttSamples;
+ a_perfP->rx_nServerConns = (afs_int32) stats->nServerConns;
+ a_perfP->rx_nClientConns = (afs_int32) stats->nClientConns;
+ a_perfP->rx_nPeerStructs = (afs_int32) stats->nPeerStructs;
+ a_perfP->rx_nCallStructs = (afs_int32) stats->nCallStructs;
+ a_perfP->rx_nFreeCallStructs = (afs_int32) stats->nFreeCallStructs;
a_perfP->host_NumHostEntries = HTs;
a_perfP->host_HostBlocks = HTBlocks;
a_perfP->host_ClientBlocks = CEBlocks;
a_perfP->sysname_ID = afs_perfstats.sysname_ID;
- a_perfP->rx_nBusies = (afs_int32) rx_stats.nBusies;
+ a_perfP->rx_nBusies = (afs_int32) stats->nBusies;
a_perfP->fs_nBusies = afs_perfstats.fs_nBusies;
+ rx_FreeStatistics(&stats);
} /*FillPerfValues */
int code; /*Return value */
afs_int32 *dataBuffP; /*Ptr to data to be returned */
afs_int32 dataBytes; /*Bytes in data buffer */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETXSTATS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETXSTATS);
/*
* Record the time of day and the server version number.
code = 1;
} /*Switch on collection number */
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
return (code);
struct client *client = 0;
struct rx_connection *tcon;
struct host *thost;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP =
- &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GIVEUPCALLBACKS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GIVEUPCALLBACKS);
if (FidArray)
ViceLog(1,
Bad_GiveUpCallBacks:
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
+
return errorCode;
} /*common_GiveUpCallBacks */
dataBytes = 1 * sizeof(afs_int32);
dataBuffP = (afs_uint32 *) malloc(dataBytes);
dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
-#if defined(AFS_64BIT_ENV)
dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
-#endif
if (saneacls)
dataBuffP[0] |= VICED_CAPABILITY_SANEACLS;
afs_int32 code;
struct rx_connection *tcon;
struct host *thost;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
+
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMEINFO);
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETVOLUMEINFO]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_GetVolumeInfo;
Bad_GetVolumeInfo:
code = CallPostamble(tcon, code, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
return code;
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP =
- &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETVOLUMESTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMESTATUS);
ViceLog(1, ("SAFS_GetVolumeStatus for volume %u\n", avolid));
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, GetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
struct rx_connection *tcon = rx_ConnectionOf(acall);
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP =
- &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_SETVOLUMESTATUS]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETVOLUMESTATUS);
ViceLog(1, ("SAFS_SetVolumeStatus for volume %u\n", avolid));
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, SetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
struct host *thost;
Error errorCode = 0;
#endif
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime; /* Start time for RPC op */
-#ifdef notdef
- struct timeval opStopTime;
- struct timeval elapsedTime; /* Transfer time */
-#endif
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETROOTVOLUME]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETROOTVOLUME);
return FSERR_EOPNOTSUPP;
Bad_GetRootVolume:
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (errorCode == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, errorCode);
return (errorCode);
#endif /* notdef */
afs_int32 code;
struct rx_connection *tcon;
struct host *thost;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_CHECKTOKEN]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_CHECKTOKEN);
if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_CheckToken;
Bad_CheckToken:
code = CallPostamble(tcon, code, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
return code;
struct rx_connection *tcon;
struct host *thost;
struct timeval tpl;
-#if FS_STATS_DETAILED
- struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
- struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
- struct timeval elapsedTime; /* Transfer time */
+ struct fsstats fsstats;
- /*
- * Set our stats pointer, remember when the RPC operation started, and
- * tally the operation.
- */
- opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETTIME]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- FT_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETTIME);
if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
goto Bad_GetTime;
Bad_GetTime:
code = CallPostamble(tcon, code, thost);
-#if FS_STATS_DETAILED
- FT_GetTimeOfDay(&opStopTime, 0);
- fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
- if (code == 0) {
- FS_LOCK;
- (opP->numSuccesses)++;
- fs_stats_AddTo((opP->sumTime), elapsedTime);
- fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
- if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
- fs_stats_TimeAssign((opP->minTime), elapsedTime);
- }
- if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
- fs_stats_TimeAssign((opP->maxTime), elapsedTime);
- }
- FS_UNLOCK;
- }
-#endif /* FS_STATS_DETAILED */
+ fsstats_FinishOp(&fsstats, code);
return code;
* Call : Ptr to the Rx call involved.
* Pos : Offset within the file.
* Len : Length in bytes to read; this value is bogus!
- * if FS_STATS_DETAILED
* a_bytesToFetchP : Set to the number of bytes to be fetched from
* the File Server.
* a_bytesFetchedP : Set to the actual number of bytes fetched from
* the File Server.
- * endif
*/
-afs_int32
+static afs_int32
FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
struct rx_call * Call, afs_sfsize_t Pos,
afs_sfsize_t Len, afs_int32 Int64Mode,
-#if FS_STATS_DETAILED
afs_sfsize_t * a_bytesToFetchP,
- afs_sfsize_t * a_bytesFetchedP
-#endif /* FS_STATS_DETAILED */
- )
+ afs_sfsize_t * a_bytesFetchedP)
{
struct timeval StartTime, StopTime; /* used to calculate file transfer rates */
IHandle_t *ihP;
FdHandle_t *fdP;
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
char *tbuffer;
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
struct iovec tiov[RX_MAXIOVECS];
int tnio;
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
afs_sfsize_t tlen;
afs_int32 optSize;
-#if FS_STATS_DETAILED
/*
* Initialize the byte count arguments.
*/
(*a_bytesToFetchP) = 0;
(*a_bytesFetchedP) = 0;
-#endif /* FS_STATS_DETAILED */
-
ViceLog(25,
("FetchData_RXStyle: Pos %llu, Len %llu\n", (afs_uintmax_t) Pos,
volptr->hashid));
return EIO;
}
+ if (CheckLength(volptr, targetptr, tlen)) {
+ FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
if (Pos > tlen) {
Len = 0;
}
if (Pos + Len > tlen) /* get length we should send */
Len = ((tlen - Pos) < 0) ? 0 : tlen - Pos;
- (void)FDH_SEEK(fdP, Pos, 0);
{
afs_int32 high, low;
SplitOffsetOrSize(Len, high, low);
- assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
+ osi_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
if (Int64Mode) {
high = htonl(high);
rx_Write(Call, (char *)&high, sizeof(afs_int32)); /* High order bits */
low = htonl(low);
rx_Write(Call, (char *)&low, sizeof(afs_int32)); /* send length on fetch */
}
-#if FS_STATS_DETAILED
(*a_bytesToFetchP) = Len;
-#endif /* FS_STATS_DETAILED */
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
tbuffer = AllocSendBuffer();
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
while (Len > 0) {
size_t wlen;
ssize_t nBytes;
wlen = optSize;
else
wlen = Len;
-#ifdef AFS_NT40_ENV
- nBytes = FDH_READ(fdP, tbuffer, wlen);
+#ifndef HAVE_PIOV
+ nBytes = FDH_PREAD(fdP, tbuffer, wlen, Pos);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
return EIO;
}
nBytes = rx_Write(Call, tbuffer, wlen);
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
nBytes = rx_WritevAlloc(Call, tiov, &tnio, RX_MAXIOVECS, wlen);
if (nBytes <= 0) {
FDH_CLOSE(fdP);
return EIO;
}
wlen = nBytes;
- nBytes = FDH_READV(fdP, tiov, tnio);
+ nBytes = FDH_PREADV(fdP, tiov, tnio, Pos);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
return EIO;
}
nBytes = rx_Writev(Call, tiov, tnio, wlen);
-#endif /* AFS_NT40_ENV */
-#if FS_STATS_DETAILED
+#endif /* HAVE_PIOV */
+ Pos += wlen;
/*
* Bump the number of bytes actually sent by the number from this
* latest iteration
*/
(*a_bytesFetchedP) += nBytes;
-#endif /* FS_STATS_DETAILED */
if (nBytes != wlen) {
+ afs_int32 err;
FDH_CLOSE(fdP);
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
+ err = VIsGoingOffline(volptr);
+ if (err) {
+ return err;
+ }
return -31;
}
Len -= wlen;
}
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
FDH_CLOSE(fdP);
FT_GetTimeOfDay(&StopTime, 0);
lhp = IH_OPEN(V_linkHandle(vp));
if (!lhp)
return EIO;
-#ifdef AFS_NT40_ENV
- *lc = nt_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0);
-#else
- *lc = namei_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0);
-#endif
+ *lc = namei_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0, 0, 1);
FDH_CLOSE(lhp);
if (*lc < 0)
return -1;
* Call : Ptr to the Rx call involved.
* Pos : Offset within the file.
* Len : Length in bytes to store; this value is bogus!
- * if FS_STATS_DETAILED
* a_bytesToStoreP : Set to the number of bytes to be stored to
* the File Server.
* a_bytesStoredP : Set to the actual number of bytes stored to
* the File Server.
- * endif
*/
afs_int32
StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
struct client * client, struct rx_call * Call,
afs_fsize_t Pos, afs_fsize_t Length, afs_fsize_t FileLength,
int sync,
-#if FS_STATS_DETAILED
afs_sfsize_t * a_bytesToStoreP,
- afs_sfsize_t * a_bytesStoredP
-#endif /* FS_STATS_DETAILED */
- )
+ 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 */
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
char *tbuffer; /* data copying buffer */
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
struct iovec tiov[RX_MAXIOVECS]; /* no data copying with iovec */
int tnio; /* temp for iovec size */
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
afs_sfsize_t tlen; /* temp for xfr length */
Inode tinode; /* inode for I/O */
afs_int32 optSize; /* optimal transfer size */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
afs_ino_str_t stmp;
-#if FS_STATS_DETAILED
/*
* Initialize the byte count arguments.
*/
(*a_bytesToStoreP) = 0;
(*a_bytesStoredP) = 0;
-#endif /* FS_STATS_DETAILED */
/*
* We break the callbacks here so that the following signal will not
volptr->hashid));
return EIO;
}
+ if (CheckLength(volptr, targetptr, DataLength)) {
+ FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
if (linkCount != 1) {
afs_fsize_t size;
if (fdP == NULL) {
ViceLog(25,
("StoreData : Reopen after CopyOnWrite failed\n"));
- FDH_CLOSE(origfdP);
+ FDH_REALLYCLOSE(origfdP);
return ENOENT;
}
}
AdjustDiskUsage(volptr, adjustSize,
adjustSize - SpareComp(volptr)))) {
FDH_CLOSE(fdP);
- if (origfdP) FDH_CLOSE(origfdP);
+ if (origfdP) FDH_REALLYCLOSE(origfdP);
return (errorCode);
}
/* truncate the file iff it needs it (ftruncate is slow even when its a noop) */
if (FileLength < DataLength)
FDH_TRUNC(fdP, FileLength);
- if (Pos > 0)
- FDH_SEEK(fdP, Pos, 0);
bytesTransfered = 0;
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
tbuffer = AllocSendBuffer();
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
/* if length == 0, the loop below isn't going to do anything, including
* extend the length of the inode, which it must do, since the file system
* assumes that the inode length == vnode's file length. So, we extend
/* Set the file's length; we've already done an lseek to the right
* spot above.
*/
- nBytes = FDH_WRITE(fdP, &tlen, 1);
+ nBytes = FDH_PWRITE(fdP, &tlen, 1, Pos);
if (nBytes != 1) {
errorCode = -1;
goto done;
errorCode = FDH_TRUNC(fdP, Pos);
} else {
/* have some data to copy */
-#if FS_STATS_DETAILED
(*a_bytesToStoreP) = Length;
-#endif /* FS_STATS_DETAILED */
while (1) {
int rlen;
if (bytesTransfered >= Length) {
rlen = optSize; /* bound by buffer size */
else
rlen = (int)tlen;
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
errorCode = rx_Read(Call, tbuffer, rlen);
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
errorCode = rx_Readv(Call, tiov, &tnio, RX_MAXIOVECS, rlen);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
if (errorCode <= 0) {
errorCode = -32;
break;
}
-#if FS_STATS_DETAILED
(*a_bytesStoredP) += errorCode;
-#endif /* FS_STATS_DETAILED */
rlen = errorCode;
-#ifdef AFS_NT40_ENV
- nBytes = FDH_WRITE(fdP, tbuffer, rlen);
-#else /* AFS_NT40_ENV */
- nBytes = FDH_WRITEV(fdP, tiov, tnio);
-#endif /* AFS_NT40_ENV */
+#ifndef HAVE_PIOV
+ nBytes = FDH_PWRITE(fdP, tbuffer, rlen, Pos);
+#else /* HAVE_PIOV */
+ nBytes = FDH_PWRITEV(fdP, tiov, tnio, Pos);
+#endif /* HAVE_PIOV */
if (nBytes != rlen) {
errorCode = VDISKFULL;
break;
}
bytesTransfered += rlen;
+ Pos += rlen;
}
}
done:
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
if (sync) {
FDH_SYNC(fdP);
}
if (errorCode) {
+ Error tmp_errorCode = 0;
afs_sfsize_t nfSize = FDH_SIZE(fdP);
- assert(nfSize >= 0);
+ osi_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
targetptr->changed_newTime = 1;
if (origfdP && (bytesTransfered < Length)) /* Need to "finish" CopyOnWrite still */
CopyOnWrite2(origfdP, fdP, Pos + bytesTransfered, NewLength - Pos - bytesTransfered);
- if (origfdP) FDH_CLOSE(origfdP);
+ 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);
+ if (tmp_errorCode) {
+ errorCode = tmp_errorCode;
+ }
return errorCode;
}
if (origfdP) { /* finish CopyOnWrite */
afs_printable_VnodeId_u(targetptr->vnodeNumber),
V_name(volptr), CoW_off, CoW_len, errorCode));
}
- FDH_CLOSE(origfdP);
+ FDH_REALLYCLOSE(origfdP);
}
FDH_CLOSE(fdP);