/* ********************************************************************** */
/*
+ * GetVolumePackage disables Rx keepalives; PutVolumePackage re-enables.
+ * If callbacks are to be broken, keepalives should be enabled in the
+ * stub while that occurs; disabled while disk I/O is in process.
+ */
+
+/*
* in Check_PermissionRights, certain privileges are afforded to the owner
* of the volume, or the owner of a file. Are these considered "use of
* privilege"?
#endif
#endif /* AFS_HPUX_ENV */
-#include <rx/xdr.h>
+#include <afs/opr.h>
+#include <rx/rx_queue.h>
+#include <opr/lock.h>
+#include <opr/proc.h>
#include <afs/nfs.h>
-#include <lwp.h>
-#include <lock.h>
#include <afs/afsint.h>
#include <afs/vldbint.h>
#include <afs/errors.h>
extern void FidZap(DirHandle * file);
extern void FidZero(DirHandle * file);
-#ifdef AFS_PTHREAD_ENV
pthread_mutex_t fileproc_glock_mutex;
-#endif /* AFS_PTHREAD_ENV */
/* Useful local defines used by this module */
#define CREATE_SGUID_ADMIN_ONLY 1
+
+/**
+ * Abort the fileserver on fatal errors returned from vnode operations.
+ */
+#define assert_vnode_success_or_salvaging(code) \
+ opr_Assert((code) == 0 || (code) == VSALVAGE || (code) == VSALVAGING)
+
extern struct afsconf_dir *confDir;
extern afs_int32 dataVersionHigh;
extern int SystemId;
static struct AFSCallStatistics AFSCallStats;
-#if FS_STATS_DETAILED
struct fs_stats_FullPerfStats afs_FullPerfStats;
extern int AnonymousID;
-#endif /* FS_STATS_DETAILED */
-#if OPENAFS_VOL_STATS
static const char nullString[] = "";
-#endif /* OPENAFS_VOL_STATS */
struct afs_FSStats {
afs_int32 NothingYet;
/* date volume instance was created */
if (async) {
if (avol)
- async->spare1 = avol->header->diskstuff.creationDate;
+ async->spare1 = V_creationDate(avol);
else
async->spare1 = 0;
async->spare2 = 0;
fdP = IH_OPEN(vnp->handle);
if (fdP == NULL) {
- ViceLog(0, ("CheckLength: cannot open inode for fid %lu.%lu.%lu\n",
- afs_printable_uint32_lu(vp->hashid),
+ ViceLog(0, ("CheckLength: cannot open inode for fid %" AFS_VOLID_FMT ".%lu.%lu\n",
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier)));
return -1;
FDH_CLOSE(fdP);
if (alen < 0) {
afs_int64 alen64 = alen;
- ViceLog(0, ("CheckLength: cannot get size for inode for fid "
- "%lu.%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
- afs_printable_uint32_lu(vp->hashid),
+ ViceLog(0, ("CheckLength: cannot get size for inode for fid %"
+ AFS_VOLID_FMT ".%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier),
alen64));
if (alen != vlen) {
afs_int64 alen64 = alen, vlen64 = vlen;
- ViceLog(0, ("Fid %lu.%lu.%lu has inconsistent length (index "
+ ViceLog(0, ("Fid %" AFS_VOLID_FMT ".%lu.%lu has inconsistent length (index "
"%lld inode %lld ); volume must be salvaged\n",
- afs_printable_uint32_lu(vp->hashid),
+ afs_printable_VolumeId_lu(vp->hashid),
afs_printable_uint32_lu(Vn_id(vnp)),
afs_printable_uint32_lu(vnp->disk.uniquifier),
vlen64, alen64));
return 0;
}
+static void
+LogClientError(const char *message, struct rx_connection *tcon, afs_int32 viceid, struct AFSFid *Fid)
+{
+ char hoststr[16];
+ if (Fid) {
+ ViceLog(0, ("%s while handling request from host %s:%d viceid %d "
+ "fid %" AFS_VOLID_FMT ".%lu.%lu, failing request\n",
+ message,
+ afs_inet_ntoa_r(rx_HostOf(rx_PeerOf(tcon)), hoststr),
+ (int)ntohs(rx_PortOf(rx_PeerOf(tcon))),
+ viceid,
+ afs_printable_VolumeId_lu(Fid->Volume),
+ afs_printable_uint32_lu(Fid->Vnode),
+ afs_printable_uint32_lu(Fid->Unique)));
+ } else {
+ ViceLog(0, ("%s while handling request from host %s:%d viceid %d "
+ "fid (none), failing request\n",
+ message,
+ afs_inet_ntoa_r(rx_HostOf(rx_PeerOf(tcon)), hoststr),
+ (int)ntohs(rx_PortOf(rx_PeerOf(tcon))),
+ viceid));
+ }
+}
+
/*
* Note that this function always returns a held host, so
* that CallPostamble can block without the host's disappearing.
* Call returns rx connection in passed in *tconn
+ *
+ * 'Fid' is optional, and is just used for printing log messages.
*/
static int
-CallPreamble(struct rx_call *acall, int activecall,
+CallPreamble(struct rx_call *acall, int activecall, struct AFSFid *Fid,
struct rx_connection **tconn, struct host **ahostp)
{
struct host *thost;
struct client *tclient;
+ afs_int32 viceid = -1;
int retry_flag = 1;
int code = 0;
char hoststr[16], hoststr2[16];
-#ifdef AFS_PTHREAD_ENV
struct ubik_client *uclient;
-#endif
*ahostp = NULL;
if (!tconn) {
H_LOCK;
retry:
- tclient = h_FindClient_r(*tconn);
+ tclient = h_FindClient_r(*tconn, &viceid);
if (!tclient) {
- ViceLog(0, ("CallPreamble: Couldn't get client.\n"));
H_UNLOCK;
+ LogClientError("CallPreamble: Couldn't get client", *tconn, viceid, Fid);
return VBUSY;
}
- thost = tclient->host;
- if (tclient->prfail == 1) { /* couldn't get the CPS */
+ thost = tclient->z.host;
+ if (tclient->z.prfail == 1) { /* couldn't get the CPS */
if (!retry_flag) {
h_ReleaseClient_r(tclient);
h_Release_r(thost);
- ViceLog(0, ("CallPreamble: Couldn't get CPS. Fail\n"));
H_UNLOCK;
+ LogClientError("CallPreamble: Couldn't get CPS", *tconn, viceid, Fid);
return -1001;
}
retry_flag = 0; /* Retry once */
/* 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... */
code = hpr_Initialize(&uclient);
if (!code)
- osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
+ opr_Verify(pthread_setspecific(viced_uclient_key,
+ (void *)uclient) == 0);
H_LOCK;
-#else
- code = pr_Initialize(2, AFSDIR_SERVER_ETC_DIRPATH, 0);
-#endif
+
if (code) {
h_ReleaseClient_r(tclient);
h_Release_r(thost);
H_UNLOCK;
- ViceLog(0, ("CallPreamble: couldn't reconnect to ptserver\n"));
+ LogClientError("CallPreamble: couldn't reconnect to ptserver", *tconn, viceid, Fid);
return -1001;
}
- tclient->prfail = 2; /* Means re-eval client's cps */
+ tclient->z.prfail = 2; /* Means re-eval client's cps */
h_ReleaseClient_r(tclient);
h_Release_r(thost);
goto retry;
}
- tclient->LastCall = thost->LastCall = FT_ApproxTime();
+ tclient->z.LastCall = thost->z.LastCall = time(NULL);
if (activecall) /* For all but "GetTime", "GetStats", and "GetCaps" calls */
- thost->ActiveCall = thost->LastCall;
+ thost->z.ActiveCall = thost->z.LastCall;
h_Lock_r(thost);
- if (thost->hostFlags & HOSTDELETED) {
+ if (thost->z.hostFlags & HOSTDELETED) {
ViceLog(3,
("Discarded a packet for deleted host %s:%d\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port)));
+ afs_inet_ntoa_r(thost->z.host, hoststr), ntohs(thost->z.port)));
code = VBUSY; /* raced, so retry */
- } else if ((thost->hostFlags & VENUSDOWN)
- || (thost->hostFlags & HFE_LATER)) {
+ } else if ((thost->z.hostFlags & VENUSDOWN)
+ || (thost->z.hostFlags & HFE_LATER)) {
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->z.host, hoststr), ntohs(thost->z.port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
if (MultiProbeAlternateAddress_r(thost)) {
ViceLog(0,
("MultiProbe failed to find new address for host %s:%d\n",
- afs_inet_ntoa_r(thost->host, hoststr),
- ntohs(thost->port)));
+ afs_inet_ntoa_r(thost->z.host, hoststr),
+ ntohs(thost->z.port)));
code = -1;
} else {
ViceLog(0,
("MultiProbe found new address for host %s:%d\n",
- afs_inet_ntoa_r(thost->host, hoststr),
- ntohs(thost->port)));
+ afs_inet_ntoa_r(thost->z.host, hoststr),
+ ntohs(thost->z.port)));
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->z.host, hoststr), ntohs(thost->z.port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
code = -1;
}
int translate = 0;
H_LOCK;
- tclient = h_FindClient_r(aconn);
+ tclient = h_FindClient_r(aconn, NULL);
if (!tclient)
goto busyout;
- thost = tclient->host;
- if (thost->hostFlags & HERRORTRANS)
+ thost = tclient->z.host;
+ if (thost->z.hostFlags & HERRORTRANS)
translate = 1;
h_ReleaseClient_r(tclient);
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),
+ afs_inet_ntoa_r(ahost->z.host, hoststr),
+ ntohs(ahost->z.port),
ahost,
- afs_inet_ntoa_r(thost->host, hoststr2),
- ntohs(thost->port),
+ afs_inet_ntoa_r(thost->z.host, hoststr2),
+ ntohs(thost->z.port),
thost));
}
/* return the reference taken in CallPreamble */
} 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),
+ afs_inet_ntoa_r(thost->z.host, hoststr),
+ ntohs(thost->z.port),
thost));
}
/* return the reference taken in local h_FindClient_r--h_ReleaseClient_r
- * does not decrement refcount on client->host */
+ * does not decrement refcount on client->z.host */
h_Release_r(thost);
busyout:
VRESTARTING
#endif
;
-#ifdef AFS_PTHREAD_ENV
static const struct timespec timeout_ts = { 0, 0 };
static const struct timespec * const ts = &timeout_ts;
-#else
- static const struct timespec * const ts = NULL;
-#endif
errorCode = 0;
*volptr = VGetVolumeWithCall(&local_errorCode, &errorCode,
fid->Volume, ts, cbv);
if (!errorCode) {
- osi_Assert(*volptr);
+ opr_Assert(*volptr);
break;
}
if ((errorCode == VOFFLINE) && (VInit < 2)) {
if (restartedat.tv_sec == 0) {
/* I'm not really worried about when we restarted, I'm */
/* just worried about when the first VBUSY was returned. */
- FT_GetTimeOfDay(&restartedat, 0);
+ gettimeofday(&restartedat, 0);
if (busyonrst) {
FS_LOCK;
afs_perfstats.fs_nBusies++;
return (busyonrst ? VBUSY : restarting);
} else {
struct timeval now;
- FT_GetTimeOfDay(&now, 0);
+ gettimeofday(&now, 0);
if ((now.tv_sec - restartedat.tv_sec) < (11 * 60)) {
if (busyonrst) {
FS_LOCK;
return (errorCode);
}
}
- osi_Assert(*volptr);
+ opr_Assert(*volptr);
/* get the vnode */
*vptr = VGetVnode(&errorCode, *volptr, fid->Vnode, lock);
return (errorCode);
if ((*vptr)->disk.uniquifier != fid->Unique) {
VPutVnode(&fileCode, *vptr);
- osi_Assert(fileCode == 0);
+ assert_vnode_success_or_salvaging(fileCode);
*vptr = 0;
return (VNOVNODE); /* return the right error code, at least */
}
*ACLSize = VAclSize(*targetptr);
return (0);
} else {
- osi_Assert(Fid != 0);
+ opr_Assert(Fid != 0);
while (1) {
VnodeId parentvnode;
Error errorCode = 0;
{
*rights = 0;
ObtainReadLock(&client->lock);
- if (client->CPS.prlist_len > 0 && !client->deleted &&
- client->host && !(client->host->hostFlags & HOSTDELETED))
- acl_CheckRights(ACL, &client->CPS, rights);
+ if (client->z.CPS.prlist_len > 0 && !client->z.deleted &&
+ client->z.host && !(client->z.host->z.hostFlags & HOSTDELETED))
+ acl_CheckRights(ACL, &client->z.CPS, rights);
ReleaseReadLock(&client->lock);
}
afs_int32 code = 0;
ObtainReadLock(&client->lock);
- if (client->CPS.prlist_len > 0 && !client->deleted &&
- client->host && !(client->host->hostFlags & HOSTDELETED))
- code = acl_IsAMember(id, &client->CPS);
+ if (client->z.CPS.prlist_len > 0 && !client->z.deleted &&
+ client->z.host && !(client->z.host->z.hostFlags & HOSTDELETED))
+ code = acl_IsAMember(id, &client->z.CPS);
ReleaseReadLock(&client->lock);
return code;
}
{
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"));
/* wait if somebody else is already doing the getCPS call */
H_LOCK;
- while (client->host->hostFlags & HCPS_INPROGRESS) {
- client->host->hostFlags |= HCPS_WAITING; /* I am waiting */
-#ifdef AFS_PTHREAD_ENV
- CV_WAIT(&client->host->cond, &host_glock_mutex);
-#else /* AFS_PTHREAD_ENV */
- if ((code =
- LWP_WaitProcess(&(client->host->hostFlags))) != LWP_SUCCESS)
- ViceLog(0, ("LWP_WaitProcess returned %d\n", code));
-#endif /* AFS_PTHREAD_ENV */
- }
-
- if (!client->host->hcps.prlist_len || !client->host->hcps.prlist_val) {
+ while (client->z.host->z.hostFlags & HCPS_INPROGRESS) {
+ client->z.host->z.hostFlags |= HCPS_WAITING; /* I am waiting */
+ opr_cv_wait(&client->z.host->cond, &host_glock_mutex);
+ }
+
+ if (!client->z.host->z.hcps.prlist_len || !client->z.host->z.hcps.prlist_val) {
char hoststr[16];
ViceLog(5,
("CheckRights: len=%u, for host=%s:%d\n",
- client->host->hcps.prlist_len,
- afs_inet_ntoa_r(client->host->host, hoststr),
- ntohs(client->host->port)));
+ client->z.host->z.hcps.prlist_len,
+ afs_inet_ntoa_r(client->z.host->z.host, hoststr),
+ ntohs(client->z.host->z.port)));
} else
- acl_CheckRights(ACL, &client->host->hcps, &hrights);
+ acl_CheckRights(ACL, &client->z.host->z.hcps, &hrights);
H_UNLOCK;
/* Allow system:admin the rights given with the -implicit option */
if (client_HasAsMember(client, SystemId))
} /*VanillaUser */
-/*
- * This unusual afs_int32-parameter routine encapsulates all volume package related
- * operations together in a single function; it's called by almost all AFS
- * interface calls.
- */
+/*------------------------------------------------------------------------
+ * GetVolumePackageWithCall
+ *
+ * Description:
+ * This unusual afs_int32-parameter routine encapsulates all volume
+ * package related operations together in a single function; it's
+ * called by almost all AFS interface calls.
+ *
+ * Arguments:
+ * acall : Ptr to Rx call on which this request came in.
+ * cbv : struct containing the RX call for offline cancels
+ * Fid : the AFS fid the caller is acting on
+ * volptr : returns a pointer to the volume struct
+ * targetptr : returns a pointer to the vnode struct
+ * chkforDir : whether to check for if vnode is a dir
+ * parent : returns a pointer to the parent of this vnode
+ * client : returns a pointer to the calling client
+ * locktype : indicates what kind of lock to take on vnodes
+ * rights : returns a pointer to caller's rights
+ * anyrights : returns a pointer to anonymous' rights
+ * remote : indicates that the volume is a remote RW replica
+ *
+ * Returns:
+ * 0 on success
+ * appropriate error based on permission or invalid operation.
+ *
+ * Environment:
+ * Nothing interesting.
+ *
+ * Side Effects:
+ * On success, disables keepalives on the call. Caller should re-enable
+ * after completing disk I/O.
+ *------------------------------------------------------------------------*/
static afs_int32
-GetVolumePackageWithCall(struct rx_connection *tcon, struct VCallByVol *cbv,
+GetVolumePackageWithCall(struct rx_call *acall, struct VCallByVol *cbv,
AFSFid * Fid, Volume ** volptr, Vnode ** targetptr,
- int chkforDir, Vnode ** parent, struct client **client,
- int locktype, afs_int32 * rights, afs_int32 * anyrights)
+ int chkforDir, Vnode ** parent,
+ struct client **client, int locktype,
+ afs_int32 * rights, afs_int32 * anyrights, int remote)
{
- struct acl_accessList *aCL; /* Internal access List */
+ struct acl_accessList *aCL = NULL; /* Internal access List */
int aCLSize; /* size of the access list */
Error errorCode = 0; /* return code to caller */
+ struct rx_connection *tcon = rx_ConnectionOf(acall);
if ((errorCode = CheckVnodeWithCall(Fid, volptr, cbv, targetptr, locktype)))
- return (errorCode);
+ goto gvpdone;
+
if (chkforDir) {
if (chkforDir == MustNOTBeDIR
- && ((*targetptr)->disk.type == vDirectory))
- return (EISDIR);
+ && ((*targetptr)->disk.type == vDirectory)) {
+ errorCode = EISDIR;
+ goto gvpdone;
+ }
else if (chkforDir == MustBeDIR
- && ((*targetptr)->disk.type != vDirectory))
- return (ENOTDIR);
- }
- if ((errorCode =
- SetAccessList(targetptr, volptr, &aCL, &aCLSize, parent,
- (chkforDir == MustBeDIR ? (AFSFid *) 0 : Fid),
- (chkforDir == MustBeDIR ? 0 : locktype))) != 0)
- return (errorCode);
- if (chkforDir == MustBeDIR)
- osi_Assert((*parent) == 0);
- if (!(*client)) {
- if ((errorCode = GetClient(tcon, client)) != 0)
- return (errorCode);
- if (!(*client))
- return (EINVAL);
- }
- GetRights(*client, aCL, rights, anyrights);
- /* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
- if ((*targetptr)->disk.type != vDirectory) {
- /* anyuser can't be owner, so only have to worry about rights, not anyrights */
- if ((*targetptr)->disk.owner == (*client)->ViceId)
- (*rights) |= PRSFS_ADMINISTER;
- else
- (*rights) &= ~PRSFS_ADMINISTER;
+ && ((*targetptr)->disk.type != vDirectory)) {
+ errorCode = ENOTDIR;
+ goto gvpdone;
+ }
}
+ /*
+ * If the remote flag is set, the current call is dealing with a remote RW
+ * replica, and it can be assumed that the appropriate access checks were
+ * done by the calling server hosting the master volume.
+ */
+ if (!remote) {
+ if ((errorCode = SetAccessList(targetptr, volptr, &aCL, &aCLSize, parent,
+ (chkforDir == MustBeDIR ? (AFSFid *) 0 : Fid),
+ (chkforDir == MustBeDIR ? 0 : locktype))) != 0)
+ goto gvpdone;
+ if (chkforDir == MustBeDIR)
+ opr_Assert((*parent) == 0);
+ if (!(*client)) {
+ if ((errorCode = GetClient(tcon, client)) != 0)
+ goto gvpdone;
+ if (!(*client)) {
+ errorCode = EINVAL;
+ goto gvpdone;
+ }
+ }
+ GetRights(*client, aCL, rights, anyrights);
+ /* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
+ if ((*targetptr)->disk.type != vDirectory) {
+ /* anyuser can't be owner, so only have to worry about rights, not anyrights */
+ if ((*targetptr)->disk.owner == (*client)->z.ViceId)
+ (*rights) |= PRSFS_ADMINISTER;
+ else
+ (*rights) &= ~PRSFS_ADMINISTER;
+ }
#ifdef ADMIN_IMPLICIT_LOOKUP
- /* admins get automatic lookup on everything */
- if (!VanillaUser(*client))
- (*rights) |= PRSFS_LOOKUP;
+ /* admins get automatic lookup on everything */
+ if (!VanillaUser(*client))
+ (*rights) |= PRSFS_LOOKUP;
#endif /* ADMIN_IMPLICIT_LOOKUP */
+ }
+gvpdone:
return errorCode;
} /*GetVolumePackage */
static_inline afs_int32
-GetVolumePackage(struct rx_connection *tcon, AFSFid * Fid, Volume ** volptr,
+GetVolumePackage(struct rx_call *acall, AFSFid * Fid, Volume ** volptr,
Vnode ** targetptr, int chkforDir, Vnode ** parent,
struct client **client, int locktype, afs_int32 * rights,
afs_int32 * anyrights)
{
- return GetVolumePackageWithCall(tcon, NULL, Fid, volptr, targetptr,
+ return GetVolumePackageWithCall(acall, NULL, Fid, volptr, targetptr,
chkforDir, parent, client, locktype,
- rights, anyrights);
+ rights, anyrights, 0);
}
-/*
- * This is the opposite of GetVolumePackage(), and is always used at the end of
- * AFS calls to put back all used vnodes and the volume in the proper order!
- */
+/*------------------------------------------------------------------------
+ * PutVolumePackageWithCall
+ *
+ * Description:
+ * This is the opposite of GetVolumePackage(), and is always used at
+ * the end of AFS calls to put back all used vnodes and the volume
+ * in the proper order!
+ *
+ * Arguments:
+ * acall : Ptr to Rx call on which this request came in.
+ * parentwhentargetnotdir : a pointer to the parent when the target isn't
+ * a directory vnode
+ * targetptr : a pointer to the vnode struct
+ * parentptr : a pointer to the parent of this vnode
+ * volptr : a pointer to the volume structure
+ * client : a pointer to the calling client
+ * cbv : struct containing the RX call for offline cancels
+ *
+ * Returns:
+ * Nothing
+ *
+ * Environment:
+ * Nothing interesting.
+ *
+ * Side Effects:
+ * Enables keepalives on the call.
+ *------------------------------------------------------------------------*/
static void
-PutVolumePackageWithCall(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+PutVolumePackageWithCall(struct rx_call *acall, Vnode *
+ parentwhentargetnotdir, Vnode * targetptr,
Vnode * parentptr, Volume * volptr,
struct client **client, struct VCallByVol *cbv)
{
if (parentwhentargetnotdir) {
VPutVnode(&fileCode, parentwhentargetnotdir);
- osi_Assert(!fileCode || (fileCode == VSALVAGE));
+ assert_vnode_success_or_salvaging(fileCode);
}
if (targetptr) {
VPutVnode(&fileCode, targetptr);
- osi_Assert(!fileCode || (fileCode == VSALVAGE));
+ assert_vnode_success_or_salvaging(fileCode);
}
if (parentptr) {
VPutVnode(&fileCode, parentptr);
- osi_Assert(!fileCode || (fileCode == VSALVAGE));
+ assert_vnode_success_or_salvaging(fileCode);
}
if (volptr) {
VPutVolumeWithCall(volptr, cbv);
}
+
if (*client) {
PutClient(client);
}
} /*PutVolumePackage */
static_inline void
-PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
- Vnode * parentptr, Volume * volptr, struct client **client)
+PutVolumePackage(struct rx_call *acall, Vnode * parentwhentargetnotdir,
+ Vnode * targetptr, Vnode * parentptr, Volume * volptr,
+ struct client **client)
{
- PutVolumePackageWithCall(parentwhentargetnotdir, targetptr, parentptr,
- volptr, client, NULL);
+ PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
+ parentptr, volptr, client, NULL);
}
static int
afs_int32 owner = V_owner(targetptr->volumePtr); /* get volume owner */
if (owner >= 0)
- return (client->ViceId == owner);
+ return (client->z.ViceId == owner);
else {
/*
* We don't have to check for host's cps since only regular
AFSStoreStatus * InStatus)
{
Error errorCode = 0;
-#define OWNSp(client, target) ((client)->ViceId == (target)->disk.owner)
+#define OWNSp(client, target) ((client)->z.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))
/* must have read access, or be owner and have insert access */
if (!(rights & PRSFS_READ)
&& !((OWNSp(client, targetptr) && (rights & PRSFS_INSERT)
- && (client->ViceId != AnonymousID))))
+ && (client->z.ViceId != AnonymousID))))
return (EACCES);
}
if (CallingRoutine == CHK_FETCHDATA
* reading of files created with no read permission. The owner
* of the file is always allowed to read it.
*/
- if ((client->ViceId != targetptr->disk.owner)
+ if ((client->z.ViceId != targetptr->disk.owner)
&& VanillaUser(client))
errorCode =
(((OWNERREAD | OWNEREXEC) & targetptr->disk.
} else { /* !VanillaUser(client) && !FetchData */
osi_audit(PrivilegeEvent, 0, AUD_ID,
- (client ? client->ViceId : 0), AUD_INT, CallingRoutine,
+ (client ? client->z.ViceId : 0), AUD_INT, CallingRoutine,
AUD_END);
}
} else { /* a store operation */
return (EPERM); /* Was EACCES */
else
osi_audit(PrivilegeEvent, 0, AUD_ID,
- (client ? client->ViceId : 0), AUD_INT,
+ (client ? client->z.ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
} else {
if (CallingRoutine != CHK_STOREDATA && !VanillaUser(client)) {
osi_audit(PrivilegeEvent, 0, AUD_ID,
- (client ? client->ViceId : 0), AUD_INT,
+ (client ? client->z.ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
} else {
if (readonlyServer) {
return (EPERM); /* Was EACCES */
else
osi_audit(PrivilegeEvent, 0, AUD_ID,
- (client ? client->ViceId : 0), AUD_INT,
+ (client ? client->z.ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
/* must be sysadmin to set suid/sgid bits */
return (EACCES);
else
osi_audit(PrivSetID, 0, AUD_ID,
- (client ? client->ViceId : 0), AUD_INT,
+ (client ? client->z.ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
if (CallingRoutine == CHK_STOREDATA) {
return (EACCES);
else
osi_audit(PrivilegeEvent, 0, AUD_ID,
- (client ? client->ViceId : 0),
+ (client ? client->z.ViceId : 0),
AUD_INT, CallingRoutine, AUD_END);
}
} else { /* a status store */
} /*RXStore_AccessList */
+static int
+CheckLink(Volume *volptr, FdHandle_t *fdP, const char *descr)
+{
+ int code;
+ afs_ino_str_t ino;
+
+ code = FDH_ISUNLINKED(fdP);
+ if (code < 0) {
+ ViceLog(0, ("CopyOnWrite: error fstating volume %u inode %s (%s), errno %d\n",
+ V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr, errno));
+ return -1;
+ }
+ if (code) {
+ ViceLog(0, ("CopyOnWrite corruption prevention: detected zero nlink for "
+ "volume %u inode %s (%s), forcing volume offline\n",
+ V_id(volptr), PrintInode(ino, fdP->fd_ih->ih_ino), descr));
+ return -1;
+ }
+ return 0;
+}
/* In our current implementation, each successive data store (new file
* data version) creates a new inode. This function creates the new
if (size > len)
size = len;
- buff = (char *)malloc(COPYBUFFSIZE);
+ buff = malloc(COPYBUFFSIZE);
if (buff == NULL) {
return EIO;
}
if (!VALID_INO(ino)) {
free(buff);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
targFdP = IH_OPEN(targetptr->handle);
if (targFdP == NULL) {
rc = errno;
ViceLog(0,
- ("CopyOnWrite failed: Failed to open target vnode %u in volume %u (errno = %d)\n",
- targetptr->vnodeNumber, V_id(volptr), rc));
+ ("CopyOnWrite failed: Failed to open target vnode %u in volume %" AFS_VOLID_FMT " (errno = %d)\n",
+ targetptr->vnodeNumber, afs_printable_VolumeId_lu(V_id(volptr)), rc));
free(buff);
VTakeOffline(volptr);
return rc;
(int)targetptr->disk.dataVersion);
if (!VALID_INO(ino)) {
ViceLog(0,
- ("CopyOnWrite failed: Partition %s that contains volume %u may be out of free inodes(errno = %d)\n",
- volptr->partition->name, V_id(volptr), errno));
+ ("CopyOnWrite failed: Partition %s that contains volume %" AFS_VOLID_FMT " may be out of free inodes(errno = %d)\n",
+ volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr)), errno));
FDH_CLOSE(targFdP);
free(buff);
return ENOSPC;
}
IH_INIT(newH, V_device(volptr), V_id(volptr), ino);
newFdP = IH_OPEN(newH);
- osi_Assert(newFdP != NULL);
+ opr_Assert(newFdP != NULL);
+
+ rc = CheckLink(volptr, targFdP, "source");
+ if (!rc) {
+ rc = CheckLink(volptr, newFdP, "dest");
+ }
+ if (rc) {
+ FDH_REALLYCLOSE(newFdP);
+ IH_RELEASE(newH);
+ FDH_REALLYCLOSE(targFdP);
+ IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
+ free(buff);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
done = off;
while (size > 0) {
if ((rdlen != length) || (wrlen != length)) {
if ((wrlen < 0) && (errno == ENOSPC)) { /* disk full */
ViceLog(0,
- ("CopyOnWrite failed: Partition %s containing volume %u is full\n",
- volptr->partition->name, V_id(volptr)));
+ ("CopyOnWrite failed: Partition %s containing volume %" AFS_VOLID_FMT " is full\n",
+ volptr->partition->name, afs_printable_VolumeId_lu(V_id(volptr))));
/* remove destination inode which was partially copied till now */
FDH_REALLYCLOSE(newFdP);
IH_RELEASE(newH);
FDH_REALLYCLOSE(targFdP);
rc = IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
- if (!rc) {
+ if (rc) {
ViceLog(0,
- ("CopyOnWrite failed: error %u after i_dec on disk full, volume %u in partition %s needs salvage\n",
- rc, V_id(volptr), volptr->partition->name));
+ ("CopyOnWrite failed: error %u after i_dec on disk full, volume %" AFS_VOLID_FMT " in partition %s needs salvage\n",
+ rc, afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name));
VTakeOffline(volptr);
}
free(buff);
* time, just case to an unsigned int for printing */
ViceLog(0,
- ("CopyOnWrite failed: volume %u in partition %s (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
- V_id(volptr), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
+ ("CopyOnWrite failed: volume %" AFS_VOLID_FMT " in partition %s (tried reading %u, read %u, wrote %u, errno %u) volume needs salvage\n",
+ afs_printable_VolumeId_lu(V_id(volptr)), volptr->partition->name, (unsigned)length, (unsigned)rdlen,
(unsigned)wrlen, errno));
#if defined(AFS_DEMAND_ATTACH_FS)
ViceLog(0, ("CopyOnWrite failed: requesting salvage\n"));
FDH_REALLYCLOSE(newFdP);
IH_RELEASE(newH);
FDH_REALLYCLOSE(targFdP);
- rc = IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
+ IH_DEC(V_linkHandle(volptr), ino, V_parentId(volptr));
free(buff);
VTakeOffline(volptr);
return EIO;
}
}
-#ifndef AFS_PTHREAD_ENV
- IOMGR_Poll();
-#endif /* !AFS_PTHREAD_ENV */
}
FDH_REALLYCLOSE(targFdP);
rc = IH_DEC(V_linkHandle(volptr), VN_GET_INO(targetptr),
V_parentId(volptr));
- osi_Assert(!rc);
+ opr_Assert(!rc);
IH_RELEASE(targetptr->handle);
rc = FDH_SYNC(newFdP);
- osi_Assert(rc == 0);
+ opr_Assert(rc == 0);
FDH_CLOSE(newFdP);
targetptr->handle = newH;
VN_SET_INO(targetptr, ino);
return 0; /* success */
} /*CopyOnWrite */
-static int
-CopyOnWrite2(FdHandle_t *targFdP, FdHandle_t *newFdP, afs_foff_t off,
- afs_sfsize_t size)
-{
- char *buff = malloc(COPYBUFFSIZE);
- size_t length;
- ssize_t rdlen;
- ssize_t wrlen;
- int rc = 0;
- afs_foff_t done = off;
-
- if (size > FDH_SIZE(targFdP) - off)
- size = FDH_SIZE(targFdP) - off;
-
- while (size > 0) {
- if (size > COPYBUFFSIZE) { /* more than a buffer */
- length = COPYBUFFSIZE;
- size -= COPYBUFFSIZE;
- } else {
- length = size;
- size = 0;
- }
- rdlen = FDH_PREAD(targFdP, buff, length, done);
- if (rdlen == length) {
- wrlen = FDH_PWRITE(newFdP, buff, length, done);
- done += rdlen;
- }
- else
- wrlen = 0;
-
- if ((rdlen != length) || (wrlen != length)) {
- /* no error recovery, at the worst we'll have a "hole"
- * in the file */
- rc = 1;
- break;
- }
- }
- free(buff);
- return rc;
-}
-
-
/*
* Common code to handle with removing the Name (file when it's called from
* SAFS_RemoveFile() or an empty dir when called from SAFS_rmdir()) from a
if ((*targetptr)->disk.uniquifier != fileFid->Unique) {
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
errorCode = VSALVAGE;
return errorCode;
}
{
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return (EIO);
}
DT1++;
Directory) ? "directory" : "file")));
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
if (!errorCode)
errorCode = code;
}
*/
static void
Update_ParentVnodeStatus(Vnode * parentptr, Volume * volptr, DirHandle * dir,
- int author, int linkcount,
-#if FS_STATS_DETAILED
- char a_inSameNetwork
-#endif /* FS_STATS_DETAILED */
- )
+ int author, int linkcount, char a_inSameNetwork)
{
afs_fsize_t newlength; /* Holds new directory length */
afs_fsize_t parentLength;
Error errorCode;
-#if FS_STATS_DETAILED
Date currDate; /*Current date */
int writeIdx; /*Write index to bump */
int timeIdx; /*Authorship time index to bump */
-#endif /* FS_STATS_DETAILED */
+ time_t now;
parentptr->disk.dataVersion++;
newlength = (afs_fsize_t) afs_dir_Length(dir);
}
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''
* directory operation. Get the current time, decide to which time
* slot this operation belongs, and bump the appropriate slot.
*/
- currDate = (FT_ApproxTime() - parentptr->disk.unixModifyTime);
+ now = time(NULL);
+ currDate = (now - parentptr->disk.unixModifyTime);
timeIdx =
(currDate < VOL_STATS_TIME_CAP_0 ? VOL_STATS_TIME_IDX_0 : currDate <
VOL_STATS_TIME_CAP_1 ? VOL_STATS_TIME_IDX_1 : currDate <
} else {
V_stat_dirDiffAuthor(volptr, timeIdx)++;
}
-#endif /* FS_STATS_DETAILED */
parentptr->disk.author = author;
parentptr->disk.linkCount = linkcount;
- parentptr->disk.unixModifyTime = FT_ApproxTime(); /* This should be set from CLIENT!! */
- parentptr->disk.serverModifyTime = FT_ApproxTime();
+ parentptr->disk.unixModifyTime = now; /* This should be set from CLIENT!! */
+ parentptr->disk.serverModifyTime = now;
parentptr->changed_newTime = 1; /* vnode changed, write it back. */
}
* Update the target file's (or dir's) status block after the specified
* operation is complete. Note that some other fields maybe updated by
* the individual module.
+ * If remote is set, the volume is a RW replica and access checks can
+ * be skipped.
*/
/* XXX INCOMPLETE - More attention is needed here! */
Update_TargetVnodeStatus(Vnode * targetptr, afs_uint32 Caller,
struct client *client, AFSStoreStatus * InStatus,
Vnode * parentptr, Volume * volptr,
- afs_fsize_t length)
+ afs_fsize_t length, int remote)
{
-#if FS_STATS_DETAILED
Date currDate; /*Current date */
int writeIdx; /*Write index to bump */
int timeIdx; /*Authorship time index to bump */
-#endif /* FS_STATS_DETAILED */
if (Caller & (TVS_CFILE | TVS_SLINK | TVS_MKDIR)) { /* initialize new file */
targetptr->disk.parent = parentptr->vnodeNumber;
VN_SET_LEN(targetptr, length);
/* targetptr->disk.group = 0; save some cycles */
targetptr->disk.modeBits = 0777;
- targetptr->disk.owner = client->ViceId;
+ targetptr->disk.owner = client->z.ViceId;
targetptr->disk.dataVersion = 0; /* consistent with the client */
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''
* counter.
*/
- if (client->InSameNetwork)
+ if (client->z.InSameNetwork)
writeIdx = VOL_STATS_SAME_NET;
else
writeIdx = VOL_STATS_DIFF_NET;
V_stat_writes(volptr, writeIdx)++;
- if (client->ViceId != AnonymousID) {
+ if (client->z.ViceId != AnonymousID) {
V_stat_writes(volptr, writeIdx + 1)++;
}
* file operation. Get the current time, decide to which time
* slot this operation belongs, and bump the appropriate slot.
*/
- currDate = (FT_ApproxTime() - targetptr->disk.unixModifyTime);
+ currDate = (time(NULL) - targetptr->disk.unixModifyTime);
timeIdx =
(currDate <
VOL_STATS_TIME_CAP_0 ? VOL_STATS_TIME_IDX_0 : currDate <
VOL_STATS_TIME_CAP_3 ? VOL_STATS_TIME_IDX_3 : currDate <
VOL_STATS_TIME_CAP_4 ? VOL_STATS_TIME_IDX_4 :
VOL_STATS_TIME_IDX_5);
- if (targetptr->disk.author == client->ViceId) {
+ if (targetptr->disk.author == client->z.ViceId) {
V_stat_fileSameAuthor(volptr, timeIdx)++;
} else {
V_stat_fileDiffAuthor(volptr, timeIdx)++;
}
}
-#endif /* FS_STATS_DETAILED */
if (!(Caller & TVS_SSTATUS))
- targetptr->disk.author = client->ViceId;
+ targetptr->disk.author = client->z.ViceId;
if (Caller & TVS_SDATA) {
targetptr->disk.dataVersion++;
- if (VanillaUser(client)) {
- targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+ if (!remote && VanillaUser(client)) {
+ /* turn off suid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
#ifdef CREATE_SGUID_ADMIN_ONLY
- targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+ /* turn off sgid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
#endif
}
}
} else { /* other: date always changes, but perhaps to what is specified by caller */
targetptr->disk.unixModifyTime =
(InStatus->Mask & AFS_SETMODTIME ? InStatus->
- ClientModTime : FT_ApproxTime());
+ ClientModTime : time(NULL));
}
if (InStatus->Mask & AFS_SETOWNER) {
/* admin is allowed to do chmod, chown as well as chown, chmod. */
- if (VanillaUser(client)) {
- targetptr->disk.modeBits &= ~04000; /* turn off suid for file. */
+ if (!remote && VanillaUser(client)) {
+ /* turn off suid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~04000;
#ifdef CREATE_SGUID_ADMIN_ONLY
- targetptr->disk.modeBits &= ~02000; /* turn off sgid for file. */
+ /* turn off sgid */
+ targetptr->disk.modeBits = targetptr->disk.modeBits & ~02000;
#endif
}
targetptr->disk.owner = InStatus->Owner;
}
if (InStatus->Mask & AFS_SETMODE) {
int modebits = InStatus->UnixModeBits;
-#define CREATE_SGUID_ADMIN_ONLY 1
#ifdef CREATE_SGUID_ADMIN_ONLY
- if (VanillaUser(client))
+ if (!remote && VanillaUser(client))
modebits = modebits & 0777;
#endif
- if (VanillaUser(client)) {
+ if (!remote && VanillaUser(client)) {
targetptr->disk.modeBits = modebits;
} else {
targetptr->disk.modeBits = modebits;
switch (Caller) {
case TVS_SDATA:
- osi_audit(PrivSetID, 0, AUD_ID, client->ViceId, AUD_INT,
+ osi_audit(PrivSetID, 0, AUD_ID, client->z.ViceId, AUD_INT,
CHK_STOREDATA, AUD_END);
break;
case TVS_CFILE:
case TVS_SSTATUS:
- osi_audit(PrivSetID, 0, AUD_ID, client->ViceId, AUD_INT,
+ osi_audit(PrivSetID, 0, AUD_ID, client->z.ViceId, AUD_INT,
CHK_STORESTATUS, AUD_END);
break;
default:
}
}
}
- targetptr->disk.serverModifyTime = FT_ApproxTime();
+ targetptr->disk.serverModifyTime = time(NULL);
if (InStatus->Mask & AFS_SETGROUP)
targetptr->disk.group = InStatus->Group;
/* vnode changed : to be written back by VPutVnode */
ViceLog(0, ("WARNING: CallBackTime == 0!\n"));
CallBack->ExpirationTime = 0;
} else
- CallBack->ExpirationTime = CallBackTime - FT_ApproxTime();
+ CallBack->ExpirationTime = CallBackTime - time(NULL);
CallBack->CallBackVersion = CALLBACK_VERSION;
CallBack->CallBackType = CB_SHARED; /* The default for now */
VAdjustDiskUsage(&nc, volptr, -length, 0);
if (rc == VOVERQUOTA) {
ViceLog(2,
- ("Volume %u (%s) is full\n", V_id(volptr),
+ ("Volume %" AFS_VOLID_FMT " (%s) is full\n",
+ afs_printable_VolumeId_lu(V_id(volptr)),
V_name(volptr)));
return (rc);
}
if (rc == VDISKFULL) {
ViceLog(0,
- ("Partition %s that contains volume %u is full\n",
- volptr->partition->name, V_id(volptr)));
+ ("Partition %s that contains volume %" AFS_VOLID_FMT " is full\n",
+ volptr->partition->name,
+ afs_printable_VolumeId_lu(V_id(volptr))));
return (rc);
}
ViceLog(0, ("Got error return %d from VAdjustDiskUsage\n", rc));
return VSALVAGE;
}
- *targetptr = VAllocVnode(&errorCode, volptr, FileType);
+ *targetptr = VAllocVnode(&errorCode, volptr, FileType, 0, 0);
if (errorCode != 0) {
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
return (errorCode);
/* error in creating inode */
if (!VALID_INO(inode)) {
ViceLog(0,
- ("Volume : %u vnode = %u Failed to create inode: errno = %d\n",
- (*targetptr)->volumePtr->header->diskstuff.id,
+ ("Volume : %" AFS_VOLID_FMT " vnode = %u Failed to create inode: errno = %d\n",
+ afs_printable_VolumeId_lu(V_id((*targetptr)->volumePtr)),
(*targetptr)->vnodeNumber, errno));
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
(*targetptr)->delete = 1; /* delete vnode */
int writeVnode = targetptr->changed_oldTime; /* save original status */
targetptr->changed_oldTime = 1; /* locking doesn't affect any time stamp */
- Time = FT_ApproxTime();
+ Time = time(NULL);
switch (LockingType) {
case LockRead:
case LockWrite:
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);
RXGetVolumeStatus(AFSFetchVolumeStatus * status, char **name, char **offMsg,
char **motd, Volume * volptr)
{
- int temp;
status->Vid = V_id(volptr);
status->ParentId = V_parentId(volptr);
status->MinQuota = V_minquota(volptr);
status->MaxQuota = V_maxquota(volptr);
status->BlocksInUse = V_diskused(volptr);
- status->PartBlocksAvail = RoundInt64ToInt32(volptr->partition->free);
- status->PartMaxBlocks = RoundInt64ToInt32(volptr->partition->totalUsable);
+ status->PartBlocksAvail = RoundInt64ToInt31(volptr->partition->free);
+ status->PartMaxBlocks = RoundInt64ToInt31(volptr->partition->totalUsable);
/* now allocate and copy these things; they're freed by the RXGEN stub */
- temp = strlen(V_name(volptr)) + 1;
- *name = malloc(temp);
+ *name = strdup(V_name(volptr));
if (!*name) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
- strcpy(*name, V_name(volptr));
- temp = strlen(V_offlineMessage(volptr)) + 1;
- *offMsg = malloc(temp);
+ *offMsg = strdup(V_offlineMessage(volptr));
if (!*offMsg) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
- strcpy(*offMsg, V_offlineMessage(volptr));
-#if OPENAFS_VOL_STATS
*motd = malloc(1);
if (!*motd) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*motd, nullString);
-#else
- temp = strlen(V_motd(volptr)) + 1;
- *motd = malloc(temp);
- if (!*motd) {
- ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
- }
- strcpy(*motd, V_motd(volptr));
-#endif /* OPENAFS_VOL_STATS */
return 0;
} /*RXGetVolumeStatus */
GetStatus(Vnode * targetptr, AFSFetchStatus * status, afs_int32 rights,
afs_int32 anyrights, Vnode * parentptr)
{
+ int Time = time(NULL);
+
/* initialize return status from a vnode */
status->InterfaceVersion = 1;
status->SyncCounter = status->dataVersionHigh = status->lockCount =
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,
struct fsstats fsstats;
afs_sfsize_t bytesToXfer; /* # bytes to xfer */
afs_sfsize_t bytesXferred; /* # bytes actually xferred */
-
-#if FS_STATS_DETAILED
int readIdx; /* Index of read stats array to bump */
-#endif /* FS_STATS_DETAILED */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHDATA);
FS_LOCK;
AFSCallStats.FetchData++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_FetchData;
/* Get ptr to client data for user Id for logging */
ViceLog(5,
("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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
queue_NodeInit(&tcbv);
tcbv.call = acall;
* it are also returned
*/
if ((errorCode =
- GetVolumePackageWithCall(tcon, cbv, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackageWithCall(acall, cbv, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
- &rights, &anyrights)))
+ &rights, &anyrights, 0)))
goto Bad_FetchData;
SetVolumeSync(Sync, volptr);
-#if FS_STATS_DETAILED
/*
* Remember that another read operation was performed.
*/
FS_LOCK;
- if (client->InSameNetwork)
+ if (client->z.InSameNetwork)
readIdx = VOL_STATS_SAME_NET;
else
readIdx = VOL_STATS_DIFF_NET;
V_stat_reads(volptr, readIdx)++;
- if (client->ViceId != AnonymousID) {
+ if (client->z.ViceId != AnonymousID) {
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);
- osi_Assert(!fileCode || (fileCode == VSALVAGE));
+ assert_vnode_success_or_salvaging(fileCode);
parentwhentargetnotdir = NULL;
}
- fsstats_StartXfer(&fsstats);
+ fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_FETCHDATA);
/* actually do the data transfer */
errorCode =
/* if a r/w volume, promise a callback to the caller */
if (VolumeWriteable(volptr))
- SetCallBackStruct(AddCallBack(client->host, Fid), CallBack);
+ SetCallBackStruct(AddCallBack(client->z.host, Fid), CallBack);
else {
struct AFSFid myFid;
memset(&myFid, 0, sizeof(struct AFSFid));
myFid.Volume = Fid->Volume;
- SetCallBackStruct(AddVolCallBack(client->host, &myFid), CallBack);
+ SetCallBackStruct(AddVolCallBack(client->z.host, &myFid), CallBack);
}
Bad_FetchData:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackageWithCall(parentwhentargetnotdir, targetptr,
+ (void)PutVolumePackageWithCall(acall, parentwhentargetnotdir, targetptr,
(Vnode *) 0, volptr, &client, cbv);
ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, FetchDataEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return (errorCode);
} /*SRXAFS_FetchData */
FS_LOCK;
AFSCallStats.FetchACL++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_FetchACL;
/* Get ptr to client data for user Id for logging */
ViceLog(5,
("SAFS_FetchACL, 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
AccessList->AFSOpaque_len = 0;
AccessList->AFSOpaque_val = malloc(AFSOPAQUEMAX);
* 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));
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, FetchACLEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid,
- AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ 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)
ViceLog(1,
("SAFS_FetchStatus, 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.FetchStatus++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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;
/* If a r/w volume, also set the CallBack state */
if (VolumeWriteable(volptr))
- SetCallBackStruct(AddCallBack(client->host, Fid), CallBack);
+ SetCallBackStruct(AddCallBack(client->z.host, Fid), CallBack);
else {
struct AFSFid myFid;
memset(&myFid, 0, sizeof(struct AFSFid));
myFid.Volume = Fid->Volume;
- SetCallBackStruct(AddVolCallBack(client->host, &myFid), CallBack);
+ SetCallBackStruct(AddVolCallBack(client->z.host, &myFid), CallBack);
}
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;
}
/* allocate space for return output parameters */
- OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
- malloc(nfiles * sizeof(struct AFSFetchStatus));
+ OutStats->AFSBulkStats_val = malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
- CallBacks->AFSCBs_val = (struct AFSCallBack *)
- malloc(nfiles * sizeof(struct AFSCallBack));
+ CallBacks->AFSCBs_val = malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ tfid = Fids->AFSCBFids_val;
+
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, tfid, &tcon, &thost)))
goto Bad_BulkStatus;
- tfid = Fids->AFSCBFids_val;
for (i = 0; i < nfiles; i++, tfid++) {
/*
* Get volume/vnode for the fetched file; caller's rights to it
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_BulkStatus;
+
/* set volume synchronization information, but only once per call */
if (i == 0)
SetVolumeSync(Sync, volptr);
/* If a r/w volume, also set the CallBack state */
if (VolumeWriteable(volptr))
- SetCallBackStruct(AddBulkCallBack(client->host, tfid),
+ SetCallBackStruct(AddBulkCallBack(client->z.host, tfid),
&CallBacks->AFSCBs_val[i]);
else {
struct AFSFid myFid;
memset(&myFid, 0, sizeof(struct AFSFid));
myFid.Volume = tfid->Volume;
- SetCallBackStruct(AddVolCallBack(client->host, &myFid),
+ SetCallBackStruct(AddVolCallBack(client->z.host, &myFid),
&CallBacks->AFSCBs_val[i]);
}
/* 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);
Audit_and_Return:
ViceLog(2, ("SAFS_BulkStatus returns %d\n", errorCode));
osi_auditU(acall, BulkFetchStatusEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FIDS, Fids, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FIDS, Fids, AUD_END);
return errorCode;
} /*SRXAFS_BulkStatus */
}
/* allocate space for return output parameters */
- OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
- malloc(nfiles * sizeof(struct AFSFetchStatus));
+ OutStats->AFSBulkStats_val = calloc(nfiles, sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
- CallBacks->AFSCBs_val = (struct AFSCallBack *)
- malloc(nfiles * sizeof(struct AFSCallBack));
+ CallBacks->AFSCBs_val = calloc(nfiles, sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
/* Zero out return values to avoid leaking information on partial succes */
- memset(OutStats->AFSBulkStats_val, 0, nfiles * sizeof(struct AFSFetchStatus));
- memset(CallBacks->AFSCBs_val, 0, nfiles * sizeof(struct AFSCallBack));
memset(Sync, 0, sizeof(*Sync));
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))) {
+ tfid = Fids->AFSCBFids_val;
+
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, tfid, &tcon, &thost))) {
goto Bad_InlineBulkStatus;
}
- tfid = Fids->AFSCBFids_val;
for (i = 0; i < nfiles; i++, tfid++) {
/*
* Get volume/vnode for the fetched file; caller's rights to it
* are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, tfid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackage(acall, tfid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights))) {
tstatus = &OutStats->AFSBulkStats_val[i];
- tstatus->errorCode = errorCode;
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+
+ if (thost->z.hostFlags & HERRORTRANS) {
+ tstatus->errorCode = sys_error_to_et(errorCode);
+ } else {
+ tstatus->errorCode = errorCode;
+ }
+
+ PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
Check_PermissionRights(targetptr, client, rights,
CHK_FETCHSTATUS, 0))) {
tstatus = &OutStats->AFSBulkStats_val[i];
- tstatus->errorCode = errorCode;
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr,
- (Vnode *) 0, volptr, &client);
+
+ if (thost->z.hostFlags & HERRORTRANS) {
+ tstatus->errorCode = sys_error_to_et(errorCode);
+ } else {
+ tstatus->errorCode = errorCode;
+ }
+
+ (void)PutVolumePackage(acall, parentwhentargetnotdir,
+ targetptr, (Vnode *) 0, volptr,
+ &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
/* If a r/w volume, also set the CallBack state */
if (VolumeWriteable(volptr))
- SetCallBackStruct(AddBulkCallBack(client->host, tfid),
+ SetCallBackStruct(AddBulkCallBack(client->z.host, tfid),
&CallBacks->AFSCBs_val[i]);
else {
struct AFSFid myFid;
memset(&myFid, 0, sizeof(struct AFSFid));
myFid.Volume = tfid->Volume;
- SetCallBackStruct(AddVolCallBack(client->host, &myFid),
+ SetCallBackStruct(AddVolCallBack(client->z.host, &myFid),
&CallBacks->AFSCBs_val[i]);
}
/* 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);
Audit_and_Return:
ViceLog(2, ("SAFS_InlineBulkStatus returns %d\n", errorCode));
osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FIDS, Fids, AUD_END);
- return 0;
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FIDS, Fids, AUD_END);
+ return errorCode;
} /*SRXAFS_InlineBulkStatus */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_FETCHSTATUS);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_FetchStatus;
code = SAFSS_FetchStatus(acall, Fid, OutStatus, CallBack, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, FetchStatusEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_FetchStatus */
FS_LOCK;
AFSCallStats.StoreData++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_StoreData;
/* Get ptr to client data for user Id for logging */
ViceLog(5,
("StoreData: 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
/*
* Get associated volume/vnode for the stored file; caller's rights
* 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;
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
- if ((targetptr->disk.type == vSymlink)) {
+ if (targetptr->disk.type == vSymlink) {
/* Should we return a better error code here??? */
errorCode = EISDIR;
goto Bad_StoreData;
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
VPutVnode(&fileCode, parentwhentargetnotdir);
- osi_Assert(!fileCode || (fileCode == VSALVAGE));
+ assert_vnode_success_or_salvaging(fileCode);
parentwhentargetnotdir = NULL;
}
- fsstats_StartXfer(&fsstats);
+ fsstats_StartXfer(&fsstats, FS_STATS_XFERIDX_STOREDATA);
errorCode =
StoreData_RXStyle(volptr, targetptr, Fid, client, acall, Pos, Length,
/* Update the status of the target's vnode */
Update_TargetVnodeStatus(targetptr, TVS_SDATA, client, InStatus,
- targetptr, volptr, 0);
+ targetptr, volptr, 0, 0);
/* 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);
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, StoreDataEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return (errorCode);
} /*common_StoreData64 */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STOREACL);
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_StoreACL;
/* Get ptr to client data for user Id for logging */
ViceLog(1,
("SAFS_StoreACL, Fid = %u.%u.%u, ACL=%s, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, AccessList->AFSOpaque_val,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.StoreACL++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call backs on the directory */
- BreakCallBack(client->host, Fid, 0);
+ BreakCallBack(client->z.host, Fid, 0);
/* Get the updated dir's status back to the caller */
GetStatus(targetptr, OutStatus, rights, anyrights, 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);
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, StoreACLEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
} /*SRXAFS_StoreACL */
ViceLog(1,
("SAFS_StoreStatus, 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.StoreStatus++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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;
/* Update the status of the target's vnode */
Update_TargetVnodeStatus(targetptr, TVS_SSTATUS, client, InStatus,
(parentwhentargetnotdir ? parentwhentargetnotdir
- : targetptr), volptr, 0);
+ : targetptr), volptr, 0, 0);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* Break call backs on Fid */
- BreakCallBack(client->host, Fid, 0);
+ BreakCallBack(client->z.host, Fid, 0);
/* Return the updated status back to caller */
GetStatus(targetptr, OutStatus, rights, anyrights,
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;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_STORESTATUS);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_StoreStatus;
code = SAFSS_StoreStatus(acall, Fid, InStatus, OutStatus, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, StoreStatusEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_StoreStatus */
ViceLog(1,
("SAFS_RemoveFile %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.RemoveFile++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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,
+ Update_ParentVnodeStatus(parentptr, volptr, &dir, client->z.ViceId,
parentptr->disk.linkCount,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
/* 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);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
} else {
/* convert the parent lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* convert the target lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* tell all the file has changed */
- BreakCallBack(client->host, &fileFid, 1);
+ BreakCallBack(client->z.host, &fileFid, 1);
}
/* break call back on the directory */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.host, DirFid, 0);
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));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEFILE);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_RemoveFile;
code = SAFSS_RemoveFile(acall, DirFid, Name, OutDirStatus, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RemoveFileEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, DirFid, AUD_STR, Name, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
} /*SRXAFS_RemoveFile */
ViceLog(1,
("SAFS_CreateFile %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.CreateFile++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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,
+ Update_ParentVnodeStatus(parentptr, volptr, &dir, client->z.ViceId,
parentptr->disk.linkCount,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
/* update the status of the new file's vnode */
Update_TargetVnodeStatus(targetptr, TVS_CFILE, client, InStatus,
- parentptr, volptr, 0);
+ parentptr, volptr, 0, 0);
/* 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);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call back on parent dir */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.host, DirFid, 0);
/* Return a callback promise for the newly created file to the caller */
- SetCallBackStruct(AddCallBack(client->host, OutFid), CallBack);
+ SetCallBackStruct(AddCallBack(client->z.host, OutFid), CallBack);
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));
memset(OutFid, 0, sizeof(struct AFSFid));
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_CreateFile;
code =
fsstats_FinishOp(&fsstats, 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);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name, AUD_FID, OutFid, AUD_END);
return code;
} /*SRXAFS_CreateFile */
("SAFS_Rename %s to %s, Fid = %u.%u.%u to %u.%u.%u, Host %s:%d, Id %d\n",
OldName, NewName, OldDirFid->Volume, OldDirFid->Vnode,
OldDirFid->Unique, NewDirFid->Volume, NewDirFid->Vnode,
- NewDirFid->Unique, inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ NewDirFid->Unique, inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.Rename++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
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();
}
if (testnode == 1) top = 1;
testvptr = VGetVnode(&errorCode, volptr, testnode, READ_LOCK);
- osi_Assert(errorCode == 0);
+ assert_vnode_success_or_salvaging(errorCode);
testnode = testvptr->disk.parent;
VPutVnode(&errorCode, testvptr);
if ((top == 1) && (testnode != 0)) {
VTakeOffline(volptr);
ViceLog(0,
- ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
errorCode = EIO;
goto Bad_Rename;
}
- osi_Assert(errorCode == 0);
+ assert_vnode_success_or_salvaging(errorCode);
}
}
ViceLog(25, ("Rename : calling CopyOnWrite on target dir\n"));
if ((errorCode = CopyOnWrite(fileptr, volptr, 0, MAXFSIZE)))
goto Bad_Rename;
+ /* since copyonwrite would mean fileptr has a new handle, do it here */
+ FidZap(&filedir);
+ SetDirHandle(&filedir, fileptr);
}
/* If the new name exists already, delete it and the file it points to */
if (newfileptr) {
/* Delete NewName from its directory */
code = afs_dir_Delete(&newdir, NewName);
- osi_Assert(code == 0);
+ opr_Assert(code == 0);
/* Drop the link count */
newfileptr->disk.linkCount--;
NewName, errno));
if ((errno != ENOENT) && (errno != EIO)
&& (errno != ENXIO))
- ViceLog(0, ("Do we need to fsck?"));
+ ViceLog(0, ("Do we need to fsck?\n"));
}
}
VN_SET_INO(newfileptr, (Inode) 0);
goto Bad_Rename;
/* Delete the old name */
- osi_Assert(afs_dir_Delete(&olddir, OldName) == 0);
+ opr_Assert(afs_dir_Delete(&olddir, OldName) == 0);
/* if the directory length changes, reflect it in the statistics */
-#if FS_STATS_DETAILED
- Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
- oldvptr->disk.linkCount, client->InSameNetwork);
- Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
- newvptr->disk.linkCount, client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->ViceId,
- oldvptr->disk.linkCount);
- Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->ViceId,
- newvptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+ Update_ParentVnodeStatus(oldvptr, volptr, &olddir, client->z.ViceId,
+ oldvptr->disk.linkCount, client->z.InSameNetwork);
+ Update_ParentVnodeStatus(newvptr, volptr, &newdir, client->z.ViceId,
+ newvptr->disk.linkCount, client->z.InSameNetwork);
if (oldvptr == newvptr)
oldvptr->disk.dataVersion--; /* Since it was bumped by 2! */
/* if we are dealing with a rename of a directory, and we need to
* update the .. entry of that directory */
if (updatefile) {
- osi_Assert(!fileptr->disk.cloned);
+ opr_Assert(!fileptr->disk.cloned);
fileptr->changed_newTime = 1; /* status change of moved file */
/* fix .. to point to the correct place */
afs_dir_Delete(&filedir, ".."); /* No assert--some directories may be bad */
- osi_Assert(afs_dir_Create(&filedir, "..", NewDirFid) == 0);
+ opr_Assert(afs_dir_Create(&filedir, "..", NewDirFid) == 0);
fileptr->disk.dataVersion++;
/* if the parent directories are different the link counts have to be */
/* convert the write locks to a read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, newvptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
if (oldvptr != newvptr) {
VVnodeWriteToRead(&errorCode, oldvptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
}
if (newfileptr && !doDelete) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, newfileptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
}
/* break call back on NewDirFid, OldDirFid, NewDirFid and newFileFid */
- BreakCallBack(client->host, NewDirFid, 0);
+ BreakCallBack(client->z.host, NewDirFid, 0);
if (oldvptr != newvptr) {
- BreakCallBack(client->host, OldDirFid, 0);
+ BreakCallBack(client->z.host, OldDirFid, 0);
}
if (updatefile) {
/* if a dir moved, .. changed */
* 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);
+ BreakCallBack(client->z.host, &fileFid, 1);
}
if (newfileptr) {
/* Note: it is not necessary to break the callback */
DeleteFileCallBacks(&newFileFid); /* no other references */
else
/* other's still exist (with wrong link count) */
- BreakCallBack(client->host, &newFileFid, 1);
+ BreakCallBack(client->z.host, &newFileFid, 1);
}
Bad_Rename:
if (newfileptr) {
VPutVnode(&fileCode, newfileptr);
- osi_Assert(fileCode == 0);
+ assert_vnode_success_or_salvaging(fileCode);
}
- (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
+ (void)PutVolumePackage(acall, fileptr, (newvptr && newvptr != oldvptr ?
newvptr : 0), oldvptr, volptr, &client);
FidZap(&olddir);
FidZap(&newdir);
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RENAME);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, OldDirFid, &tcon, &thost)))
goto Bad_Rename;
code =
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RenameFileEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, OldDirFid, AUD_STR, OldName,
- AUD_FID, NewDirFid, AUD_STR, NewName, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, OldDirFid, AUD_STR, OldName,
+ AUD_FID, NewDirFid, AUD_STR, NewName, AUD_END);
return code;
} /*SRXAFS_Rename */
ViceLog(1,
("SAFS_Symlink %s to %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
LinkContents, DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.Symlink++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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,
+ Update_ParentVnodeStatus(parentptr, volptr, &dir, client->z.ViceId,
parentptr->disk.linkCount,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
/* update the status of the new symbolic link file vnode */
Update_TargetVnodeStatus(targetptr, TVS_SLINK, client, InStatus,
- parentptr, volptr, strlen((char *)LinkContents));
+ parentptr, volptr, strlen((char *)LinkContents), 0);
/* Write the contents of the symbolic link name into the target inode */
fdP = IH_OPEN(targetptr->handle);
if (fdP == NULL) {
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ parentptr, volptr, &client);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
len = strlen((char *) LinkContents);
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call back on the parent dir */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.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));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SYMLINK);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_Symlink;
code =
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, SymlinkEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, DirFid, AUD_STR, Name,
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_STR, LinkContents, AUD_END);
return code;
("SAFS_Link %s, Did = %u.%u.%u, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Name, DirFid->Volume, DirFid->Vnode, DirFid->Unique,
ExistingFid->Volume, ExistingFid->Vnode, ExistingFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.Link++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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;
CheckVnode(ExistingFid, &volptr, &targetptr, WRITE_LOCK))) {
goto Bad_Link;
}
+
if (targetptr->disk.type != vFile) {
errorCode = EISDIR;
goto Bad_Link;
/* 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,
+ Update_ParentVnodeStatus(parentptr, volptr, &dir, client->z.ViceId,
parentptr->disk.linkCount,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
targetptr->disk.linkCount++;
- targetptr->disk.author = client->ViceId;
+ targetptr->disk.author = client->z.ViceId;
targetptr->changed_newTime = 1; /* Status change of linked-to file */
/* set up return status */
/* convert the write locks to read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
VVnodeWriteToRead(&errorCode, parentptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call back on DirFid */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.host, DirFid, 0);
/*
* 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);
+ BreakCallBack(client->z.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));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_LINK);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_Link;
code =
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, LinkEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, DirFid, AUD_STR, Name,
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, ExistingFid, AUD_END);
return code;
ViceLog(1,
("SAFS_MakeDir %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.MakeDir++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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;
}
/* Update the status for the parent dir */
-#if FS_STATS_DETAILED
- Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
+ Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->z.ViceId,
parentptr->disk.linkCount + 1,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &parentdir, client->ViceId,
- parentptr->disk.linkCount + 1);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
/* Point to target's ACL buffer and copy the parent's ACL contents to it */
- osi_Assert((SetAccessList
- (&targetptr, &volptr, &newACL, &newACLSize,
- &parentwhentargetnotdir, (AFSFid *) 0, 0)) == 0);
- osi_Assert(parentwhentargetnotdir == 0);
+ opr_Verify((SetAccessList(&targetptr, &volptr, &newACL, &newACLSize,
+ &parentwhentargetnotdir, NULL, 0)) == 0);
+ opr_Assert(parentwhentargetnotdir == 0);
memcpy((char *)newACL, (char *)VVnodeACL(parentptr), VAclSize(parentptr));
/* update the status for the target vnode */
Update_TargetVnodeStatus(targetptr, TVS_MKDIR, client, InStatus,
- parentptr, volptr, 0);
+ parentptr, volptr, 0, 0);
/* Actually create the New directory in the directory package */
SetDirHandle(&dir, targetptr);
- osi_Assert(!(afs_dir_MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
+ opr_Verify(!(afs_dir_MakeDir(&dir, (afs_int32 *)OutFid,
+ (afs_int32 *)DirFid)));
DFlush();
VN_SET_LEN(targetptr, (afs_fsize_t) afs_dir_Length(&dir));
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call back on DirFid */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.host, DirFid, 0);
/* Return a callback promise to caller */
- SetCallBackStruct(AddCallBack(client->host, OutFid), CallBack);
+ SetCallBackStruct(AddCallBack(client->z.host, OutFid), CallBack);
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);
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_MAKEDIR);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_MakeDir;
code =
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, MakeDirEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, DirFid, AUD_STR, Name,
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_END);
return code;
ViceLog(1,
("SAFS_RemoveDir %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.RemoveDir++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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;
}
/* Update the status for the parent dir; link count is also adjusted */
-#if FS_STATS_DETAILED
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
+ Update_ParentVnodeStatus(parentptr, volptr, &dir, client->z.ViceId,
parentptr->disk.linkCount - 1,
- client->InSameNetwork);
-#else
- Update_ParentVnodeStatus(parentptr, volptr, &dir, client->ViceId,
- parentptr->disk.linkCount - 1);
-#endif /* FS_STATS_DETAILED */
+ client->z.InSameNetwork);
/* 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);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
+ assert_vnode_success_or_salvaging(errorCode);
/* break call back on DirFid and fileFid */
- BreakCallBack(client->host, DirFid, 0);
+ BreakCallBack(client->z.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));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_REMOVEDIR);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, DirFid, &tcon, &thost)))
goto Bad_RemoveDir;
code = SAFSS_RemoveDir(acall, DirFid, Name, OutDirStatus, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, RemoveDirEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, DirFid, AUD_STR, Name, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
} /*SRXAFS_RemoveDir */
ViceLog(1,
("SAFS_SetLock type = %s Fid = %u.%u.%u, Host %s:%d, Id %d\n",
locktype[(int)type], Fid->Volume, Fid->Vnode, Fid->Unique,
- inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.SetLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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 */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETLOCK);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_SetLock;
code = SAFSS_SetLock(acall, Fid, type, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, SetLockEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_LONG, type, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_LONG, type, AUD_END);
return code;
} /*SRXAFS_SetLock */
ViceLog(1,
("SAFS_ExtendLock 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.ExtendLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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 */
+ if (errorCode == VREADONLY) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
ViceLog(2, ("SAFS_ExtendLock returns %d\n", errorCode));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_EXTENDLOCK);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_ExtendLock;
code = SAFSS_ExtendLock(acall, Fid, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, ExtendLockEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_ExtendLock */
ViceLog(1,
("SAFS_ReleaseLock 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));
+ ntohs(rxr_PortOf(tcon)), t_client->z.ViceId));
FS_LOCK;
AFSCallStats.ReleaseLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
* 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 (targetptr->disk.lock.lockCount <= 0) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- osi_Assert(!errorCode || errorCode == VSALVAGE);
- BreakCallBack(client->host, Fid, 0);
+ assert_vnode_success_or_salvaging(errorCode);
+ BreakCallBack(client->z.host, Fid, 0);
}
Bad_ReleaseLock:
/* Put back file's vnode and volume */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
- if ((errorCode == VREADONLY)) /* presumably, we already granted this lock */
+ if (errorCode == VREADONLY) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
ViceLog(2, ("SAFS_ReleaseLock returns %d\n", errorCode));
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_RELEASELOCK);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, Fid, &tcon, &thost)))
goto Bad_ReleaseLock;
code = SAFSS_ReleaseLock(acall, Fid, Sync);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, ReleaseLockEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_ReleaseLock */
{
/* Fix this sometime soon.. */
/* Because hey, it's not like we have a network monitoring protocol... */
- struct timeval time;
- /* this works on all system types */
- FT_GetTimeOfDay(&time, 0);
- stats->CurrentTime = time.tv_sec;
+ stats->CurrentTime = time(NULL);
} /*SetSystemStats */
void
if (seconds <= 0)
seconds = 1;
stats->StoreDataRate = AFSCallStats.TotalStoredBytes / seconds;
-#ifdef AFS_NT40_ENV
- stats->ProcessSize = -1; /* TODO: */
-#else
- stats->ProcessSize = (afs_int32) ((long)sbrk(0) >> 10);
-#endif
+ stats->ProcessSize = opr_procsize();
FS_UNLOCK;
h_GetWorkStats((int *)&(stats->WorkStations),
(int *)&(stats->ActiveWorkStations), (int *)0,
- (afs_int32) (FT_ApproxTime()) - (15 * 60));
+ (afs_int32) (time(NULL)) - (15 * 60));
} /*SetAFSStats */
for (part = DiskPartitionList; part && i < AFS_MSTATDISKS;
part = part->next) {
- stats->Disks[i].TotalBlocks = RoundInt64ToInt32(part->totalUsable);
- stats->Disks[i].BlocksAvailable = RoundInt64ToInt32(part->free);
+ stats->Disks[i].TotalBlocks = RoundInt64ToInt31(part->totalUsable);
+ stats->Disks[i].BlocksAvailable = RoundInt64ToInt31(part->free);
memset(stats->Disks[i].Name, 0, AFS_DISKNAMESIZE);
strncpy(stats->Disks[i].Name, part->name, AFS_DISKNAMESIZE);
i++;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
- if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetStatistics;
ViceLog(1, ("SAFS_GetStatistics Received\n"));
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, GetStatisticsEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
struct rx_connection *tcon = rx_ConnectionOf(acall);
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
- struct timeval time;
struct fsstats fsstats;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETSTATISTICS);
- if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetStatistics64;
+ if (statsVersion != STATS64_VERSION) {
+ code = EINVAL;
+ goto Bad_GetStatistics64;
+ }
+
ViceLog(1, ("SAFS_GetStatistics64 Received\n"));
Statistics->ViceStatistics64_val =
- malloc(statsVersion*sizeof(afs_int64));
+ malloc(statsVersion*sizeof(afs_uint64));
Statistics->ViceStatistics64_len = statsVersion;
FS_LOCK;
AFSCallStats.GetStatistics++, AFSCallStats.TotalCalls++;
seconds = 1;
Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
AFSCallStats.TotalStoredBytes / seconds;
-#ifdef AFS_NT40_ENV
- Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = -1;
-#else
- Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
- (afs_int32) ((long)sbrk(0) >> 10);
-#endif
+ Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = opr_procsize();
FS_UNLOCK;
h_GetWorkStats64(&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
&(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
0,
- (afs_int32) (FT_ApproxTime()) - (15 * 60));
-
-
+ (afs_int32) (time(NULL)) - (15 * 60));
- /* this works on all system types */
- FT_GetTimeOfDay(&time, 0);
- Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time.tv_sec;
+ Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time(NULL);
Bad_GetStatistics64:
code = CallPostamble(tcon, code, thost);
fsstats_FinishOp(&fsstats, code);
osi_auditU(acall, GetStatisticsEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
fsstats_FinishOp(&fsstats, 0);
osi_auditU(a_call, XStatsVersionEvent, 0,
- AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0, AUD_END);
return (0);
} /*SRXAFS_XStatsVersion */
afs_int32 * a_timeP, AFS_CollData * a_dataP)
{ /*SRXAFS_GetXStats */
+ struct client *t_client = NULL; /* tmp ptr to client data */
+ struct rx_connection *tcon = rx_ConnectionOf(a_call);
int code; /*Return value */
afs_int32 *dataBuffP; /*Ptr to data to be returned */
afs_int32 dataBytes; /*Bytes in data buffer */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETXSTATS);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
/*
* Record the time of day and the server version number.
*/
*a_srvVersionNumP = AFS_XSTAT_VERSION;
- *a_timeP = FT_ApproxTime();
+ *a_timeP = (afs_int32) time(NULL);
/*
* Stuff the appropriate data in there (assume victory)
*/
code = 0;
- ViceLog(1,
- ("Received GetXStats call for collection %d\n",
- a_collectionNumber));
+ osi_auditU(a_call, GetXStatsEvent,
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_INT, a_clientVersionNum,
+ AUD_INT, a_collectionNumber, AUD_END);
#if 0
/*
* for the File Server.
*/
dataBytes = sizeof(struct afs_Stats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_cmstats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
*/
dataBytes = sizeof(struct afs_PerfStats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_perfstats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
*/
afs_perfstats.numPerfCalls++;
-#if FS_STATS_DETAILED
afs_FullPerfStats.overall.numPerfCalls = afs_perfstats.numPerfCalls;
FillPerfValues(&afs_FullPerfStats.overall);
*/
dataBytes = sizeof(struct fs_stats_FullPerfStats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_FullPerfStats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
-#endif
break;
case AFS_XSTATSCOLL_CBSTATS:
afs_perfstats.numPerfCalls++;
dataBytes = sizeof(struct cbcounters);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
{
extern struct cbcounters cbstuff;
dataBuffP[0]=cbstuff.DeleteFiles;
FS_LOCK;
AFSCallStats.GiveUpCallBacks++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GiveUpCallBacks;
if (!FidArray && !CallBackArray) {
ViceLog(1,
("SAFS_GiveUpAllCallBacks: host=%x\n",
- (tcon->peer ? tcon->peer->host : 0)));
+ (rx_PeerOf(tcon) ? rx_HostOf(rx_PeerOf(tcon)) : 0)));
errorCode = GetClient(tcon, &client);
if (!errorCode) {
H_LOCK;
- DeleteAllCallBacks_r(client->host, 1);
+ DeleteAllCallBacks_r(client->z.host, 1);
H_UNLOCK;
PutClient(&client);
}
ViceLog(0,
("GiveUpCallBacks: #Fids %d < #CallBacks %d, host=%x\n",
FidArray->AFSCBFids_len, CallBackArray->AFSCBs_len,
- (tcon->peer ? tcon->peer->host : 0)));
+ (rx_PeerOf(tcon) ? rx_HostOf(rx_PeerOf(tcon)) : 0)));
errorCode = EINVAL;
goto Bad_GiveUpCallBacks;
}
if (!errorCode) {
for (i = 0; i < FidArray->AFSCBFids_len; i++) {
struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
- DeleteCallBack(client->host, fid);
+ DeleteCallBack(client->z.host, fid);
}
PutClient(&client);
}
FS_UNLOCK;
ViceLog(2, ("SAFS_GetCapabilties\n"));
- if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetCaps;
dataBytes = 1 * sizeof(afs_int32);
- dataBuffP = (afs_uint32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
if (saneacls)
code = CallPostamble(tcon, code, thost);
+ return code;
+}
+
+/* client is held, but not locked */
+static int
+FlushClientCPS(struct client *client, void *arock)
+{
+ ObtainWriteLock(&client->lock);
+
+ client->z.prfail = 2; /* Means re-eval client's cps */
+
+ if ((client->z.ViceId != ANONYMOUSID) && client->z.CPS.prlist_val) {
+ free(client->z.CPS.prlist_val);
+ client->z.CPS.prlist_val = NULL;
+ client->z.CPS.prlist_len = 0;
+ }
+
+ ReleaseWriteLock(&client->lock);
+
return 0;
}
afs_int32 nids, naddrs;
afs_int32 *vd, *addr;
Error errorCode = 0; /* return code to caller */
- struct client *client = 0;
ViceLog(1, ("SRXAFS_FlushCPS\n"));
FS_LOCK;
AFSCallStats.TotalCalls++;
FS_UNLOCK;
+
+ if (!viced_SuperUser(acall)) {
+ errorCode = EPERM;
+ goto Bad_FlushCPS;
+ }
+
nids = vids->ViceIds_len; /* # of users in here */
naddrs = addrs->IPAddrs_len; /* # of hosts in here */
if (nids < 0 || naddrs < 0) {
for (i = 0; i < nids; i++, vd++) {
if (!*vd)
continue;
- client = h_ID2Client(*vd); /* returns write locked and refCounted, or NULL */
- if (!client)
- continue;
-
- client->prfail = 2; /* Means re-eval client's cps */
-#ifdef notdef
- if (client->tcon) {
- rx_SetRock(((struct rx_connection *)client->tcon), 0);
- }
-#endif
- if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
- free(client->CPS.prlist_val);
- client->CPS.prlist_val = NULL;
- client->CPS.prlist_len = 0;
- }
- ReleaseWriteLock(&client->lock);
- PutClient(&client);
+ h_EnumerateClients(*vd, FlushClientCPS, NULL);
}
addr = addrs->IPAddrs_val;
rx_NewConnection(htonl(0x7f000001), htons(7003), 52, vlSec, 0);
rx_SetConnDeadTime(vlConn, 15); /* don't wait long */
}
- if (down && (FT_ApproxTime() < lastDownTime + 180)) {
+ if (down && (time(NULL) < lastDownTime + 180)) {
return 1; /* failure */
}
down = 0; /* call worked */
if (code) {
if (code < 0) {
- lastDownTime = FT_ApproxTime(); /* last time we tried an RPC */
+ lastDownTime = time(NULL); /* last time we tried an RPC */
down = 1;
}
return code;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMEINFO);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetVolumeInfo;
FS_LOCK;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETVOLUMESTATUS);
ViceLog(1, ("SAFS_GetVolumeStatus for volume %u\n", avolid));
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetVolumeStatus;
FS_LOCK;
(afs_int32) ROOTVNODE, dummyFid.Unique = 1;
if ((errorCode =
- GetVolumePackage(tcon, &dummyFid, &volptr, &targetptr, MustBeDIR,
+ GetVolumePackage(acall, &dummyFid, &volptr, &targetptr, MustBeDIR,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_GetVolumeStatus;
- if ((VanillaUser(client)) && (!(rights & PRSFS_READ))) {
- errorCode = EACCES;
- goto Bad_GetVolumeStatus;
- }
(void)RXGetVolumeStatus(FetchVolStatus, Name, OfflineMsg, Motd, volptr);
Bad_GetVolumeStatus:
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackage(acall, parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client);
ViceLog(2, ("SAFS_GetVolumeStatus returns %d\n", errorCode));
/* next is to guarantee out strings exist for stub */
if (*Name == 0) {
- *Name = (char *)malloc(1);
+ *Name = malloc(1);
**Name = 0;
}
if (*Motd == 0) {
- *Motd = (char *)malloc(1);
+ *Motd = malloc(1);
**Motd = 0;
}
if (*OfflineMsg == 0) {
- *OfflineMsg = (char *)malloc(1);
+ *OfflineMsg = malloc(1);
**OfflineMsg = 0;
}
errorCode = CallPostamble(tcon, errorCode, thost);
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, GetVolumeStatusEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_LONG, avolid, AUD_STR, *Name, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_LONG, avolid, AUD_STR, *Name, AUD_END);
return (errorCode);
} /*SRXAFS_GetVolumeStatus */
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_SETVOLUMESTATUS);
ViceLog(1, ("SAFS_SetVolumeStatus for volume %u\n", avolid));
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
goto Bad_SetVolumeStatus;
FS_LOCK;
(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);
fsstats_FinishOp(&fsstats, errorCode);
osi_auditU(acall, SetVolumeStatusEvent, errorCode,
- AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_LONG, avolid, AUD_STR, Name, AUD_END);
+ AUD_ID, t_client ? t_client->z.ViceId : 0,
+ AUD_LONG, avolid, AUD_STR, Name, AUD_END);
return (errorCode);
} /*SRXAFS_SetVolumeStatus */
return FSERR_EOPNOTSUPP;
#ifdef notdef
- if (errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))
+ if (errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost))
goto Bad_GetRootVolume;
FS_LOCK;
AFSCallStats.GetRootVolume++, AFSCallStats.TotalCalls++;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_CHECKTOKEN);
- if ((code = CallPreamble(acall, ACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &thost)))
goto Bad_CheckToken;
code = FSERR_ECONNREFUSED;
fsstats_StartOp(&fsstats, FS_STATS_RPCIDX_GETTIME);
- if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+ if ((code = CallPreamble(acall, NOTACTIVECALL, NULL, &tcon, &thost)))
goto Bad_GetTime;
FS_LOCK;
AFSCallStats.GetTime++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
- FT_GetTimeOfDay(&tpl, 0);
+ gettimeofday(&tpl, 0);
*Seconds = tpl.tv_sec;
*USeconds = tpl.tv_usec;
rx_Write(Call, (char *)&zero, sizeof(afs_int32)); /* send 0-length */
return (0);
}
- FT_GetTimeOfDay(&StartTime, 0);
+ gettimeofday(&StartTime, 0);
ihP = targetptr->handle;
fdP = IH_OPEN(ihP);
if (fdP == NULL) {
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
optSize = sendBufSize;
if (tlen < 0) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
if (CheckLength(volptr, targetptr, tlen)) {
{
afs_int32 high, low;
SplitOffsetOrSize(Len, high, low);
- osi_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
+ opr_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
if (Int64Mode) {
high = htonl(high);
rx_Write(Call, (char *)&high, sizeof(afs_int32)); /* High order bits */
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
nBytes = rx_Write(Call, tbuffer, wlen);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
nBytes = rx_Writev(Call, tiov, tnio, wlen);
FreeSendBuffer((struct afs_buffer *)tbuffer);
#endif /* HAVE_PIOV */
FDH_CLOSE(fdP);
- FT_GetTimeOfDay(&StopTime, 0);
+ gettimeofday(&StopTime, 0);
/* Adjust all Fetch Data related stats */
FS_LOCK;
afs_sfsize_t * a_bytesStoredP)
{
afs_sfsize_t bytesTransfered; /* number of bytes actually transfered */
- struct timeval StartTime, StopTime; /* Used to measure how long the store takes */
Error errorCode = 0; /* Returned error code to caller */
#ifndef HAVE_PIOV
char *tbuffer; /* data copying buffer */
afs_fsize_t NewLength; /* size after this store completes */
afs_sfsize_t adjustSize; /* bytes to call VAdjust... with */
int linkCount = 0; /* link count on inode */
- afs_fsize_t CoW_off, CoW_len;
ssize_t nBytes;
- FdHandle_t *fdP, *origfdP = NULL;
+ FdHandle_t *fdP;
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
afs_ino_str_t stmp;
* We break the callbacks here so that the following signal will not
* leave a window.
*/
- BreakCallBack(client->host, Fid, 0);
+ BreakCallBack(client->z.host, Fid, 0);
if (Pos == -1 || VN_GET_INO(targetptr) == 0) {
/* the inode should have been created in Alloc_NewVnode */
if (GetLinkCountAndSize(volptr, fdP, &linkCount, &DataLength) < 0) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
- ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0, ("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
if (CheckLength(volptr, targetptr, DataLength)) {
* mechanisms (i.e. copy on write overhead.) Also the right size
* of the disk will be recorded...
*/
- origfdP = fdP;
+ FDH_CLOSE(fdP);
VN_GET_LEN(size, targetptr);
volptr->partition->flags &= ~PART_DONTUPDATE;
VSetPartitionDiskUsage(volptr->partition);
volptr->partition->flags |= PART_DONTUPDATE;
if ((errorCode = VDiskUsage(volptr, nBlocks(size)))) {
volptr->partition->flags &= ~PART_DONTUPDATE;
- FDH_CLOSE(origfdP);
return (errorCode);
}
- CoW_len = (FileLength >= (Length + Pos)) ? FileLength - Length : Pos;
- CopyOnWrite_calls++;
- if (CoW_len == 0) CopyOnWrite_size0++;
- if (Pos == 0) CopyOnWrite_off0++;
- if (CoW_len > CopyOnWrite_maxsize) CopyOnWrite_maxsize = CoW_len;
-
- ViceLog(1, ("StoreData : calling CopyOnWrite on vnode %u.%u (%s) "
- "off 0x0 size 0x%llx\n",
- afs_printable_VolumeId_u(V_id(volptr)),
- afs_printable_VnodeId_u(targetptr->vnodeNumber),
- V_name(volptr), Pos));
- if ((errorCode = CopyOnWrite(targetptr, volptr, 0, Pos))) {
+ ViceLog(25, ("StoreData : calling CopyOnWrite on target dir\n"));
+ if ((errorCode = CopyOnWrite(targetptr, volptr, 0, MAXFSIZE))) {
ViceLog(25, ("StoreData : CopyOnWrite failed\n"));
volptr->partition->flags &= ~PART_DONTUPDATE;
- FDH_CLOSE(origfdP);
return (errorCode);
}
volptr->partition->flags &= ~PART_DONTUPDATE;
if (fdP == NULL) {
ViceLog(25,
("StoreData : Reopen after CopyOnWrite failed\n"));
- FDH_REALLYCLOSE(origfdP);
return ENOENT;
}
}
}
if (!VALID_INO(tinode)) {
VTakeOffline(volptr);
- ViceLog(0,("Volume %u now offline, must be salvaged.\n",
- volptr->hashid));
+ ViceLog(0,("Volume %" AFS_VOLID_FMT " now offline, must be salvaged.\n",
+ afs_printable_VolumeId_lu(volptr->hashid)));
return EIO;
}
AdjustDiskUsage(volptr, adjustSize,
adjustSize - SpareComp(volptr)))) {
FDH_CLOSE(fdP);
- if (origfdP) FDH_REALLYCLOSE(origfdP);
return (errorCode);
}
/* this bit means that the locks are set and protections are OK */
rx_SetLocalStatus(Call, 1);
- FT_GetTimeOfDay(&StartTime, 0);
-
optSize = sendBufSize;
ViceLog(25,
("StoreData_RXStyle: Pos %llu, DataLength %llu, FileLength %llu, Length %llu\n",
(afs_uintmax_t) Pos, (afs_uintmax_t) DataLength,
(afs_uintmax_t) FileLength, (afs_uintmax_t) Length));
- /* truncate the file iff it needs it (ftruncate is slow even when its a noop) */
- if (FileLength < DataLength)
- FDH_TRUNC(fdP, FileLength);
bytesTransfered = 0;
#ifndef HAVE_PIOV
tbuffer = AllocSendBuffer();
#endif /* HAVE_PIOV */
+ /* truncate the file iff it needs it (ftruncate is slow even when its a noop) */
+ if (FileLength < DataLength) {
+ errorCode = FDH_TRUNC(fdP, FileLength);
+ if (errorCode)
+ goto done;
+ }
+
/* 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.
*/
+ tlen = 0; /* Just a source of data for the write */
nBytes = FDH_PWRITE(fdP, &tlen, 1, Pos);
if (nBytes != 1) {
errorCode = -1;
FreeSendBuffer((struct afs_buffer *)tbuffer);
#endif /* HAVE_PIOV */
if (sync) {
- FDH_SYNC(fdP);
+ (void) FDH_SYNC(fdP);
}
if (errorCode) {
+ Error tmp_errorCode = 0;
afs_sfsize_t nfSize = FDH_SIZE(fdP);
- osi_Assert(nfSize >= 0);
+ opr_Assert(nfSize >= 0);
/* something went wrong: adjust size and return */
VN_SET_LEN(targetptr, nfSize); /* set new file size. */
/* changed_newTime is tested in StoreData to detemine if we
* need to update the target vnode.
*/
targetptr->changed_newTime = 1;
- if (origfdP && (bytesTransfered < Length)) /* Need to "finish" CopyOnWrite still */
- CopyOnWrite2(origfdP, fdP, Pos + bytesTransfered, NewLength - Pos - bytesTransfered);
- if (origfdP) FDH_REALLYCLOSE(origfdP);
FDH_CLOSE(fdP);
/* set disk usage to be correct */
- VAdjustDiskUsage(&errorCode, volptr,
+ VAdjustDiskUsage(&tmp_errorCode, volptr,
(afs_sfsize_t) (nBlocks(nfSize) -
nBlocks(NewLength)), 0);
- return errorCode;
- }
- if (origfdP) { /* finish CopyOnWrite */
- if ( (CoW_off = Pos + Length) < NewLength) {
- errorCode = CopyOnWrite2(origfdP, fdP, CoW_off, CoW_len = NewLength - CoW_off);
- ViceLog(1, ("StoreData : CopyOnWrite2 on vnode %u.%u (%s) "
- "off 0x%llx size 0x%llx returns %d\n",
- afs_printable_VolumeId_u(V_id(volptr)),
- afs_printable_VnodeId_u(targetptr->vnodeNumber),
- V_name(volptr), CoW_off, CoW_len, errorCode));
+ if (tmp_errorCode) {
+ errorCode = tmp_errorCode;
}
- FDH_REALLYCLOSE(origfdP);
+ return errorCode;
}
FDH_CLOSE(fdP);
- FT_GetTimeOfDay(&StopTime, 0);
-
VN_SET_LEN(targetptr, NewLength);
/* Update all StoreData related stats */
static struct rx_securityClass *sc = 0;
int i,j;
struct rx_connection *conn;
+ afs_int32 viceid = -1;
#endif
- if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &tcallhost)))
+ if ((errorCode = CallPreamble(acall, ACTIVECALL, NULL, &tcon, &tcallhost)))
goto Bad_CallBackRxConnAddr1;
#ifndef __EXPERIMENTAL_CALLBACK_CONN_MOVING
errorCode = 1;
#else
H_LOCK;
- tclient = h_FindClient_r(tcon);
+ tclient = h_FindClient_r(tcon, &viceid);
if (!tclient) {
errorCode = VBUSY;
+ LogClientError("Client host too busy (CallBackRxConnAddr)", tcon, viceid, NULL);
goto Bad_CallBackRxConnAddr;
}
- thost = tclient->host;
+ thost = tclient->z.host;
/* nothing more can be done */
- if ( !thost->interface )
+ if ( !thost->z.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->z.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++)
+ for ( i=0; i < thost->z.interface->numberOfInterfaces; i++)
{
- if ( *addr == thost->interface->addr[i] ) {
+ if ( *addr == thost->z.interface->addr[i] ) {
break;
}
}
- if ( *addr != thost->interface->addr[i] )
+ if ( *addr != thost->z.interface->addr[i] )
goto Bad_CallBackRxConnAddr;
- conn = rx_NewConnection (thost->interface->addr[i],
- thost->port, 1, sc, 0);
+ conn = rx_NewConnection (thost->z.interface->addr[i],
+ thost->z.port, 1, sc, 0);
rx_SetConnDeadTime(conn, 2);
rx_SetConnHardDeadTime(conn, AFS_HARDDEADTIME);
H_UNLOCK;
errorCode = RXAFSCB_Probe(conn);
H_LOCK;
if (!errorCode) {
- if ( thost->callback_rxcon )
- rx_DestroyConnection(thost->callback_rxcon);
- thost->callback_rxcon = conn;
- thost->host = addr;
- rx_SetConnDeadTime(thost->callback_rxcon, 50);
- rx_SetConnHardDeadTime(thost->callback_rxcon, AFS_HARDDEADTIME);
+ if ( thost->z.callback_rxcon )
+ rx_DestroyConnection(thost->z.callback_rxcon);
+ thost->z.callback_rxcon = conn;
+ thost->z.host = addr;
+ rx_SetConnDeadTime(thost->z.callback_rxcon, 50);
+ rx_SetConnHardDeadTime(thost->z.callback_rxcon, AFS_HARDDEADTIME);
h_ReleaseClient_r(tclient);
/* The hold on thost will be released by CallPostamble */
H_UNLOCK;