/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
/* */
/* ********************************************************************** */
-/*
- * in Check_PermissionRights, certain privileges are afforded to the owner
- * of the volume, or the owner of a file. Are these considered "use of
- * privilege"?
+/*
+ * GetVolumePackage disables Rx keepalives; PutVolumePackage re-enables.
+ * If callbacks are to be broken, keepalives should be enabled in the
+ * stub while that occurs; disabled while disk I/O is in process.
+ */
+
+/*
+ * in Check_PermissionRights, certain privileges are afforded to the owner
+ * of the volume, or the owner of a file. Are these considered "use of
+ * privilege"?
*/
#include <afsconfig.h>
#include <afs/param.h>
+#include <afs/stds.h>
-RCSID
- ("$Header$");
+#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>
+#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"
#include <afs/afsutil.h>
#include <afs/dir.h>
-extern void SetDirHandle(register DirHandle * dir, register Vnode * vnode);
+extern void SetDirHandle(DirHandle * dir, Vnode * vnode);
extern void FidZap(DirHandle * file);
extern void FidZero(DirHandle * file);
-#ifdef AFS_PTHREAD_ENV
pthread_mutex_t fileproc_glock_mutex;
-#endif /* AFS_PTHREAD_ENV */
-
-#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 */
extern int SystemId;
static struct AFSCallStatistics AFSCallStats;
-#if FS_STATS_DETAILED
struct fs_stats_FullPerfStats afs_FullPerfStats;
extern int AnonymousID;
-#endif /* FS_STATS_DETAILED */
-#if OPENAFS_VOL_STATS
static const char nullString[] = "";
-#endif /* OPENAFS_VOL_STATS */
struct afs_FSStats {
afs_int32 NothingYet;
struct afs_FSStats afs_fsstats;
-void ResetDebug(), SetDebug(), Terminate();
-
int LogLevel = 0;
int supported = 1;
int Console = 0;
afs_int32 PctSpare;
extern afs_int32 implicitAdminRights;
extern afs_int32 readonlyServer;
+extern int CopyOnWrite_calls, CopyOnWrite_off0, CopyOnWrite_size0;
+extern afs_fsize_t CopyOnWrite_maxsize;
/*
* Externals used by the xstat code.
extern int HTs, HTBlocks;
-afs_int32 FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
- register 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_int32 StoreData_RXStyle(Volume * volptr, Vnode * targetptr,
- struct AFSFid *Fid, struct client *client,
- register 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 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);
+
+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>
afs_int32
SpareComp(Volume * avolp)
{
- register afs_int32 temp;
+ afs_int32 temp;
FS_LOCK;
if (PctSpare) {
* the Cache Manager knows that the volume must be purged from the stat cache.
*/
static void
-SetVolumeSync(register struct AFSVolSync *async, register Volume * avol)
+SetVolumeSync(struct AFSVolSync *async, Volume * avol)
{
FS_LOCK;
/* date volume instance was created */
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.
* Call returns rx connection in passed in *tconn
*/
static int
-CallPreamble(register struct rx_call *acall, int activecall,
+CallPreamble(struct rx_call *acall, int activecall,
struct rx_connection **tconn, struct host **ahostp)
{
struct host *thost;
int code = 0;
char hoststr[16], hoststr2[16];
struct ubik_client *uclient;
-
*ahostp = NULL;
if (!tconn) {
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;
}
/* Take down the old connection and re-read the key file */
ViceLog(0,
("CallPreamble: Couldn't get CPS. Reconnect to ptserver\n"));
-#ifdef AFS_PTHREAD_ENV
uclient = (struct ubik_client *)pthread_getspecific(viced_uclient_key);
/* Is it still necessary to drop this? We hit the net, we should... */
H_UNLOCK;
- if (uclient)
+ if (uclient) {
hpr_End(uclient);
+ uclient = NULL;
+ }
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);
-#endif
+
if (code) {
h_ReleaseClient_r(tclient);
h_Release_r(thost);
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
("BreakDelayedCallbacks FAILED for host %s:%d which IS UP. Connection from %s:%d. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
+ afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
if (MultiProbeAlternateAddress_r(thost)) {
ViceLog(0,
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
("BreakDelayedCallbacks FAILED AGAIN for host %s:%d which IS UP. Connection from %s:%d. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
+ afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
code = -1;
}
static afs_int32
-CallPostamble(register struct rx_connection *aconn, afs_int32 ret,
+CallPostamble(struct rx_connection *aconn, afs_int32 ret,
struct host *ahost)
{
struct host *thost;
struct client *tclient;
int translate = 0;
- int held;
H_LOCK;
tclient = h_FindClient_r(aconn);
- if (!tclient)
+ if (!tclient)
goto busyout;
thost = tclient->host;
if (thost->hostFlags & HERRORTRANS)
translate = 1;
h_ReleaseClient_r(tclient);
- held = h_Held_r(thost);
- if (held)
- h_Release_r(thost);
- if (ahost && ahost != thost) {
- char hoststr[16], hoststr2[16];
- ViceLog(0, ("CallPostamble: ahost %s:%d (%x) != thost %s:%d (%x)\n",
- afs_inet_ntoa_r(ahost->host, hoststr), ntohs(ahost->port),
- ahost,
- afs_inet_ntoa_r(thost->host, hoststr2), ntohs(thost->port),
- thost));
- h_Release_r(ahost);
- } else if (!ahost) {
- char hoststr[16];
- ViceLog(0, ("CallPostamble: null ahost for thost %s:%d (%x)\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port),
- thost));
+
+ if (ahost) {
+ if (ahost != thost) {
+ /* host/client recycle */
+ char hoststr[16], hoststr2[16];
+ ViceLog(0, ("CallPostamble: ahost %s:%d (%p) != thost "
+ "%s:%d (%p)\n",
+ afs_inet_ntoa_r(ahost->host, hoststr),
+ ntohs(ahost->port),
+ ahost,
+ afs_inet_ntoa_r(thost->host, hoststr2),
+ ntohs(thost->port),
+ thost));
+ }
+ /* return the reference taken in CallPreamble */
+ h_Release_r(ahost);
+ } else {
+ char hoststr[16];
+ ViceLog(0, ("CallPostamble: null ahost for thost %s:%d (%p)\n",
+ afs_inet_ntoa_r(thost->host, hoststr),
+ ntohs(thost->port),
+ thost));
}
+
+ /* return the reference taken in local h_FindClient_r--h_ReleaseClient_r
+ * does not decrement refcount on client->host */
+ h_Release_r(thost);
+
busyout:
H_UNLOCK;
return (translate ? sys_error_to_et(ret) : ret);
* 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)
{
- int fileCode = 0;
- afs_int32 local_errorCode, errorCode = -1;
+ Error fileCode = 0;
+ Error local_errorCode, errorCode = -1;
static struct timeval restartedat = { 0, 0 };
if (fid->Volume == 0 || fid->Vnode == 0) /* not: || fid->Unique == 0) */
extern int VInit;
while (1) {
- int restarting =
+ int restarting =
#ifdef AFS_DEMAND_ATTACH_FS
VSALVAGE
#else
VRESTARTING
#endif
;
+ static const struct timespec timeout_ts = { 0, 0 };
+ static const struct timespec * const ts = &timeout_ts;
errorCode = 0;
- *volptr = VGetVolume(&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)) {
/* The volume we want may not be attached yet because
* the volume initialization is not yet complete.
- * We can do several things:
+ * We can do several things:
* 1. return -1, which will cause users to see
* "connection timed out". This is more or
* less the same as always, except that the servers
* may appear to bounce up and down while they
* are actually restarting.
- * 2. return VBUSY which will cause clients to
+ * 2. return VBUSY which will cause clients to
* sleep and retry for 6.5 - 15 minutes, depending
* on what version of the CM they are running. If
- * the file server takes longer than that interval
+ * the file server takes longer than that interval
* to attach the desired volume, then the application
- * will see an ENODEV or EIO. This approach has
+ * will see an ENODEV or EIO. This approach has
* the advantage that volumes which have been attached
* are immediately available, it keeps the server's
* immediate backlog low, and the call is interruptible
* by the user. Users see "waiting for busy volume."
* 3. sleep here and retry. Some people like this approach
- * because there is no danger of seeing errors. However,
- * this approach only works with a bounded number of
+ * because there is no danger of seeing errors. However,
+ * this approach only works with a bounded number of
* clients, since the pending queues will grow without
* stopping. It might be better to find a way to take
* this call and stick it back on a queue in order to
- * recycle this thread for a different request.
+ * recycle this thread for a different request.
* 4. Return a new error code, which new cache managers will
* know enough to interpret as "sleep and retry", without
* the upper bound of 6-15 minutes that is imposed by the
* VBUSY handling. Users will see "waiting for
* busy volume," so they know that something is
- * happening. Old cache managers must be able to do
+ * happening. Old cache managers must be able to do
* something reasonable with this, for instance, mark the
* server down. Fortunately, any error code < 0
* will elicit that behavior. See #1.
if (restartedat.tv_sec == 0) {
/* I'm not really worried about when we restarted, I'm */
/* just worried about when the first VBUSY was returned. */
- TM_GetTimeOfDay(&restartedat, 0);
+ FT_GetTimeOfDay(&restartedat, 0);
if (busyonrst) {
FS_LOCK;
afs_perfstats.fs_nBusies++;
return (busyonrst ? VBUSY : restarting);
} else {
struct timeval now;
- TM_GetTimeOfDay(&now, 0);
+ FT_GetTimeOfDay(&now, 0);
if ((now.tv_sec - restartedat.tv_sec) < (11 * 60)) {
if (busyonrst) {
FS_LOCK;
}
}
}
- /* allow read operations on busy volume.
+ /* allow read operations on busy volume.
* must check local_errorCode because demand attach fs
* can have local_errorCode == VSALVAGING, errorCode == VBUSY */
else if (local_errorCode == VBUSY && lock == READ_LOCK) {
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;
- int errorCode = 0;
+ Error errorCode = 0;
parentvnode = (*targetptr)->disk.parent;
VPutVnode(&errorCode, *targetptr);
/* Must not be called with H_LOCK held */
static void
-client_CheckRights(struct client *client, struct acl_accessList *ACL,
+client_CheckRights(struct client *client, struct acl_accessList *ACL,
afs_int32 *rights)
{
*rights = 0;
afs_int32 code = 0;
ObtainReadLock(&client->lock);
- if (client->CPS.prlist_len > 0 && !client->deleted &&
+ if (client->CPS.prlist_len > 0 && !client->deleted &&
client->host && !(client->host->hostFlags & HOSTDELETED))
code = acl_IsAMember(id, &client->CPS);
ReleaseReadLock(&client->lock);
{
extern prlist SystemAnyUserCPS;
afs_int32 hrights = 0;
-#ifndef AFS_PTHREAD_ENV
- int code;
-#endif
if (acl_CheckRights(ACL, &SystemAnyUserCPS, anyrights) != 0) {
ViceLog(0, ("CheckRights failed\n"));
H_LOCK;
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);
-#else /* AFS_PTHREAD_ENV */
- if ((code =
- LWP_WaitProcess(&(client->host->hostFlags))) != LWP_SUCCESS)
- ViceLog(0, ("LWP_WaitProcess returned %d\n", code));
-#endif /* AFS_PTHREAD_ENV */
+ CV_WAIT(&client->host->cond, &host_glock_mutex);
}
if (!client->host->hcps.prlist_len || !client->host->hcps.prlist_val) {
char hoststr[16];
ViceLog(5,
("CheckRights: len=%u, for host=%s:%d\n",
- client->host->hcps.prlist_len,
+ client->host->hcps.prlist_len,
afs_inet_ntoa_r(client->host->host, hoststr),
ntohs(client->host->port)));
} else
} /*VanillaUser */
-/*
- * This unusual afs_int32-parameter routine encapsulates all volume package related
- * operations together in a single function; it's called by almost all AFS
- * interface calls.
- */
+/*------------------------------------------------------------------------
+ * GetVolumePackageWithCall
+ *
+ * Description:
+ * This unusual afs_int32-parameter routine encapsulates all volume
+ * package related operations together in a single function; it's
+ * called by almost all AFS interface calls.
+ *
+ * Arguments:
+ * acall : Ptr to Rx call on which this request came in.
+ * cbv : struct containing the RX call for offline cancels
+ * Fid : the AFS fid the caller is acting on
+ * volptr : returns a pointer to the volume struct
+ * targetptr : returns a pointer to the vnode struct
+ * chkforDir : whether to check for if vnode is a dir
+ * parent : returns a pointer to the parent of this vnode
+ * client : returns a pointer to the calling client
+ * locktype : indicates what kind of lock to take on vnodes
+ * rights : returns a pointer to caller's rights
+ * anyrights : returns a pointer to anonymous' rights
+ *
+ * Returns:
+ * 0 on success
+ * appropriate error based on permission or invalid operation.
+ *
+ * Environment:
+ * Nothing interesting.
+ *
+ * Side Effects:
+ * On success, disables keepalives on the call. Caller should re-enable
+ * after completing disk I/O.
+ *------------------------------------------------------------------------*/
static afs_int32
-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_call *acall, struct VCallByVol *cbv,
+ AFSFid * Fid, Volume ** volptr, Vnode ** targetptr,
+ int chkforDir, Vnode ** parent,
+ struct client **client, int locktype,
+ afs_int32 * rights, afs_int32 * anyrights)
{
struct acl_accessList *aCL; /* Internal access List */
int aCLSize; /* size of the access list */
- int errorCode = 0; /* return code to caller */
+ Error errorCode = 0; /* return code to caller */
+ struct rx_connection *tcon = rx_ConnectionOf(acall);
+
+ rx_KeepAliveOff(acall);
+
+ if ((errorCode = CheckVnodeWithCall(Fid, volptr, cbv, targetptr, locktype)))
+ goto gvpdone;
- if ((errorCode = CheckVnode(Fid, volptr, targetptr, locktype)))
- return (errorCode);
if (chkforDir) {
if (chkforDir == MustNOTBeDIR
- && ((*targetptr)->disk.type == vDirectory))
- return (EISDIR);
+ && ((*targetptr)->disk.type == vDirectory)) {
+ errorCode = EISDIR;
+ goto gvpdone;
+ }
else if (chkforDir == MustBeDIR
- && ((*targetptr)->disk.type != vDirectory))
- return (ENOTDIR);
+ && ((*targetptr)->disk.type != vDirectory)) {
+ errorCode = ENOTDIR;
+ goto gvpdone;
+ }
}
if ((errorCode =
SetAccessList(targetptr, volptr, &aCL, &aCLSize, parent,
(chkforDir == MustBeDIR ? (AFSFid *) 0 : Fid),
(chkforDir == MustBeDIR ? 0 : locktype))) != 0)
- return (errorCode);
+ goto gvpdone;
if (chkforDir == MustBeDIR)
- assert((*parent) == 0);
+ osi_Assert((*parent) == 0);
if (!(*client)) {
if ((errorCode = GetClient(tcon, client)) != 0)
- return (errorCode);
- if (!(*client))
- return (EINVAL);
+ goto gvpdone;
+ if (!(*client)) {
+ errorCode = EINVAL;
+ goto gvpdone;
+ }
}
GetRights(*client, aCL, rights, anyrights);
/* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
if (!VanillaUser(*client))
(*rights) |= PRSFS_LOOKUP;
#endif /* ADMIN_IMPLICIT_LOOKUP */
+gvpdone:
+ if (errorCode)
+ rx_KeepAliveOn(acall);
return errorCode;
} /*GetVolumePackage */
+static_inline afs_int32
+GetVolumePackage(struct rx_call *acall, AFSFid * Fid, Volume ** volptr,
+ Vnode ** targetptr, int chkforDir, Vnode ** parent,
+ struct client **client, int locktype, afs_int32 * rights,
+ afs_int32 * anyrights)
+{
+ return GetVolumePackageWithCall(acall, 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!
- */
+/*------------------------------------------------------------------------
+ * PutVolumePackageWithCall
+ *
+ * Description:
+ * This is the opposite of GetVolumePackage(), and is always used at
+ * the end of AFS calls to put back all used vnodes and the volume
+ * in the proper order!
+ *
+ * Arguments:
+ * acall : Ptr to Rx call on which this request came in.
+ * parentwhentargetnotdir : a pointer to the parent when the target isn't
+ * a directory vnode
+ * targetptr : a pointer to the vnode struct
+ * parentptr : a pointer to the parent of this vnode
+ * volptr : a pointer to the volume structure
+ * client : a pointer to the calling client
+ * cbv : struct containing the RX call for offline cancels
+ *
+ * Returns:
+ * Nothing
+ *
+ * Environment:
+ * Nothing interesting.
+ *
+ * Side Effects:
+ * Enables keepalives on the call.
+ *------------------------------------------------------------------------*/
static void
-PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
- Vnode * parentptr, Volume * volptr, struct client **client)
+PutVolumePackageWithCall(struct rx_call *acall, Vnode *
+ parentwhentargetnotdir, Vnode * targetptr,
+ Vnode * parentptr, Volume * volptr,
+ struct client **client, struct VCallByVol *cbv)
{
- int fileCode = 0; /* Error code returned by the volume package */
+ Error fileCode = 0; /* Error code returned by the volume package */
+ rx_KeepAliveOff(acall);
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);
}
+ rx_KeepAliveOn(acall);
+
if (*client) {
PutClient(client);
}
} /*PutVolumePackage */
+static_inline void
+PutVolumePackage(struct rx_call *acall, Vnode * parentwhentargetnotdir,
+ Vnode * targetptr, Vnode * parentptr, Volume * volptr,
+ struct client **client)
+{
+ PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
+ parentptr, volptr, client, NULL);
+}
+
static int
-VolumeOwner(register struct client *client, register Vnode * targetptr)
+VolumeOwner(struct client *client, Vnode * targetptr)
{
afs_int32 owner = V_owner(targetptr->volumePtr); /* get volume owner */
if (owner >= 0)
return (client->ViceId == owner);
else {
- /*
+ /*
* We don't have to check for host's cps since only regular
* viceid are volume owners.
*/
* StoreStatus) related calls
*/
/* this code should probably just set a "priv" flag where all the audit events
- * are now, and only generate the audit event once at the end of the routine,
+ * are now, and only generate the audit event once at the end of the routine,
* thus only generating the event if all the checks succeed, but only because
* of the privilege XXX
*/
afs_int32 rights, int CallingRoutine,
AFSStoreStatus * InStatus)
{
- int errorCode = 0;
+ Error errorCode = 0;
#define OWNSp(client, target) ((client)->ViceId == (target)->disk.owner)
#define CHOWN(i,t) (((i)->Mask & AFS_SETOWNER) &&((i)->Owner != (t)->disk.owner))
#define CHGRP(i,t) (((i)->Mask & AFS_SETGROUP) &&((i)->Group != (t)->disk.group))
} 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
{
char *eACL; /* External access list placeholder */
- if (acl_Externalize
- ((targetptr->disk.type ==
+ if (acl_Externalize_pr
+ (hpr_IdToName, (targetptr->disk.type ==
vDirectory ? VVnodeACL(targetptr) :
VVnodeACL(parentwhentargetnotdir)), &eACL) != 0) {
return EIO;
{
struct acl_accessList *newACL; /* PlaceHolder for new access list */
- if (acl_Internalize(AccessList->AFSOpaque_val, &newACL) != 0)
+ if (acl_Internalize_pr(hpr_NameToId, AccessList->AFSOpaque_val, &newACL)
+ != 0)
return (EINVAL);
if ((newACL->size + 4) > VAclSize(targetptr))
return (E2BIG);
* disk.inodeNumber and cloned)
*/
#define COPYBUFFSIZE 8192
+#define MAXFSIZE (~(afs_fsize_t) 0)
static int
-CopyOnWrite(Vnode * targetptr, Volume * volptr)
+CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_foff_t off, afs_fsize_t len)
{
- Inode ino, nearInode;
- int rdlen;
- int wrlen;
- register afs_fsize_t size;
- register int length;
+ 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 */
IHandle_t *newH; /* Use until finished copying, then cp to vnode. */
DFlush(); /* just in case? */
VN_GET_LEN(size, targetptr);
+ if (size > off)
+ size -= off;
+ else
+ size = 0;
+ if (size > len)
+ size = len;
+
buff = (char *)malloc(COPYBUFFSIZE);
if (buff == NULL) {
return EIO;
ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
volptr->hashid));
return EIO;
- }
+ }
targFdP = IH_OPEN(targetptr->handle);
if (targFdP == NULL) {
rc = errno;
}
IH_INIT(newH, V_device(volptr), V_id(volptr), ino);
newFdP = IH_OPEN(newH);
- assert(newFdP != NULL);
+ osi_Assert(newFdP != NULL);
+ done = off;
while (size > 0) {
if (size > COPYBUFFSIZE) { /* more than a buffer */
length = COPYBUFFSIZE;
size -= COPYBUFFSIZE;
} else {
- length = (int)size;
+ 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
* error code indicates that the disk is full, we roll-back to
* the initial state.
*/
- if ((rdlen != length) || (wrlen != length))
+ if ((rdlen != length) || (wrlen != length)) {
if ((wrlen < 0) && (errno == ENOSPC)) { /* disk full */
ViceLog(0,
("CopyOnWrite failed: Partition %s containing volume %u is full\n",
free(buff);
return ENOSPC;
} else {
+ /* length, rdlen, and wrlen may or may not be 64-bits wide;
+ * since we never do any I/O anywhere near 2^32 bytes at a
+ * time, just case to an unsigned int for printing */
+
ViceLog(0,
("CopyOnWrite failed: volume %u in partition %s (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
- V_id(volptr), volptr->partition->name, length, rdlen,
- wrlen, errno));
+ V_id(volptr), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
+ (unsigned)wrlen, errno));
#if defined(AFS_DEMAND_ATTACH_FS)
ViceLog(0, ("CopyOnWrite failed: requesting salvage\n"));
#else
VTakeOffline(volptr);
return EIO;
}
-#ifndef AFS_PTHREAD_ENV
- IOMGR_Poll();
-#endif /* !AFS_PTHREAD_ENV */
+ }
}
FDH_REALLYCLOSE(targFdP);
rc = IH_DEC(V_linkHandle(volptr), VN_GET_INO(targetptr),
V_parentId(volptr));
- 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);
return 0; /* success */
} /*CopyOnWrite */
-
/*
* Common code to handle with removing the Name (file when it's called from
* SAFS_RemoveFile() or an empty dir when called from SAFS_rmdir()) from a
DirHandle * dir, AFSFid * fileFid, char *Name, int ChkForDir)
{
DirHandle childdir; /* Handle for dir package I/O */
- int errorCode = 0;
+ Error errorCode = 0;
int code;
+ afs_ino_str_t stmp;
/* 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))) {
+ if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) {
ViceLog(20,
("DeleteTarget %s: CopyOnWrite failed %d\n", Name,
errorCode));
/* 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(&childdir);
FidZap(&childdir);
if (errorCode == -1) {
ViceLog(0,
("DT: inode=%s, name=%s, errno=%d\n",
- PrintInode(NULL, VN_GET_INO(*targetptr)), Name,
+ PrintInode(stmp, VN_GET_INO(*targetptr)), Name,
errno));
if (errno != ENOENT)
{
(*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,
*/
static void
Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
- int author, int linkcount,
-#if FS_STATS_DETAILED
- char a_inSameNetwork
-#endif /* FS_STATS_DETAILED */
- )
+ int author, int linkcount, char a_inSameNetwork)
{
afs_fsize_t newlength; /* Holds new directory length */
afs_fsize_t parentLength;
- int errorCode;
-#if FS_STATS_DETAILED
+ Error errorCode;
Date currDate; /*Current date */
int writeIdx; /*Write index to bump */
int timeIdx; /*Authorship time index to bump */
-#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
* XXX But we still don't check the error since we're dealing with dirs here and really the increase
}
VN_SET_LEN(parentptr, newlength);
-#if FS_STATS_DETAILED
/*
* Update directory write stats for this volume. Note that the auth
* counter is located immediately after its associated ``distance''
} else {
V_stat_dirDiffAuthor(volptr, timeIdx)++;
}
-#endif /* FS_STATS_DETAILED */
parentptr->disk.author = author;
parentptr->disk.linkCount = linkcount;
Vnode * parentptr, Volume * volptr,
afs_fsize_t length)
{
-#if FS_STATS_DETAILED
Date currDate; /*Current date */
int writeIdx; /*Write index to bump */
int timeIdx; /*Authorship time index to bump */
-#endif /* FS_STATS_DETAILED */
if (Caller & (TVS_CFILE | TVS_SLINK | TVS_MKDIR)) { /* initialize new file */
targetptr->disk.parent = parentptr->vnodeNumber;
targetptr->disk.linkCount = (Caller & TVS_MKDIR ? 2 : 1);
/* the inode was created in Alloc_NewVnode() */
}
-#if FS_STATS_DETAILED
/*
* Update file write stats for this volume. Note that the auth
* counter is located immediately after its associated ``distance''
V_stat_fileDiffAuthor(volptr, timeIdx)++;
}
}
-#endif /* FS_STATS_DETAILED */
if (!(Caller & TVS_SSTATUS))
targetptr->disk.author = client->ViceId;
AdjustDiskUsage(Volume * volptr, afs_sfsize_t length,
afs_sfsize_t checkLength)
{
- int rc;
- int nc;
+ Error rc;
+ Error nc;
VAdjustDiskUsage(&rc, volptr, length, checkLength);
if (rc) {
Vnode ** targetptr, char *Name, struct AFSFid *OutFid,
int FileType, afs_sfsize_t BlocksPreallocatedForVnode)
{
- int errorCode = 0; /* Error code returned back */
- int temp;
+ 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,
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);
if (parentptr->disk.cloned) {
ViceLog(25, ("Alloc_NewVnode : CopyOnWrite called\n"));
- if ((errorCode = CopyOnWrite(parentptr, volptr))) { /* disk full */
+ if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) { /* disk full */
ViceLog(25, ("Alloc_NewVnode : CopyOnWrite failed\n"));
/* delete the vnode previously allocated */
(*targetptr)->delete = 1;
if (IH_DEC(V_linkHandle(volptr), inode, V_parentId(volptr)))
ViceLog(0,
("Alloc_NewVnode: partition %s idec %s failed\n",
- volptr->partition->name, PrintInode(NULL, inode)));
+ volptr->partition->name, PrintInode(stmp, inode)));
IH_RELEASE((*targetptr)->handle);
return errorCode;
/* 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);
if (IH_DEC(V_linkHandle(volptr), inode, V_parentId(volptr)))
ViceLog(0,
("Alloc_NewVnode: partition %s idec %s failed\n",
- volptr->partition->name, PrintInode(NULL, inode)));
+ volptr->partition->name, PrintInode(stmp, inode)));
IH_RELEASE((*targetptr)->handle);
return (errorCode);
}
0;
Time += AFS_LOCKWAIT;
if (LockingType == LockRead) {
- if ( !(rights & PRSFS_LOCK) &&
+ if ( !(rights & PRSFS_LOCK) &&
!(rights & PRSFS_WRITE) &&
!(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)) )
return(EACCES);
} else
return (EAGAIN);
} else if (LockingType == LockWrite) {
- if ( !(rights & PRSFS_WRITE) &&
+ if ( !(rights & PRSFS_WRITE) &&
!(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)) )
return(EACCES);
if (strlen(Name) > 0) {
strcpy(V_name(volptr), Name);
}
-#if OPENAFS_VOL_STATS
/*
* We don't overwrite the motd field, since it's now being used
* for stats
*/
-#else
- if (strlen(Motd) > 0) {
- strcpy(V_motd(volptr), Motd);
- }
-#endif /* FS_STATS_DETAILED */
VUpdateVolume(&errorCode, volptr);
return (errorCode);
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);
- }
- strcpy(*motd, V_motd(volptr));
-#endif /* FS_STATS_DETAILED */
return 0;
} /*RXGetVolumeStatus */
static afs_int32
-FileNameOK(register char *aname)
+FileNameOK(char *aname)
{
- register afs_int32 i, tc;
+ afs_int32 i, tc;
i = strlen(aname);
if (i >= 4) {
/* watch for @sys on the right */
}
afs_int32
-SRXAFS_ResidencyCmd(struct rx_call * acall, struct AFSFid * Fid,
- struct ResidencyCmdInputs * Inputs,
- struct ResidencyCmdOutputs * Outputs)
+SRXAFS_FsCmd(struct rx_call * acall, struct AFSFid * Fid,
+ struct FsCmdInputs * Inputs,
+ struct FsCmdOutputs * Outputs)
{
- return EINVAL;
+ afs_int32 code = 0;
+
+ switch (Inputs->command) {
+ default:
+ code = EINVAL;
+ }
+ ViceLog(1,("FsCmd: cmd = %d, code=%d\n",
+ Inputs->command, Outputs->code));
+ 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
-FreeSendBuffer(register struct afs_buffer *adata)
+static int
+FreeSendBuffer(struct afs_buffer *adata)
{
FS_LOCK;
afs_buffersAlloced--;
/* allocate space for sender */
static char *
-AllocSendBuffer()
+AllocSendBuffer(void)
{
- register struct afs_buffer *tp;
+ struct afs_buffer *tp;
FS_LOCK;
afs_buffersAlloced++;
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
GetStatus(Vnode * targetptr, AFSFetchStatus * status, afs_int32 rights,
afs_int32 anyrights, Vnode * parentptr)
{
+ int Time =FT_ApproxTime();
+
/* initialize return status from a vnode */
status->InterfaceVersion = 1;
status->SyncCounter = status->dataVersionHigh = status->lockCount =
Directory ? targetptr->disk.uniquifier : parentptr->disk.uniquifier);
status->ServerModTime = targetptr->disk.serverModifyTime;
status->Group = targetptr->disk.group;
- status->lockCount = targetptr->disk.lock.lockCount;
+ status->lockCount = Time > targetptr->disk.lock.lockTime ? 0 : targetptr->disk.lock.lockCount;
status->errorCode = 0;
} /*GetStatus */
-static
- afs_int32
+static afs_int32
common_FetchData64(struct rx_call *acall, struct AFSFid *Fid,
afs_sfsize_t Pos, afs_sfsize_t Len,
struct AFSFetchStatus *OutStatus,
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if vptr is a file */
Vnode tparentwhentargetnotdir; /* parent vnode for GetStatus */
- int errorCode = 0; /* return code to caller */
- int fileCode = 0; /* return code from vol package */
+ Error errorCode = 0; /* return code to caller */
+ Error fileCode = 0; /* return code from vol package */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
struct rx_connection *tcon; /* the connection we're part of */
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 */
-#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 */
+ 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 */
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;
- TM_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,
("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(acall, cbv, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_FetchData;
SetVolumeSync(Sync, volptr);
-#if FS_STATS_DETAILED
/*
* Remember that another read operation was performed.
*/
V_stat_reads(volptr, readIdx + 1)++;
}
FS_UNLOCK;
-#endif /* FS_STATS_DETAILED */
/* Check whether the caller has permission access to fetch the data */
if ((errorCode =
Check_PermissionRights(targetptr, client, rights, CHK_FETCHDATA, 0)))
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.
- */
- TM_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.
- */
- TM_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,
&tparentwhentargetnotdir);
+ rx_KeepAliveOn(acall); /* I/O done */
+
/* if a r/w volume, promise a callback to the caller */
if (VolumeWriteable(volptr))
SetCallBackStruct(AddCallBack(client->host, Fid), CallBack);
Bad_FetchData:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client, cbv);
ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, FetchDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return (errorCode);
afs_int32 Len, struct AFSFetchStatus * OutStatus,
struct AFSCallBack * CallBack, struct AFSVolSync * Sync)
{
- return common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack,
+ return common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack,
Sync, 0);
}
int code;
afs_sfsize_t tPos, tLen;
-#ifdef AFS_64BIT_ENV
-#ifndef AFS_LARGEFILE_ENV
- if (Pos + Len > 0x7fffffff)
- return EFBIG;
-#endif /* !AFS_LARGEFILE_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,
{
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
- int errorCode = 0; /* return error code to caller */
+ Error errorCode = 0; /* return error code to caller */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
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;
- TM_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"));
}
/*
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_FetchACL;
Bad_FetchACL:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
ViceLog(2,
("SAFS_FetchACL returns %d (ACL=%s)\n", errorCode,
AccessList->AFSOpaque_val));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, FetchACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid,
+ AUD_FID, Fid,
AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
} /*SRXAFS_FetchACL */
* This routine is called exclusively by SRXAFS_FetchStatus(), and should be
* merged into it when possible.
*/
-static
- afs_int32
+static afs_int32
SAFSS_FetchStatus(struct rx_call *acall, struct AFSFid *Fid,
struct AFSFetchStatus *OutStatus,
struct AFSCallBack *CallBack, struct AFSVolSync *Sync)
{
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
- int errorCode = 0; /* return code to caller */
+ Error errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
* also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_FetchStatus;
+ rx_KeepAliveOn(acall);
+
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
Bad_FetchStatus:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
ViceLog(2, ("SAFS_FetchStatus returns %d\n", errorCode));
return errorCode;
struct AFSBulkStats * OutStats, struct AFSCBs * CallBacks,
struct AFSVolSync * Sync)
{
- register int i;
+ int i;
afs_int32 nfiles;
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
- int errorCode = 0; /* return code to caller */
+ Error errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
- register struct AFSFid *tfid; /* file id we're dealing with now */
+ struct AFSFid *tfid; /* file id we're dealing with now */
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;
- TM_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;
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_BulkStatus;
+
+ rx_KeepAliveOn(acall);
+
/* set volume synchronization information, but only once per call */
- if (i == nfiles)
+ if (i == 0)
SetVolumeSync(Sync, volptr);
/* Are we allowed to fetch Fid's status? */
}
/* put back the file ID and volume */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
Bad_BulkStatus:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
errorCode = CallPostamble(tcon, errorCode, thost);
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- TM_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));
- osi_auditU(acall, BulkFetchStatusEvent, errorCode,
+ osi_auditU(acall, BulkFetchStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FIDS, Fids, AUD_END);
return errorCode;
struct AFSBulkStats * OutStats,
struct AFSCBs * CallBacks, struct AFSVolSync * Sync)
{
- register int i;
+ int i;
afs_int32 nfiles;
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
- int errorCode = 0; /* return code to caller */
+ Error errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
- register struct AFSFid *tfid; /* file id we're dealing with now */
+ struct AFSFid *tfid; /* file id we're dealing with now */
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
AFSFetchStatus *tstatus;
-#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 */
+ int VolSync_set = 0;
+ 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;
- TM_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;
+ /* Zero out return values to avoid leaking information on partial succes */
+ memset(OutStats->AFSBulkStats_val, 0, nfiles * sizeof(struct AFSFetchStatus));
+ memset(CallBacks->AFSCBs_val, 0, nfiles * sizeof(struct AFSCallBack));
+ memset(Sync, 0, sizeof(*Sync));
+
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))) {
goto Bad_InlineBulkStatus;
}
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights))) {
tstatus = &OutStats->AFSBulkStats_val[i];
tstatus->errorCode = errorCode;
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
continue;
}
+ rx_KeepAliveOn(acall);
+
/* set volume synchronization information, but only once per call */
- if (i == nfiles)
+ if (!VolSync_set) {
SetVolumeSync(Sync, volptr);
+ VolSync_set = 1;
+ }
/* Are we allowed to fetch Fid's status? */
if (targetptr->disk.type != vDirectory) {
CHK_FETCHSTATUS, 0))) {
tstatus = &OutStats->AFSBulkStats_val[i];
tstatus->errorCode = errorCode;
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr,
- (Vnode *) 0, volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir,
+ targetptr, (Vnode *) 0, volptr,
+ &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
}
/* put back the file ID and volume */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
client = (struct client *)0;
}
+ errorCode = 0;
Bad_InlineBulkStatus:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
errorCode = CallPostamble(tcon, errorCode, thost);
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- TM_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));
- osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
+ osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FIDS, Fids, AUD_END);
- return 0;
+ return errorCode;
} /*SRXAFS_InlineBulkStatus */
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;
- TM_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
- TM_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,
+ osi_auditU(acall, FetchStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
Vnode *targetptr = 0; /* pointer to input fid */
Vnode *parentwhentargetnotdir = 0; /* parent of Fid to get ACL */
Vnode tparentwhentargetnotdir; /* parent vnode for GetStatus */
- int errorCode = 0; /* return code for caller */
- int fileCode = 0; /* return code from vol package */
+ Error errorCode = 0; /* return code for caller */
+ Error fileCode = 0; /* return code from vol package */
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 */
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));
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STOREDATA);
FS_LOCK;
AFSCallStats.StoreData++, AFSCallStats.TotalCalls++;
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, MustNOTBeDIR,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, MustNOTBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_StoreData;
}
+ rx_KeepAliveOn(acall);
+
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
*/
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
+ rx_KeepAliveOff(acall);
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ rx_KeepAliveOn(acall);
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
parentwhentargetnotdir = NULL;
}
-#if FS_STATS_DETAILED
- /*
- * Remember when the data transfer started.
- */
- TM_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.
- */
- TM_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 */
+ rx_KeepAliveOff(acall);
/* Update the status of the target's vnode */
Update_TargetVnodeStatus(targetptr, TVS_SDATA, client, InStatus,
targetptr, volptr, 0);
+ rx_KeepAliveOn(acall);
/* Get the updated File's status back to the caller */
GetStatus(targetptr, OutStatus, rights, anyrights,
Bad_StoreData:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
ViceLog(2, ("SAFS_StoreData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- TM_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 */
- osi_auditU(acall, StoreDataEvent, errorCode,
+ fsstats_FinishOp(&fsstats, errorCode);
+
+ osi_auditU(acall, StoreDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return (errorCode);
afs_uint32 Length, afs_uint32 FileLength,
struct AFSFetchStatus * OutStatus, struct AFSVolSync * Sync)
{
- if (FileLength > 0x7fffffff || Pos > 0x7fffffff ||
+ if (FileLength > 0x7fffffff || Pos > 0x7fffffff ||
(0x7fffffff - Pos) < Length)
return EFBIG;
afs_fsize_t tLength;
afs_fsize_t tFileLength;
-#ifdef AFS_64BIT_ENV
-#ifndef AFS_LARGEFILE_ENV
- if (FileLength > 0x7fffffff)
- return EFBIG;
-#endif /* !AFS_LARGEFILE_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,
{
Vnode *targetptr = 0; /* pointer to input fid */
Vnode *parentwhentargetnotdir = 0; /* parent of Fid to get ACL */
- int errorCode = 0; /* return code for caller */
+ Error errorCode = 0; /* return code for caller */
struct AFSStoreStatus InStatus; /* Input status for fid */
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client structure */
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;
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
goto Bad_StoreACL;
* are also returned.
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, MustBeDIR,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_StoreACL;
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
+
+ rx_KeepAliveOn(acall);
/* break call backs on the directory */
BreakCallBack(client->host, Fid, 0);
Bad_StoreACL:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_StoreACL returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, StoreACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
{
Vnode *targetptr = 0; /* pointer to input fid */
Vnode *parentwhentargetnotdir = 0; /* parent of Fid to get ACL */
- int errorCode = 0; /* return code for caller */
+ Error errorCode = 0; /* return code for caller */
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 */
* also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_StoreStatus;
(parentwhentargetnotdir ? parentwhentargetnotdir
: targetptr), volptr, 0);
+ rx_KeepAliveOn(acall);
+
/* 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);
Bad_StoreStatus:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_StoreStatus returns %d\n", errorCode));
return errorCode;
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;
- TM_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
- TM_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,
+ osi_auditU(acall, StoreStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
Vnode *targetptr = 0; /* file to be deleted */
Volume *volptr = 0; /* pointer to the volume header */
AFSFid fileFid; /* area for Fid from the directory */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
* also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_RemoveFile;
}
/* Update the vnode status of the parent dir */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
parentptr->disk.linkCount,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+
+ rx_KeepAliveOn(acall);
/* Return the updated parent dir's status back to caller */
GetStatus(parentptr, OutDirStatus, rights, anyrights, 0);
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);
}
Bad_RemoveFile:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_RemoveFile returns %d\n", errorCode));
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;
- TM_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
- TM_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,
+ osi_auditU(acall, RemoveFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
Vnode *targetptr = 0; /* vnode of the new file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
Volume *volptr = 0; /* pointer to the volume header */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
* also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_CreateFile;
if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))) {
goto Bad_CreateFile;
}
+
/* get a new vnode for the file to be created and set it up */
if ((errorCode =
Alloc_NewVnode(parentptr, &dir, volptr, &targetptr, Name, OutFid,
- vFile, nBlocks(0)))) {
+ vFile, nBlocks(0))))
goto Bad_CreateFile;
- }
/* update the status of the parent vnode */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
parentptr->disk.linkCount,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
/* update the status of the new file's vnode */
Update_TargetVnodeStatus(targetptr, TVS_CFILE, client, InStatus,
parentptr, volptr, 0);
+ rx_KeepAliveOn(acall);
+
/* set up the return status for the parent dir and the newly created file, and since the newly created file is owned by the creator, give it PRSFS_ADMINISTER to tell the client its the owner of the file */
GetStatus(targetptr, OutFidStatus, rights | PRSFS_ADMINISTER, anyrights, parentptr);
GetStatus(parentptr, OutDirStatus, rights, anyrights, 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);
Bad_CreateFile:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_CreateFile returns %d\n", errorCode));
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;
- TM_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
- TM_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,
+ osi_auditU(acall, CreateFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_FID, OutFid, AUD_END);
return code;
Vnode *newfileptr = 0; /* vnode of the file to delete */
Vnode *testvptr = 0; /* used in directory tree walk */
Vnode *parent = 0; /* parent for use in SetAccessList */
- int errorCode = 0; /* error code */
- int fileCode = 0; /* used when writing Vnodes */
+ Error errorCode = 0; /* error code */
+ Error fileCode = 0; /* used when writing Vnodes */
VnodeId testnode; /* used in directory tree walk */
AFSFid fileFid; /* Fid of file to move */
AFSFid newFileFid; /* Fid of new file */
afs_int32 newanyrights; /* rights for any user */
int doDelete; /* deleted the rename target (ref count now 0) */
int code;
+ int updatefile = 0; /* are we changing the renamed file? (we do this
+ * if we need to update .. on a renamed dir) */
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);
+ afs_ino_str_t stmp;
FidZero(&olddir);
FidZero(&newdir);
if (OldDirFid->Vnode <= NewDirFid->Vnode) {
if ((errorCode =
- GetVolumePackage(tcon, OldDirFid, &volptr, &oldvptr, MustBeDIR,
+ GetVolumePackage(acall, OldDirFid, &volptr, &oldvptr, MustBeDIR,
&parent, &client, WRITE_LOCK, &rights,
&anyrights))) {
DFlush();
newrights = rights, newanyrights = anyrights;
} else
if ((errorCode =
- GetVolumePackage(tcon, NewDirFid, &volptr, &newvptr,
+ GetVolumePackage(acall, NewDirFid, &volptr, &newvptr,
MustBeDIR, &parent, &client, WRITE_LOCK,
&newrights, &newanyrights))) {
DFlush();
}
} else {
if ((errorCode =
- GetVolumePackage(tcon, NewDirFid, &volptr, &newvptr, MustBeDIR,
+ GetVolumePackage(acall, NewDirFid, &volptr, &newvptr, MustBeDIR,
&parent, &client, WRITE_LOCK, &newrights,
&newanyrights))) {
DFlush();
goto Bad_Rename;
}
if ((errorCode =
- GetVolumePackage(tcon, OldDirFid, &volptr, &oldvptr, MustBeDIR,
+ GetVolumePackage(acall, OldDirFid, &volptr, &oldvptr, MustBeDIR,
&parent, &client, WRITE_LOCK, &rights,
&anyrights))) {
DFlush();
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
+ * the effects of the first call because the contents of the volume is
* not modified, it is only replicated.
*/
if (oldvptr->disk.cloned) {
ViceLog(25, ("Rename : calling CopyOnWrite on old dir\n"));
- if ((errorCode = CopyOnWrite(oldvptr, volptr)))
+ if ((errorCode = CopyOnWrite(oldvptr, volptr, 0, MAXFSIZE)))
goto Bad_Rename;
}
SetDirHandle(&olddir, oldvptr);
if (newvptr->disk.cloned) {
ViceLog(25, ("Rename : calling CopyOnWrite on new dir\n"));
- if ((errorCode = CopyOnWrite(newvptr, volptr)))
+ if ((errorCode = CopyOnWrite(newvptr, volptr, 0, MAXFSIZE)))
goto Bad_Rename;
}
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);
+ }
+ }
+
+ if (fileptr->disk.type == vDirectory) {
+ SetDirHandle(&filedir, fileptr);
+ if (oldvptr != newvptr) {
+ /* we always need to update .. if we've moving fileptr to a
+ * different directory */
+ updatefile = 1;
+ } else {
+ struct AFSFid unused;
+
+ code = afs_dir_Lookup(&filedir, "..", &unused);
+ if (code == ENOENT) {
+ /* only update .. if it doesn't already exist */
+ updatefile = 1;
+ }
}
}
+
/* Do the CopyonWrite first before modifying anything else. Copying is
- * required because we may have to change entries for ..
+ * required when we have to change entries for ..
*/
- if ((fileptr->disk.type == vDirectory) && (fileptr->disk.cloned)) {
+ if (updatefile && (fileptr->disk.cloned)) {
ViceLog(25, ("Rename : calling CopyOnWrite on target dir\n"));
- if ((errorCode = CopyOnWrite(fileptr, volptr)))
+ 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--;
if (errorCode == -1) {
ViceLog(0,
("Del: inode=%s, name=%s, errno=%d\n",
- PrintInode(NULL, VN_GET_INO(newfileptr)),
+ PrintInode(stmp, VN_GET_INO(newfileptr)),
NewName, errno));
if ((errno != ENOENT) && (errno != EIO)
&& (errno != ENXIO))
* 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
Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
oldvptr->disk.linkCount, client->InSameNetwork);
Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
newvptr->disk.linkCount, client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
- oldvptr->disk.linkCount);
- Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
- newvptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
if (oldvptr == newvptr)
oldvptr->disk.dataVersion--; /* Since it was bumped by 2! */
- fileptr->disk.parent = newvptr->vnodeNumber;
- fileptr->changed_newTime = 1; /* status change of moved file */
+ if (fileptr->disk.parent != newvptr->vnodeNumber) {
+ fileptr->disk.parent = newvptr->vnodeNumber;
+ fileptr->changed_newTime = 1;
+ }
+
+ /* if we are dealing with a rename of a directory, and we need to
+ * update the .. entry of that directory */
+ if (updatefile) {
+ osi_Assert(!fileptr->disk.cloned);
+
+ fileptr->changed_newTime = 1; /* status change of moved file */
- /* if we are dealing with a rename of a directory */
- if (fileptr->disk.type == vDirectory) {
- assert(!fileptr->disk.cloned);
- SetDirHandle(&filedir, fileptr);
/* 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 */
/* changed due to .. in the renamed directory */
if (oldvptr != newvptr) {
/* 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);
}
+ rx_KeepAliveOn(acall);
+
/* break call back on NewDirFid, OldDirFid, NewDirFid and newFileFid */
BreakCallBack(client->host, NewDirFid, 0);
if (oldvptr != newvptr) {
BreakCallBack(client->host, OldDirFid, 0);
- if (fileptr->disk.type == vDirectory) /* if a dir moved, .. changed */
- BreakCallBack(client->host, &fileFid, 0);
+ }
+ if (updatefile) {
+ /* if a dir moved, .. changed */
+ /* we do not give an AFSFetchStatus structure back to the
+ * originating client, and the file's status has changed, so be
+ * sure to send a callback break. In theory the client knows
+ * enough to know that the callback could be broken implicitly,
+ * but that may not be clear, and some client implementations
+ * may not know to. */
+ BreakCallBack(client->host, &fileFid, 1);
}
if (newfileptr) {
/* Note: it is not necessary to break the callback */
Bad_Rename:
if (newfileptr) {
+ rx_KeepAliveOff(acall);
VPutVnode(&fileCode, newfileptr);
- assert(fileCode == 0);
+ osi_Assert(fileCode == 0);
}
- (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
+ (void)PutVolumePackage(acall, fileptr, (newvptr && newvptr != oldvptr ?
newvptr : 0), oldvptr, volptr, &client);
FidZap(&olddir);
FidZap(&newdir);
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;
- TM_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
- TM_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,
+ osi_auditU(acall, RenameFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, OldDirFid, AUD_STR, OldName,
+ AUD_FID, OldDirFid, AUD_STR, OldName,
AUD_FID, NewDirFid, AUD_STR, NewName, AUD_END);
return code;
Vnode *parentptr = 0; /* vnode of input Directory */
Vnode *targetptr = 0; /* vnode of the new link */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
- int errorCode = 0; /* error code */
- int len, code = 0;
+ Error errorCode = 0; /* error code */
+ afs_sfsize_t len;
+ int code = 0;
DirHandle dir; /* Handle for dir package I/O */
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client structure */
* rights to it
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
- &rights, &anyrights))) {
+ &rights, &anyrights)))
goto Bad_SymLink;
- }
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
/* Does the caller has insert (and write) access to the parent directory? */
- if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))) {
+ if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT)))
goto Bad_SymLink;
- }
/*
* If we're creating a mount point (any x bits clear), we must have
}
/* update the status of the parent vnode */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
parentptr->disk.linkCount,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
/* update the status of the new symbolic link file vnode */
Update_TargetVnodeStatus(targetptr, TVS_SLINK, client, InStatus,
/* Write the contents of the symbolic link name into the target inode */
fdP = IH_OPEN(targetptr->handle);
if (fdP == NULL) {
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ parentptr, volptr, &client);
VTakeOffline(volptr);
ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
volptr->hashid));
return EIO;
- }
+ }
len = strlen((char *) LinkContents);
- code = (len == FDH_WRITE(fdP, (char *) LinkContents, len)) ? 0 : VDISKFULL;
- if (code)
- ViceLog(0, ("SAFSS_Symlink FDH_WRITE failed for len=%d, Fid=%u.%d.%d\n", len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
+ code = (len == FDH_PWRITE(fdP, (char *) LinkContents, len, 0)) ? 0 : VDISKFULL;
+ if (code)
+ 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);
+
+ rx_KeepAliveOn(acall);
/* break call back on the parent dir */
BreakCallBack(client->host, DirFid, 0);
Bad_SymLink:
/* Write the all modified vnodes (parent, new files) and volume back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_Symlink returns %d\n", errorCode));
afs_int32
-SRXAFS_Symlink(acall, DirFid, Name, LinkContents, InStatus, OutFid,
- OutFidStatus, OutDirStatus, Sync)
- struct AFSVolSync *Sync;
- struct rx_call *acall; /* Rx call */
- struct AFSFid *DirFid; /* Parent dir's fid */
- char *Name; /* File name to create */
- char *LinkContents; /* Contents of the new created file */
- struct AFSStoreStatus *InStatus; /* Input status for the new symbolic link */
- struct AFSFid *OutFid; /* Fid for newly created symbolic link */
- struct AFSFetchStatus *OutFidStatus; /* Output status for new symbolic link */
- struct AFSFetchStatus *OutDirStatus; /* Output status for parent dir */
-
+SRXAFS_Symlink(struct rx_call *acall, /* Rx call */
+ struct AFSFid *DirFid, /* Parent dir's fid */
+ char *Name, /* File name to create */
+ char *LinkContents, /* Contents of the new created file */
+ struct AFSStoreStatus *InStatus, /* Input status for the new symbolic link */
+ struct AFSFid *OutFid, /* Fid for newly created symbolic link */
+ struct AFSFetchStatus *OutFidStatus, /* Output status for new symbolic link */
+ struct AFSFetchStatus *OutDirStatus, /* Output status for parent dir */
+ struct AFSVolSync *Sync)
{
afs_int32 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_SYMLINK]);
- FS_LOCK;
- (opP->numOps)++;
- FS_UNLOCK;
- TM_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
- TM_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,
+ osi_auditU(acall, SymlinkEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_STR, LinkContents, AUD_END);
return code;
Vnode *targetptr = 0; /* vnode of the new file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
Volume *volptr = 0; /* pointer to the volume header */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
* rights to it
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_Link;
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))) {
goto Bad_Link;
}
+
if (targetptr->disk.type != vFile) {
errorCode = EISDIR;
goto Bad_Link;
}
if (parentptr->disk.cloned) {
ViceLog(25, ("Link : calling CopyOnWrite on target dir\n"));
- if ((errorCode = CopyOnWrite(parentptr, volptr)))
+ if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE)))
goto Bad_Link; /* disk full error */
}
/* 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();
/* update the status in the parent vnode */
/**WARNING** --> disk.author SHOULDN'T be modified???? */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
parentptr->disk.linkCount,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
targetptr->disk.linkCount++;
targetptr->disk.author = client->ViceId;
/* 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);
+
+ rx_KeepAliveOn(acall);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
/*
- * We also need to break the callback for the file that is hard-linked since part
+ * We also need to break the callback for the file that is hard-linked since part
* of its status (like linkcount) is changed
*/
BreakCallBack(client->host, ExistingFid, 0);
Bad_Link:
/* Write the all modified vnodes (parent, new files) and volume back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_Link returns %d\n", errorCode));
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;
- TM_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
- TM_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,
+ osi_auditU(acall, LinkEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, ExistingFid, AUD_END);
Vnode *targetptr = 0; /* vnode of the new file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
Volume *volptr = 0; /* pointer to the volume header */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
struct acl_accessList *newACL; /* Access list */
int newACLSize; /* Size of access list */
DirHandle dir; /* Handle for dir package I/O */
* rights to it.
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_MakeDir;
* requires w access for the user to create a directory. this
* closes a loophole in the current security arrangement, since a
* user with i access only can create a directory and get the
- * implcit a access that goes with dir ownership, and proceed to
+ * implcit a access that goes with dir ownership, and proceed to
* subvert quota in the volume.
*/
if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))
}
/* Update the status for the parent dir */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
parentptr->disk.linkCount + 1,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
- parentptr->disk.linkCount + 1);
-#endif /* FS_STATS_DETAILED */
/* Point to target's ACL buffer and copy the parent's ACL contents to it */
- 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, OutFid, 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);
+
+ rx_KeepAliveOn(acall);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
Bad_MakeDir:
/* Write the all modified vnodes (parent, new files) and volume back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
FidZap(&parentdir);
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;
- TM_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
- TM_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,
+ osi_auditU(acall, MakeDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_END);
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
Vnode *targetptr = 0; /* file to be deleted */
AFSFid fileFid; /* area for Fid from the directory */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
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 to it
*/
if ((errorCode =
- GetVolumePackage(tcon, DirFid, &volptr, &parentptr, MustBeDIR,
+ GetVolumePackage(acall, DirFid, &volptr, &parentptr, MustBeDIR,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_RemoveDir;
}
- 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,
}
/* Update the status for the parent dir; link count is also adjusted */
-#if FS_STATS_DETAILED
Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
parentptr->disk.linkCount - 1,
client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount - 1);
-#endif /* FS_STATS_DETAILED */
/* Return to the caller the updated parent dir status */
GetStatus(parentptr, OutDirStatus, rights, anyrights, NULL);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
+
+ rx_KeepAliveOn(acall);
/* break call back on DirFid and fileFid */
BreakCallBack(client->host, DirFid, 0);
Bad_RemoveDir:
/* Write the all modified vnodes (parent, new files) and volume back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_RemoveDir returns %d\n", errorCode));
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;
- TM_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
- TM_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,
+ osi_auditU(acall, RemoveDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
{
Vnode *targetptr = 0; /* vnode of input file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
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 */
* rights to it
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_SetLock;
Bad_SetLock:
/* Write the all modified vnodes (parent, new files) and volume back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
if ((errorCode == VREADONLY) && (type == LockRead))
errorCode = 0; /* allow read locks on RO volumes without saving state */
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;
- TM_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
- TM_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,
+ osi_auditU(acall, SetLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_LONG, type, AUD_END);
return code;
} /*SRXAFS_SetLock */
{
Vnode *targetptr = 0; /* vnode of input file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
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 */
* rights to it
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_ExtendLock;
Bad_ExtendLock:
/* Put back file's vnode and volume */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
if ((errorCode == VREADONLY)) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
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;
- TM_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
- TM_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,
+ osi_auditU(acall, ExtendLockEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
{
Vnode *targetptr = 0; /* vnode of input file */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
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 */
* rights to it
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, WRITE_LOCK,
&rights, &anyrights))) {
goto Bad_ReleaseLock;
/* if no more locks left, a callback would be triggered here */
if (targetptr->disk.lock.lockCount <= 0) {
+ rx_KeepAliveOn(acall);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
BreakCallBack(client->host, Fid, 0);
}
Bad_ReleaseLock:
/* Put back file's vnode and volume */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
if ((errorCode == VREADONLY)) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
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;
- TM_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
- TM_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,
+ osi_auditU(acall, ReleaseLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
struct timeval time;
/* this works on all system types */
- TM_GetTimeOfDay(&time, 0);
+ FT_GetTimeOfDay(&time, 0);
stats->CurrentTime = time.tv_sec;
} /*SetSystemStats */
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;
- TM_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
- TM_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,
+ osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
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;
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
goto Bad_GetStatistics64;
ViceLog(1, ("SAFS_GetStatistics64 Received\n"));
- Statistics->ViceStatistics64_val =
+ Statistics->ViceStatistics64_val =
malloc(statsVersion*sizeof(afs_int64));
Statistics->ViceStatistics64_len = statsVersion;
FS_LOCK;
Statistics->ViceStatistics64_val[STATS64_STARTTIME] = StartTime;
Statistics->ViceStatistics64_val[STATS64_CURRENTCONNECTIONS] =
CurrentConnections;
- Statistics->ViceStatistics64_val[STATS64_TOTALVICECALLS] =
+ Statistics->ViceStatistics64_val[STATS64_TOTALVICECALLS] =
AFSCallStats.TotalCalls;
Statistics->ViceStatistics64_val[STATS64_TOTALFETCHES] =
AFSCallStats.FetchData + AFSCallStats.FetchACL +
AFSCallStats.FetchStatus;
- Statistics->ViceStatistics64_val[STATS64_FETCHDATAS] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHDATAS] =
AFSCallStats.FetchData;
- Statistics->ViceStatistics64_val[STATS64_FETCHEDBYTES] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHEDBYTES] =
AFSCallStats.TotalFetchedBytes;
seconds = AFSCallStats.AccumFetchTime / 1000;
if (seconds <= 0)
seconds = 1;
- Statistics->ViceStatistics64_val[STATS64_FETCHDATARATE] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHDATARATE] =
AFSCallStats.TotalFetchedBytes / seconds;
Statistics->ViceStatistics64_val[STATS64_TOTALSTORES] =
AFSCallStats.StoreData + AFSCallStats.StoreACL +
AFSCallStats.StoreStatus;
- Statistics->ViceStatistics64_val[STATS64_STOREDATAS] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDATAS] =
AFSCallStats.StoreData;
- Statistics->ViceStatistics64_val[STATS64_STOREDBYTES] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDBYTES] =
AFSCallStats.TotalStoredBytes;
seconds = AFSCallStats.AccumStoreTime / 1000;
if (seconds <= 0)
seconds = 1;
- Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
AFSCallStats.TotalStoredBytes / seconds;
#ifdef AFS_NT40_ENV
Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = -1;
#else
- Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
+ Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
(afs_int32) ((long)sbrk(0) >> 10);
#endif
FS_UNLOCK;
- h_GetWorkStats((int *)&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
- (int *)&(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
- (int *)0,
- (afs_int32) (FT_ApproxTime()) - (15 * 60));
+ h_GetWorkStats64(&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
+ &(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
+ 0,
+ (afs_int32) (FT_ApproxTime()) - (15 * 60));
/* this works on all system types */
- TM_GetTimeOfDay(&time, 0);
+ FT_GetTimeOfDay(&time, 0);
Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time.tv_sec;
Bad_GetStatistics64:
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
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;
- TM_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
- TM_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,
+ osi_auditU(a_call, XStatsVersionEvent, 0,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return (0);
} /*SRXAFS_XStatsVersion */
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 */
afs_int32 * a_timeP, AFS_CollData * a_dataP)
{ /*SRXAFS_GetXStats */
- register int code; /*Return value */
+ 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;
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETXSTATS);
/*
* Record the time of day and the server version number.
*/
afs_perfstats.numPerfCalls++;
-#if FS_STATS_DETAILED
afs_FullPerfStats.overall.numPerfCalls = afs_perfstats.numPerfCalls;
FillPerfValues(&afs_FullPerfStats.overall);
memcpy(dataBuffP, &afs_FullPerfStats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
-#endif
break;
case AFS_XSTATSCOLL_CBSTATS:
code = 1;
} /*Switch on collection number */
-#if FS_STATS_DETAILED
- TM_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 AFSCBs *CallBackArray)
{
afs_int32 errorCode = 0;
- register int i;
+ int i;
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;
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GIVEUPCALLBACKS);
if (FidArray)
ViceLog(1,
if (!FidArray && !CallBackArray) {
ViceLog(1,
("SAFS_GiveUpAllCallBacks: host=%x\n",
- (tcon->peer ? tcon->peer->host : 0)));
+ (rx_PeerOf(tcon) ? rx_PeerOf(tcon)->host : 0)));
errorCode = GetClient(tcon, &client);
if (!errorCode) {
H_LOCK;
ViceLog(0,
("GiveUpCallBacks: #Fids %d < #CallBacks %d, host=%x\n",
FidArray->AFSCBFids_len, CallBackArray->AFSCBs_len,
- (tcon->peer ? tcon->peer->host : 0)));
+ (rx_PeerOf(tcon) ? rx_PeerOf(tcon)->host : 0)));
errorCode = EINVAL;
goto Bad_GiveUpCallBacks;
}
errorCode = GetClient(tcon, &client);
if (!errorCode) {
for (i = 0; i < FidArray->AFSCBFids_len; i++) {
- register struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
+ struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
DeleteCallBack(client->host, fid);
}
PutClient(&client);
Bad_GiveUpCallBacks:
errorCode = CallPostamble(tcon, errorCode, thost);
-#if FS_STATS_DETAILED
- TM_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 */
/*
- * Dummy routine. Should never be called (the cache manager should only
+ * Dummy routine. Should never be called (the cache manager should only
* invoke this interface when communicating with a AFS/DFS Protocol
* Translator).
*/
afs_int32 code;
struct rx_connection *tcon;
struct host *thost;
- afs_int32 *dataBuffP;
+ afs_uint32 *dataBuffP;
afs_int32 dataBytes;
FS_LOCK;
goto Bad_GetCaps;
dataBytes = 1 * sizeof(afs_int32);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = (afs_uint32 *) malloc(dataBytes);
dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
-#if defined(AFS_64BIT_ENV) && defined(AFS_LARGEFILE_ENV)
dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
-#endif
if (saneacls)
dataBuffP[0] |= VICED_CAPABILITY_SANEACLS;
int i;
afs_int32 nids, naddrs;
afs_int32 *vd, *addr;
- int errorCode = 0; /* return code to caller */
+ Error errorCode = 0; /* return code to caller */
struct client *client = 0;
- struct rx_connection *tcon = rx_ConnectionOf(acall);
ViceLog(1, ("SRXAFS_FlushCPS\n"));
FS_LOCK;
/* worthless hack to let CS keep running ancient software */
static int
-afs_vtoi(register char *aname)
+afs_vtoi(char *aname)
{
- register afs_int32 temp;
- register int tc;
+ afs_int32 temp;
+ int tc;
temp = 0;
while ((tc = *aname++)) {
* or backup volumes by name or #
*/
static afs_int32
-CopyVolumeEntry(char *aname, register struct vldbentry *ave,
- register struct VolumeInfo *av)
+CopyVolumeEntry(char *aname, struct vldbentry *ave,
+ struct VolumeInfo *av)
{
- register int i, j, vol;
+ int i, j, vol;
afs_int32 mask, whichType;
afs_uint32 *serverHost, *typePtr;
static afs_int32 lastDownTime = 0;
struct vldbentry tve;
struct rx_securityClass *vlSec;
- register afs_int32 code;
+ afs_int32 code;
if (!vlConn) {
vlSec = rxnull_NewClientSecurityObject();
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;
- TM_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
- TM_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;
{
Vnode *targetptr = 0; /* vnode of the new file */
Vnode *parentwhentargetnotdir = 0; /* vnode of parent */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client entry */
afs_int32 rights, anyrights; /* rights for this and any user */
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;
- TM_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)))
(afs_int32) ROOTVNODE, dummyFid.Unique = 1;
if ((errorCode =
- GetVolumePackage(tcon, &dummyFid, &volptr, &targetptr, MustBeDIR,
+ GetVolumePackage(acall, &dummyFid, &volptr, &targetptr, MustBeDIR,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_GetVolumeStatus;
(void)RXGetVolumeStatus(FetchVolStatus, Name, OfflineMsg, Motd, volptr);
Bad_GetVolumeStatus:
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
ViceLog(2, ("SAFS_GetVolumeStatus returns %d\n", errorCode));
/* next is to guarantee out strings exist for stub */
if (*Name == 0) {
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, GetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_LONG, avolid, AUD_STR, *Name, AUD_END);
return (errorCode);
{
Vnode *targetptr = 0; /* vnode of the new file */
Vnode *parentwhentargetnotdir = 0; /* vnode of parent */
- int errorCode = 0; /* error code */
+ Error errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client entry */
afs_int32 rights, anyrights; /* rights for this and any user */
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;
- TM_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)))
(afs_int32) ROOTVNODE, dummyFid.Unique = 1;
if ((errorCode =
- GetVolumePackage(tcon, &dummyFid, &volptr, &targetptr, MustBeDIR,
+ GetVolumePackage(acall, &dummyFid, &volptr, &targetptr, MustBeDIR,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_SetVolumeStatus;
RXUpdate_VolumeStatus(volptr, StoreVolStatus, Name, OfflineMsg, Motd);
Bad_SetVolumeStatus:
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_SetVolumeStatus returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
-#if FS_STATS_DETAILED
- TM_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,
+ osi_auditU(acall, SetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_LONG, avolid, AUD_STR, Name, AUD_END);
return (errorCode);
char *temp;
struct rx_connection *tcon;
struct host *thost;
+ Error errorCode = 0;
#endif
- int errorCode = 0;
-#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;
- TM_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
- TM_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;
- TM_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
- TM_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;
- TM_GetTimeOfDay(&opStartTime, 0);
-#endif /* FS_STATS_DETAILED */
+ fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETTIME);
if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
goto Bad_GetTime;
FS_LOCK;
AFSCallStats.GetTime++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- TM_GetTimeOfDay(&tpl, 0);
+ FT_GetTimeOfDay(&tpl, 0);
*Seconds = tpl.tv_sec;
*USeconds = tpl.tv_usec;
Bad_GetTime:
code = CallPostamble(tcon, code, thost);
-#if FS_STATS_DETAILED
- TM_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,
- register struct rx_call * Call, afs_sfsize_t Pos,
+ 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 */
- int errorCode = 0; /* Returned error code to caller */
IHandle_t *ihP;
FdHandle_t *fdP;
-#ifdef AFS_NT40_ENV
- register char *tbuffer;
-#else /* AFS_NT40_ENV */
+#ifndef HAVE_PIOV
+ char *tbuffer;
+#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,
rx_Write(Call, (char *)&zero, sizeof(afs_int32)); /* send 0-length */
return (0);
}
- TM_GetTimeOfDay(&StartTime, 0);
+ FT_GetTimeOfDay(&StartTime, 0);
ihP = targetptr->handle;
fdP = IH_OPEN(ihP);
if (fdP == NULL) {
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)
- Len = tlen - Pos; /* get length we should send */
- (void)FDH_SEEK(fdP, Pos, 0);
+ if (Pos + Len > tlen) /* get length we should send */
+ Len = ((tlen - Pos) < 0) ? 0 : tlen - Pos;
+
{
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) {
- int wlen;
+ size_t wlen;
+ ssize_t nBytes;
if (Len > optSize)
wlen = optSize;
else
- wlen = (int)Len;
-#ifdef AFS_NT40_ENV
- errorCode = FDH_READ(fdP, tbuffer, wlen);
- if (errorCode != wlen) {
+ wlen = Len;
+#ifndef HAVE_PIOV
+ nBytes = FDH_PREAD(fdP, tbuffer, wlen, Pos);
+ if (nBytes != wlen) {
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
VTakeOffline(volptr);
volptr->hashid));
return EIO;
}
- errorCode = rx_Write(Call, tbuffer, wlen);
-#else /* AFS_NT40_ENV */
- errorCode = rx_WritevAlloc(Call, tiov, &tnio, RX_MAXIOVECS, wlen);
- if (errorCode <= 0) {
+ nBytes = rx_Write(Call, tbuffer, wlen);
+#else /* HAVE_PIOV */
+ nBytes = rx_WritevAlloc(Call, tiov, &tnio, RX_MAXIOVECS, wlen);
+ if (nBytes <= 0) {
FDH_CLOSE(fdP);
return EIO;
}
- wlen = errorCode;
- errorCode = FDH_READV(fdP, tiov, tnio);
- if (errorCode != wlen) {
+ wlen = nBytes;
+ nBytes = FDH_PREADV(fdP, tiov, tnio, Pos);
+ if (nBytes != wlen) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
volptr->hashid));
return EIO;
}
- errorCode = rx_Writev(Call, tiov, tnio, wlen);
-#endif /* AFS_NT40_ENV */
-#if FS_STATS_DETAILED
+ nBytes = rx_Writev(Call, tiov, tnio, wlen);
+#endif /* HAVE_PIOV */
+ Pos += wlen;
/*
* Bump the number of bytes actually sent by the number from this
* latest iteration
*/
- (*a_bytesFetchedP) += errorCode;
-#endif /* FS_STATS_DETAILED */
- if (errorCode != wlen) {
+ (*a_bytesFetchedP) += nBytes;
+ 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);
- TM_GetTimeOfDay(&StopTime, 0);
+ FT_GetTimeOfDay(&StopTime, 0);
/* Adjust all Fetch Data related stats */
FS_LOCK;
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, register struct rx_call * Call,
+ 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 */
- int errorCode = 0; /* Returned error code to caller */
-#ifdef AFS_NT40_ENV
- register char *tbuffer; /* data copying buffer */
-#else /* AFS_NT40_ENV */
+ Error errorCode = 0; /* Returned error code to caller */
+#ifndef HAVE_PIOV
+ char *tbuffer; /* data copying buffer */
+#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 */
- afs_sfsize_t DataLength; /* size of inode */
+ afs_sfsize_t DataLength = 0; /* size of inode */
afs_sfsize_t TruncatedLength; /* size after ftruncate */
afs_fsize_t NewLength; /* size after this store completes */
afs_sfsize_t adjustSize; /* bytes to call VAdjust... with */
- int linkCount; /* link count on inode */
+ int linkCount = 0; /* link count on inode */
+ ssize_t nBytes;
FdHandle_t *fdP;
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
inet_ntoa(logHostAddr), ntohs(rxr_PortOf(rx_ConnectionOf(Call)))));
return ENOENT; /* is this proper error code? */
} else {
+ rx_KeepAliveOff(Call);
/*
* See if the file has several links (from other volumes). If it
* does, then we have to make a copy before changing it to avoid
*/
ViceLog(25,
("StoreData_RXStyle : Opening inode %s\n",
- PrintInode(NULL, VN_GET_INO(targetptr))));
+ PrintInode(stmp, VN_GET_INO(targetptr))));
fdP = IH_OPEN(targetptr->handle);
if (fdP == NULL)
return ENOENT;
volptr->hashid));
return EIO;
}
+ if (CheckLength(volptr, targetptr, DataLength)) {
+ FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
if (linkCount != 1) {
afs_fsize_t size;
ViceLog(25,
("StoreData_RXStyle : inode %s has more than onelink\n",
- PrintInode(NULL, VN_GET_INO(targetptr))));
+ PrintInode(stmp, VN_GET_INO(targetptr))));
/* other volumes share this data, better copy it first */
/* Adjust the disk block count by the creation of the new inode.
}
ViceLog(25, ("StoreData : calling CopyOnWrite on target dir\n"));
- if ((errorCode = CopyOnWrite(targetptr, volptr))) {
+ if ((errorCode = CopyOnWrite(targetptr, volptr, 0, MAXFSIZE))) {
ViceLog(25, ("StoreData : CopyOnWrite failed\n"));
volptr->partition->flags &= ~PART_DONTUPDATE;
return (errorCode);
/* this bit means that the locks are set and protections are OK */
rx_SetLocalStatus(Call, 1);
- TM_GetTimeOfDay(&StartTime, 0);
+ FT_GetTimeOfDay(&StartTime, 0);
optSize = sendBufSize;
ViceLog(25,
/* 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.
*/
- errorCode = FDH_WRITE(fdP, &tlen, 1);
- if (errorCode != 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 */
-#if FS_STATS_DETAILED
- (*a_bytesStoredP) += errorCode;
-#endif /* FS_STATS_DETAILED */
+#endif /* HAVE_PIOV */
if (errorCode <= 0) {
errorCode = -32;
break;
}
+ (*a_bytesStoredP) += errorCode;
rlen = errorCode;
-#ifdef AFS_NT40_ENV
- errorCode = FDH_WRITE(fdP, tbuffer, rlen);
-#else /* AFS_NT40_ENV */
- errorCode = FDH_WRITEV(fdP, tiov, tnio);
-#endif /* AFS_NT40_ENV */
- if (errorCode != rlen) {
+#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) {
- afs_fsize_t nfSize = (afs_fsize_t) FDH_SIZE(fdP);
+ Error tmp_errorCode = 0;
+ afs_sfsize_t nfSize = FDH_SIZE(fdP);
+ 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;
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;
}
FDH_CLOSE(fdP);
- TM_GetTimeOfDay(&StopTime, 0);
+ FT_GetTimeOfDay(&StopTime, 0);
VN_SET_LEN(targetptr, NewLength);
sys2et[EIO] = UAEIO;
}
-/* NOTE: 2006-03-01
- * SRXAFS_CallBackRxConnAddr should be re-written as follows:
- * - pass back the connection, client, and host from CallPreamble
- * - keep a ref on the client, which we don't now
- * - keep a hold on the host, which we already do
- * - pass the connection, client, and host down into SAFSS_*, and use
- * them instead of independently discovering them via rx_ConnectionOf
- * (safe) and rx_GetSpecific (not so safe)
+/* NOTE: 2006-03-01
+ * SRXAFS_CallBackRxConnAddr should be re-written as follows:
+ * - pass back the connection, client, and host from CallPreamble
+ * - keep a ref on the client, which we don't now
+ * - keep a hold on the host, which we already do
+ * - pass the connection, client, and host down into SAFSS_*, and use
+ * them instead of independently discovering them via rx_ConnectionOf
+ * (safe) and rx_GetSpecific (not so safe)
* The idea being that we decide what client and host we're going to use
* when CallPreamble is called, and stay consistent throughout the call.
- * This change is too invasive for 1.4.1 but should be made in 1.5.x.
- */
+ * This change is too invasive for 1.4.1 but should be made in 1.5.x.
+ */
afs_int32
SRXAFS_CallBackRxConnAddr (struct rx_call * acall, afs_int32 *addr)
int i,j;
struct rx_connection *conn;
#endif
-
- if (errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &tcallhost))
+
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &tcallhost)))
goto Bad_CallBackRxConnAddr1;
-
+
#ifndef __EXPERIMENTAL_CALLBACK_CONN_MOVING
errorCode = 1;
#else
goto Bad_CallBackRxConnAddr;
}
thost = tclient->host;
-
+
/* nothing more can be done */
- if ( !thost->interface )
+ if ( !thost->interface )
goto Bad_CallBackRxConnAddr;
-
+
/* the only address is the primary interface */
/* can't change when there's only 1 address, anyway */
- if ( thost->interface->numberOfInterfaces <= 1 )
+ if ( thost->interface->numberOfInterfaces <= 1 )
goto Bad_CallBackRxConnAddr;
-
+
/* initialise a security object only once */
if ( !sc )
sc = (struct rx_securityClass *) rxnull_NewClientSecurityObject();
-
+
for ( i=0; i < thost->interface->numberOfInterfaces; i++)
{
if ( *addr == thost->interface->addr[i] ) {
break;
}
}
-
- if ( *addr != thost->interface->addr[i] )
+
+ if ( *addr != thost->interface->addr[i] )
goto Bad_CallBackRxConnAddr;
conn = rx_NewConnection (thost->interface->addr[i],
thost->port, 1, sc, 0);
- rx_SetConnDeadTime(conn, 2);
- rx_SetConnHardDeadTime(conn, AFS_HARDDEADTIME);
+ rx_SetConnDeadTime(conn, 2);
+ rx_SetConnHardDeadTime(conn, AFS_HARDDEADTIME);
H_UNLOCK;
errorCode = RXAFSCB_Probe(conn);
H_LOCK;
return errorCode;
} else {
rx_DestroyConnection(conn);
- }
+ }
Bad_CallBackRxConnAddr:
h_ReleaseClient_r(tclient);
/* The hold on thost will be released by CallPostamble */
return 0;
if (in < 0 || in > 511)
return in;
- if (in >= VICE_SPECIAL_ERRORS && in <= VIO || in == VRESTRICTED)
+ if ((in >= VICE_SPECIAL_ERRORS && in <= VIO) || in == VRESTRICTED)
return in;
if (sys2et[in] != 0)
return sys2et[in];