/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
/* */
/* ********************************************************************** */
-/*
- * in Check_PermissionRights, certain privileges are afforded to the owner
- * of the volume, or the owner of a file. Are these considered "use of
- * privilege"?
+/*
+ * in Check_PermissionRights, certain privileges are afforded to the owner
+ * of the volume, or the owner of a file. Are these considered "use of
+ * privilege"?
*/
#include <afsconfig.h>
#include <afs/param.h>
+#include <afs/stds.h>
+#include <roken.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
#ifdef AFS_SGI_ENV
#undef SHARED /* XXX */
#endif
-#ifdef AFS_NT40_ENV
-#include <fcntl.h>
-#else
-#include <sys/param.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <string.h>
-
-#ifndef AFS_LINUX20_ENV
+
+#ifdef HAVE_NET_IF_H
#include <net/if.h>
+#endif
+
+#ifdef HAVE_NETINET_IF_ETHER_H
#include <netinet/if_ether.h>
#endif
+
+#if !defined(AFS_SGI_ENV) && defined(HAVE_SYS_MAP_H)
+#include <sys/map.h>
+#endif
+
+#ifdef HAVE_SYS_STATFS_H
+#include <sys/statfs.h>
+#endif
+
+#ifdef HAVE_SYS_LOCKF_H
+#include <sys/lockf.h>
+#endif
+
+#ifdef HAVE_SYS_DK_H
+#include <sys/dk.h>
#endif
+
#ifdef AFS_HPUX_ENV
/* included early because of name conflict on IOPEN */
#include <sys/inode.h>
#undef IOPEN
#endif
#endif /* AFS_HPUX_ENV */
-#include <afs/stds.h>
+
#include <rx/xdr.h>
#include <afs/nfs.h>
-#include <afs/assert.h>
+#include <afs/afs_assert.h>
#include <lwp.h>
#include <lock.h>
#include <afs/afsint.h>
#include <afs/acl.h>
#include <rx/rx.h>
#include <rx/rx_globals.h>
-#include <sys/stat.h>
-#if ! defined(AFS_SGI_ENV) && ! defined(AFS_AIX32_ENV) && ! defined(AFS_NT40_ENV) && ! defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
-#include <sys/map.h>
-#endif
-#if !defined(AFS_NT40_ENV)
-#include <unistd.h>
-#endif
-#if !defined(AFS_SGI_ENV) && !defined(AFS_NT40_ENV)
-#ifdef AFS_AIX_ENV
-#include <sys/statfs.h>
-#include <sys/lockf.h>
-#else
-#if !defined(AFS_SUN5_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_XBSD_ENV)
-#include <sys/dk.h>
-#endif
-#endif
-#endif
+
#include <afs/cellconfig.h>
#include <afs/keys.h>
-#include <signal.h>
#include <afs/partition.h>
#include "viced_prototypes.h"
#include "viced.h"
#include <afs/afsutil.h>
#include <afs/dir.h>
-extern void SetDirHandle(register DirHandle * dir, register Vnode * vnode);
+extern void SetDirHandle(DirHandle * dir, Vnode * vnode);
extern void FidZap(DirHandle * file);
extern void FidZero(DirHandle * file);
pthread_mutex_t fileproc_glock_mutex;
#endif /* AFS_PTHREAD_ENV */
-#ifdef O_LARGEFILE
-#define afs_stat stat64
-#define afs_fstat fstat64
-#define afs_open open64
-#else /* !O_LARGEFILE */
-#define afs_stat stat
-#define afs_fstat fstat
-#define afs_open open
-#endif /* !O_LARGEFILE */
-
-
/* Useful local defines used by this module */
#define DONTCHECK 0
extern int HTs, HTBlocks;
afs_int32 FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
- register struct rx_call *Call, afs_sfsize_t Pos,
+ struct rx_call *Call, afs_sfsize_t Pos,
afs_sfsize_t Len, afs_int32 Int64Mode,
#if FS_STATS_DETAILED
afs_sfsize_t * a_bytesToFetchP,
afs_int32 StoreData_RXStyle(Volume * volptr, Vnode * targetptr,
struct AFSFid *Fid, struct client *client,
- register struct rx_call *Call, afs_fsize_t Pos,
+ struct rx_call *Call, afs_fsize_t Pos,
afs_fsize_t Length, afs_fsize_t FileLength,
int sync,
#if FS_STATS_DETAILED
afs_int32
SpareComp(Volume * avolp)
{
- register afs_int32 temp;
+ afs_int32 temp;
FS_LOCK;
if (PctSpare) {
* the Cache Manager knows that the volume must be purged from the stat cache.
*/
static void
-SetVolumeSync(register struct AFSVolSync *async, register Volume * avol)
+SetVolumeSync(struct AFSVolSync *async, Volume * avol)
{
FS_LOCK;
/* date volume instance was created */
FS_UNLOCK;
} /*SetVolumeSync */
+/**
+ * Verify that the on-disk size for a vnode matches the length in the vnode
+ * index.
+ *
+ * @param[in] vp Volume pointer
+ * @param[in] vnp Vnode pointer
+ * @param[in] alen Size of the vnode on disk, if known. If unknown, give -1,
+ * and CheckLength itself will determine the on-disk size.
+ *
+ * @return operation status
+ * @retval 0 lengths match
+ * @retval nonzero Error; either the lengths do not match or there was an
+ * error determining the on-disk size. The volume should be
+ * taken offline and salvaged.
+ */
+static int
+CheckLength(struct Volume *vp, struct Vnode *vnp, afs_sfsize_t alen)
+{
+ afs_sfsize_t vlen;
+ VN_GET_LEN(vlen, vnp);
+
+ if (alen < 0) {
+ FdHandle_t *fdP;
+
+ fdP = IH_OPEN(vnp->handle);
+ if (fdP == NULL) {
+ ViceLog(0, ("CheckLength: cannot open inode for fid %lu.%lu.%lu\n",
+ afs_printable_uint32_lu(vp->hashid),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier)));
+ return -1;
+ }
+ alen = FDH_SIZE(fdP);
+ FDH_CLOSE(fdP);
+ if (alen < 0) {
+ afs_int64 alen64 = alen;
+ ViceLog(0, ("CheckLength: cannot get size for inode for fid "
+ "%lu.%lu.%lu; FDH_SIZE returned %" AFS_INT64_FMT "\n",
+ afs_printable_uint32_lu(vp->hashid),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier),
+ alen64));
+ return -1;
+ }
+ }
+
+ if (alen != vlen) {
+ afs_int64 alen64 = alen, vlen64 = vlen;
+ ViceLog(0, ("Fid %lu.%lu.%lu has inconsistent length (index "
+ "%lld inode %lld ); volume must be salvaged\n",
+ afs_printable_uint32_lu(vp->hashid),
+ afs_printable_uint32_lu(Vn_id(vnp)),
+ afs_printable_uint32_lu(vnp->disk.uniquifier),
+ vlen64, alen64));
+ return -1;
+ }
+ return 0;
+}
+
/*
* Note that this function always returns a held host, so
* that CallPostamble can block without the host's disappearing.
* Call returns rx connection in passed in *tconn
*/
static int
-CallPreamble(register struct rx_call *acall, int activecall,
+CallPreamble(struct rx_call *acall, int activecall,
struct rx_connection **tconn, struct host **ahostp)
{
struct host *thost;
code = hpr_Initialize(&uclient);
if (!code)
- assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
+ osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
H_LOCK;
#else
code = pr_Initialize(2, AFSDIR_SERVER_ETC_DIRPATH, 0);
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
("BreakDelayedCallbacks FAILED for host %s:%d which IS UP. Connection from %s:%d. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
+ afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
if (MultiProbeAlternateAddress_r(thost)) {
ViceLog(0,
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
("BreakDelayedCallbacks FAILED AGAIN for host %s:%d which IS UP. Connection from %s:%d. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
+ afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port), afs_inet_ntoa_r(rxr_HostOf(*tconn), hoststr2),
ntohs(rxr_PortOf(*tconn))));
code = -1;
}
static afs_int32
-CallPostamble(register struct rx_connection *aconn, afs_int32 ret,
+CallPostamble(struct rx_connection *aconn, afs_int32 ret,
struct host *ahost)
{
struct host *thost;
H_LOCK;
tclient = h_FindClient_r(aconn);
- if (!tclient)
+ if (!tclient)
goto busyout;
thost = tclient->host;
if (thost->hostFlags & HERRORTRANS)
* are incremented and they must be eventualy released.
*/
static afs_int32
-CheckVnode(AFSFid * fid, Volume ** volptr, Vnode ** vptr, int lock)
+CheckVnodeWithCall(AFSFid * fid, Volume ** volptr, struct VCallByVol *cbv,
+ Vnode ** vptr, int lock)
{
Error fileCode = 0;
Error local_errorCode, errorCode = -1;
extern int VInit;
while (1) {
- int restarting =
+ int restarting =
#ifdef AFS_DEMAND_ATTACH_FS
VSALVAGE
#else
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 = VGetVolume(&local_errorCode, &errorCode, (afs_int32) fid->Volume);
+ *volptr = VGetVolumeWithCall(&local_errorCode, &errorCode,
+ fid->Volume, ts, cbv);
if (!errorCode) {
- assert(*volptr);
+ osi_Assert(*volptr);
break;
}
if ((errorCode == VOFFLINE) && (VInit < 2)) {
/* The volume we want may not be attached yet because
* the volume initialization is not yet complete.
- * We can do several things:
+ * We can do several things:
* 1. return -1, which will cause users to see
* "connection timed out". This is more or
* less the same as always, except that the servers
* may appear to bounce up and down while they
* are actually restarting.
- * 2. return VBUSY which will cause clients to
+ * 2. return VBUSY which will cause clients to
* sleep and retry for 6.5 - 15 minutes, depending
* on what version of the CM they are running. If
- * the file server takes longer than that interval
+ * the file server takes longer than that interval
* to attach the desired volume, then the application
- * will see an ENODEV or EIO. This approach has
+ * will see an ENODEV or EIO. This approach has
* the advantage that volumes which have been attached
* are immediately available, it keeps the server's
* immediate backlog low, and the call is interruptible
* by the user. Users see "waiting for busy volume."
* 3. sleep here and retry. Some people like this approach
- * because there is no danger of seeing errors. However,
- * this approach only works with a bounded number of
+ * because there is no danger of seeing errors. However,
+ * this approach only works with a bounded number of
* clients, since the pending queues will grow without
* stopping. It might be better to find a way to take
* this call and stick it back on a queue in order to
- * recycle this thread for a different request.
+ * recycle this thread for a different request.
* 4. Return a new error code, which new cache managers will
* know enough to interpret as "sleep and retry", without
* the upper bound of 6-15 minutes that is imposed by the
* VBUSY handling. Users will see "waiting for
* busy volume," so they know that something is
- * happening. Old cache managers must be able to do
+ * happening. Old cache managers must be able to do
* something reasonable with this, for instance, mark the
* server down. Fortunately, any error code < 0
* will elicit that behavior. See #1.
}
}
}
- /* allow read operations on busy volume.
+ /* allow read operations on busy volume.
* must check local_errorCode because demand attach fs
* can have local_errorCode == VSALVAGING, errorCode == VBUSY */
else if (local_errorCode == VBUSY && lock == READ_LOCK) {
return (errorCode);
}
}
- assert(*volptr);
+ osi_Assert(*volptr);
/* get the vnode */
*vptr = VGetVnode(&errorCode, *volptr, fid->Vnode, lock);
return (errorCode);
if ((*vptr)->disk.uniquifier != fid->Unique) {
VPutVnode(&fileCode, *vptr);
- assert(fileCode == 0);
+ osi_Assert(fileCode == 0);
*vptr = 0;
return (VNOVNODE); /* return the right error code, at least */
}
return (0);
} /*CheckVnode */
+static_inline afs_int32
+CheckVnode(AFSFid * fid, Volume ** volptr, Vnode ** vptr, int lock)
+{
+ return CheckVnodeWithCall(fid, volptr, NULL, vptr, lock);
+}
+
/*
* This routine returns the ACL associated with the targetptr. If the
* targetptr isn't a directory, we access its parent dir and get the ACL
*ACLSize = VAclSize(*targetptr);
return (0);
} else {
- assert(Fid != 0);
+ osi_Assert(Fid != 0);
while (1) {
VnodeId parentvnode;
Error errorCode = 0;
/* Must not be called with H_LOCK held */
static void
-client_CheckRights(struct client *client, struct acl_accessList *ACL,
+client_CheckRights(struct client *client, struct acl_accessList *ACL,
afs_int32 *rights)
{
*rights = 0;
afs_int32 code = 0;
ObtainReadLock(&client->lock);
- if (client->CPS.prlist_len > 0 && !client->deleted &&
+ if (client->CPS.prlist_len > 0 && !client->deleted &&
client->host && !(client->host->hostFlags & HOSTDELETED))
code = acl_IsAMember(id, &client->CPS);
ReleaseReadLock(&client->lock);
while (client->host->hostFlags & HCPS_INPROGRESS) {
client->host->hostFlags |= HCPS_WAITING; /* I am waiting */
#ifdef AFS_PTHREAD_ENV
- pthread_cond_wait(&client->host->cond, &host_glock_mutex);
+ CV_WAIT(&client->host->cond, &host_glock_mutex);
#else /* AFS_PTHREAD_ENV */
if ((code =
LWP_WaitProcess(&(client->host->hostFlags))) != LWP_SUCCESS)
char hoststr[16];
ViceLog(5,
("CheckRights: len=%u, for host=%s:%d\n",
- client->host->hcps.prlist_len,
+ client->host->hcps.prlist_len,
afs_inet_ntoa_r(client->host->host, hoststr),
ntohs(client->host->port)));
} else
* interface calls.
*/
static afs_int32
-GetVolumePackage(struct rx_connection *tcon, AFSFid * Fid, Volume ** volptr,
- Vnode ** targetptr, int chkforDir, Vnode ** parent,
- struct client **client, int locktype, afs_int32 * rights,
- afs_int32 * anyrights)
+GetVolumePackageWithCall(struct rx_connection *tcon, struct VCallByVol *cbv,
+ AFSFid * Fid, Volume ** volptr, Vnode ** targetptr,
+ int chkforDir, Vnode ** parent, struct client **client,
+ int locktype, afs_int32 * rights, afs_int32 * anyrights)
{
struct acl_accessList *aCL; /* Internal access List */
int aCLSize; /* size of the access list */
Error errorCode = 0; /* return code to caller */
- if ((errorCode = CheckVnode(Fid, volptr, targetptr, locktype)))
+ if ((errorCode = CheckVnodeWithCall(Fid, volptr, cbv, targetptr, locktype)))
return (errorCode);
if (chkforDir) {
if (chkforDir == MustNOTBeDIR
(chkforDir == MustBeDIR ? 0 : locktype))) != 0)
return (errorCode);
if (chkforDir == MustBeDIR)
- assert((*parent) == 0);
+ osi_Assert((*parent) == 0);
if (!(*client)) {
if ((errorCode = GetClient(tcon, client)) != 0)
return (errorCode);
} /*GetVolumePackage */
+static_inline afs_int32
+GetVolumePackage(struct rx_connection *tcon, AFSFid * Fid, Volume ** volptr,
+ Vnode ** targetptr, int chkforDir, Vnode ** parent,
+ struct client **client, int locktype, afs_int32 * rights,
+ afs_int32 * anyrights)
+{
+ return GetVolumePackageWithCall(tcon, NULL, Fid, volptr, targetptr,
+ chkforDir, parent, client, locktype,
+ rights, anyrights);
+}
+
/*
* This is the opposite of GetVolumePackage(), and is always used at the end of
* AFS calls to put back all used vnodes and the volume in the proper order!
*/
static void
-PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
- Vnode * parentptr, Volume * volptr, struct client **client)
+PutVolumePackageWithCall(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+ Vnode * parentptr, Volume * volptr,
+ struct client **client, struct VCallByVol *cbv)
{
Error fileCode = 0; /* Error code returned by the volume package */
if (parentwhentargetnotdir) {
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (targetptr) {
VPutVnode(&fileCode, targetptr);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (parentptr) {
VPutVnode(&fileCode, parentptr);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
}
if (volptr) {
- VPutVolume(volptr);
+ VPutVolumeWithCall(volptr, cbv);
}
if (*client) {
PutClient(client);
}
} /*PutVolumePackage */
+static_inline void
+PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
+ Vnode * parentptr, Volume * volptr, struct client **client)
+{
+ PutVolumePackageWithCall(parentwhentargetnotdir, targetptr, parentptr,
+ volptr, client, NULL);
+}
+
static int
-VolumeOwner(register struct client *client, register Vnode * targetptr)
+VolumeOwner(struct client *client, Vnode * targetptr)
{
afs_int32 owner = V_owner(targetptr->volumePtr); /* get volume owner */
if (owner >= 0)
return (client->ViceId == owner);
else {
- /*
+ /*
* We don't have to check for host's cps since only regular
* viceid are volume owners.
*/
* StoreStatus) related calls
*/
/* this code should probably just set a "priv" flag where all the audit events
- * are now, and only generate the audit event once at the end of the routine,
+ * are now, and only generate the audit event once at the end of the routine,
* thus only generating the event if all the checks succeed, but only because
* of the privilege XXX
*/
} else { /* file */
/* must have read access, or be owner and have insert access */
if (!(rights & PRSFS_READ)
- && !(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)))
+ && !((OWNSp(client, targetptr) && (rights & PRSFS_INSERT)
+ && (client->ViceId != AnonymousID))))
return (EACCES);
}
if (CallingRoutine == CHK_FETCHDATA
Inode ino, nearInode;
ssize_t rdlen;
ssize_t wrlen;
- register afs_fsize_t size;
+ afs_fsize_t size;
+ afs_foff_t done;
size_t length;
char *buff;
int rc; /* return code */
DFlush(); /* just in case? */
VN_GET_LEN(size, targetptr);
- if (size > off)
+ if (size > off)
size -= off;
- else
+ else
size = 0;
if (size > len)
size = len;
ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
volptr->hashid));
return EIO;
- }
+ }
targFdP = IH_OPEN(targetptr->handle);
if (targFdP == NULL) {
rc = errno;
}
IH_INIT(newH, V_device(volptr), V_id(volptr), ino);
newFdP = IH_OPEN(newH);
- assert(newFdP != NULL);
+ osi_Assert(newFdP != NULL);
- FDH_SEEK(targFdP, off, SEEK_SET);
- FDH_SEEK(newFdP, off, SEEK_SET);
+ done = off;
while (size > 0) {
if (size > COPYBUFFSIZE) { /* more than a buffer */
length = COPYBUFFSIZE;
length = size;
size = 0;
}
- rdlen = FDH_READ(targFdP, buff, length);
- if (rdlen == length)
- wrlen = FDH_WRITE(newFdP, buff, length);
- else
+ rdlen = FDH_PREAD(targFdP, buff, length, done);
+ if (rdlen == length) {
+ wrlen = FDH_PWRITE(newFdP, buff, length, done);
+ done += rdlen;
+ } else
wrlen = 0;
/* Callers of this function are not prepared to recover
* from error that put the filesystem in an inconsistent
FDH_REALLYCLOSE(targFdP);
rc = IH_DEC(V_linkHandle(volptr), VN_GET_INO(targetptr),
V_parentId(volptr));
- assert(!rc);
+ osi_Assert(!rc);
IH_RELEASE(targetptr->handle);
rc = FDH_SYNC(newFdP);
- assert(rc == 0);
+ osi_Assert(rc == 0);
FDH_CLOSE(newFdP);
targetptr->handle = newH;
VN_SET_INO(targetptr, ino);
} /*CopyOnWrite */
static int
-CopyOnWrite2(FdHandle_t *targFdP, FdHandle_t *newFdP, afs_foff_t off, afs_fsize_t size) {
- char *buff = (char *)malloc(COPYBUFFSIZE);
+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;
+ int rc = 0;
+ afs_foff_t done = off;
- FDH_SEEK(targFdP, off, SEEK_SET);
- FDH_SEEK(newFdP, off, SEEK_SET);
+ if (size > FDH_SIZE(targFdP) - off)
+ size = FDH_SIZE(targFdP) - off;
- if (size > FDH_SIZE(targFdP) - off) size = FDH_SIZE(targFdP) - off;
while (size > 0) {
if (size > COPYBUFFSIZE) { /* more than a buffer */
length = COPYBUFFSIZE;
length = size;
size = 0;
}
- rdlen = FDH_READ(targFdP, buff, length);
- if (rdlen == length)
- wrlen = FDH_WRITE(newFdP, buff, length);
+ 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 */
+ /* no error recovery, at the worst we'll have a "hole"
+ * in the file */
rc = 1;
break;
}
DirHandle childdir; /* Handle for dir package I/O */
Error errorCode = 0;
int code;
+ afs_ino_str_t stmp;
/* watch for invalid names */
if (!strcmp(Name, ".") || !strcmp(Name, ".."))
return (EINVAL);
+
+ if (CheckLength(volptr, parentptr, -1)) {
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
+
if (parentptr->disk.cloned) {
ViceLog(25, ("DeleteTarget : CopyOnWrite called\n"));
if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) {
} else if ((*targetptr)->disk.type == vDirectory)
return (EISDIR);
- /*assert((*targetptr)->disk.uniquifier == fileFid->Unique); */
+ /*osi_Assert((*targetptr)->disk.uniquifier == fileFid->Unique); */
/**
* If the uniquifiers dont match then instead of asserting
* take the volume offline and return VSALVAGE
if (errorCode == -1) {
ViceLog(0,
("DT: inode=%s, name=%s, errno=%d\n",
- PrintInode(NULL, VN_GET_INO(*targetptr)), Name,
+ PrintInode(stmp, VN_GET_INO(*targetptr)), Name,
errno));
if (errno != ENOENT)
{
parentptr->disk.dataVersion++;
newlength = (afs_fsize_t) Length(dir);
- /*
+ /*
* This is a called on both dir removals (i.e. remove, removedir, rename) but also in dir additions
* (create, symlink, link, makedir) so we need to check if we have enough space
* XXX But we still don't check the error since we're dealing with dirs here and really the increase
Error temp;
Inode inode = 0;
Inode nearInode; /* hint for inode allocation in solaris */
+ afs_ino_str_t stmp;
if ((errorCode =
AdjustDiskUsage(volptr, BlocksPreallocatedForVnode,
BlocksPreallocatedForVnode))) {
ViceLog(25,
- ("Insufficient space to allocate %" AFS_INT64_FMT " blocks\n",
+ ("Insufficient space to allocate %lld blocks\n",
(afs_intmax_t) BlocksPreallocatedForVnode));
return (errorCode);
}
+ if (CheckLength(volptr, parentptr, -1)) {
+ VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
+
*targetptr = VAllocVnode(&errorCode, volptr, FileType);
if (errorCode != 0) {
VAdjustDiskUsage(&temp, volptr, -BlocksPreallocatedForVnode, 0);
if (IH_DEC(V_linkHandle(volptr), inode, V_parentId(volptr)))
ViceLog(0,
("Alloc_NewVnode: partition %s idec %s failed\n",
- volptr->partition->name, PrintInode(NULL, inode)));
+ volptr->partition->name, PrintInode(stmp, inode)));
IH_RELEASE((*targetptr)->handle);
return errorCode;
if (IH_DEC(V_linkHandle(volptr), inode, V_parentId(volptr)))
ViceLog(0,
("Alloc_NewVnode: partition %s idec %s failed\n",
- volptr->partition->name, PrintInode(NULL, inode)));
+ volptr->partition->name, PrintInode(stmp, inode)));
IH_RELEASE((*targetptr)->handle);
return (errorCode);
}
0;
Time += AFS_LOCKWAIT;
if (LockingType == LockRead) {
- if ( !(rights & PRSFS_LOCK) &&
+ if ( !(rights & PRSFS_LOCK) &&
!(rights & PRSFS_WRITE) &&
!(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)) )
return(EACCES);
} else
return (EAGAIN);
} else if (LockingType == LockWrite) {
- if ( !(rights & PRSFS_WRITE) &&
+ if ( !(rights & PRSFS_WRITE) &&
!(OWNSp(client, targetptr) && (rights & PRSFS_INSERT)) )
return(EACCES);
temp = strlen(V_name(volptr)) + 1;
*name = malloc(temp);
if (!*name) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*name, V_name(volptr));
temp = strlen(V_offlineMessage(volptr)) + 1;
*offMsg = malloc(temp);
if (!*offMsg) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*offMsg, V_offlineMessage(volptr));
#if OPENAFS_VOL_STATS
*motd = malloc(1);
if (!*motd) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*motd, nullString);
#else
temp = strlen(V_motd(volptr)) + 1;
*motd = malloc(temp);
if (!*motd) {
- ViceLog(0, ("Failed malloc in RXGetVolumeStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
strcpy(*motd, V_motd(volptr));
#endif /* FS_STATS_DETAILED */
static afs_int32
-FileNameOK(register char *aname)
+FileNameOK(char *aname)
{
- register afs_int32 i, tc;
+ afs_int32 i, tc;
i = strlen(aname);
if (i >= 4) {
/* watch for @sys on the right */
default:
code = EINVAL;
}
- ViceLog(1,("FsCmd: cmd = %d, code=%d\n",
+ ViceLog(1,("FsCmd: cmd = %d, code=%d\n",
Inputs->command, Outputs->code));
return code;
}
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
static struct afs_buffer {
struct afs_buffer *next;
} *freeBufferList = 0;
static int afs_buffersAlloced = 0;
-static
-FreeSendBuffer(register struct afs_buffer *adata)
+static int
+FreeSendBuffer(struct afs_buffer *adata)
{
FS_LOCK;
afs_buffersAlloced--;
/* allocate space for sender */
static char *
-AllocSendBuffer()
+AllocSendBuffer(void)
{
- register struct afs_buffer *tp;
+ struct afs_buffer *tp;
FS_LOCK;
afs_buffersAlloced++;
FS_UNLOCK;
tmp = malloc(sendBufSize);
if (!tmp) {
- ViceLog(0, ("Failed malloc in AllocSendBuffer\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in AllocSendBuffer\n"));
}
return tmp;
}
return (char *)tp;
} /*AllocSendBuffer */
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
/*
* This routine returns the status info associated with the targetptr vnode
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
+ struct VCallByVol tcbv, *cbv = NULL;
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct fs_stats_xferData *xferP; /* Ptr to this op's byte size struct */
("SRXAFS_FetchData, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
ntohs(rxr_PortOf(tcon)), t_client->ViceId));
+
+ queue_NodeInit(&tcbv);
+ tcbv.call = acall;
+ cbv = &tcbv;
+
/*
* Get volume/vnode for the fetched file; caller's access rights to
* it are also returned
*/
if ((errorCode =
- GetVolumePackage(tcon, Fid, &volptr, &targetptr, DONTCHECK,
+ GetVolumePackageWithCall(tcon, cbv, Fid, &volptr, &targetptr, DONTCHECK,
&parentwhentargetnotdir, &client, READ_LOCK,
&rights, &anyrights)))
goto Bad_FetchData;
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
parentwhentargetnotdir = NULL;
}
#if FS_STATS_DETAILED
Bad_FetchData:
/* Update and store volume/vnode and parent vnodes back */
- (void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr, &client);
+ (void)PutVolumePackageWithCall(parentwhentargetnotdir, targetptr,
+ (Vnode *) 0, volptr, &client, cbv);
ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchDataEvent, errorCode,
+ osi_auditU(acall, FetchDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return (errorCode);
afs_int32 Len, struct AFSFetchStatus * OutStatus,
struct AFSCallBack * CallBack, struct AFSVolSync * Sync)
{
- return common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack,
+ return common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack,
Sync, 0);
}
int code;
afs_sfsize_t tPos, tLen;
-#ifdef AFS_64BIT_ENV
tPos = (afs_sfsize_t) Pos;
tLen = (afs_sfsize_t) Len;
-#else /* AFS_64BIT_ENV */
- if (Pos.high || Len.high)
- return EFBIG;
- tPos = Pos.low;
- tLen = Len.low;
-#endif /* AFS_64BIT_ENV */
code =
common_FetchData64(acall, Fid, tPos, tLen, OutStatus, CallBack, Sync,
AccessList->AFSOpaque_len = 0;
AccessList->AFSOpaque_val = malloc(AFSOPAQUEMAX);
if (!AccessList->AFSOpaque_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchACL\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchACL\n"));
}
/*
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchACLEvent, errorCode,
+ osi_auditU(acall, FetchACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, Fid,
+ AUD_FID, Fid,
AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
} /*SRXAFS_FetchACL */
struct AFSBulkStats * OutStats, struct AFSCBs * CallBacks,
struct AFSVolSync * Sync)
{
- register int i;
+ int i;
afs_int32 nfiles;
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
- register struct AFSFid *tfid; /* file id we're dealing with now */
+ struct AFSFid *tfid; /* file id we're dealing with now */
struct rx_connection *tcon = rx_ConnectionOf(acall);
struct host *thost;
struct client *t_client = NULL; /* tmp pointer to the client data */
OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
CallBacks->AFSCBs_val = (struct AFSCallBack *)
malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
Audit_and_Return:
ViceLog(2, ("SAFS_BulkStatus returns %d\n", errorCode));
- osi_auditU(acall, BulkFetchStatusEvent, errorCode,
+ osi_auditU(acall, BulkFetchStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FIDS, Fids, AUD_END);
return errorCode;
struct AFSBulkStats * OutStats,
struct AFSCBs * CallBacks, struct AFSVolSync * Sync)
{
- register int i;
+ int i;
afs_int32 nfiles;
Vnode *targetptr = 0; /* pointer to vnode to fetch */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
Volume *volptr = 0; /* pointer to the volume */
struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
- register struct AFSFid *tfid; /* file id we're dealing with now */
+ struct AFSFid *tfid; /* file id we're dealing with now */
struct rx_connection *tcon;
struct host *thost;
struct client *t_client = NULL; /* tmp ptr to client data */
OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
CallBacks->AFSCBs_val = (struct AFSCallBack *)
malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
- ViceLog(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
- assert(0);
+ ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
&rights, &anyrights))) {
tstatus = &OutStats->AFSBulkStats_val[i];
tstatus->errorCode = errorCode;
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
Audit_and_Return:
ViceLog(2, ("SAFS_InlineBulkStatus returns %d\n", errorCode));
- osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
+ osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FIDS, Fids, AUD_END);
return 0;
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchStatusEvent, code,
+ osi_auditU(acall, FetchStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
if (parentwhentargetnotdir != NULL) {
tparentwhentargetnotdir = *parentwhentargetnotdir;
VPutVnode(&fileCode, parentwhentargetnotdir);
- assert(!fileCode || (fileCode == VSALVAGE));
+ osi_Assert(!fileCode || (fileCode == VSALVAGE));
parentwhentargetnotdir = NULL;
}
#if FS_STATS_DETAILED
FS_UNLOCK;
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, StoreDataEvent, errorCode,
+ osi_auditU(acall, StoreDataEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return (errorCode);
afs_uint32 Length, afs_uint32 FileLength,
struct AFSFetchStatus * OutStatus, struct AFSVolSync * Sync)
{
- if (FileLength > 0x7fffffff || Pos > 0x7fffffff ||
+ if (FileLength > 0x7fffffff || Pos > 0x7fffffff ||
(0x7fffffff - Pos) < Length)
return EFBIG;
afs_fsize_t tLength;
afs_fsize_t tFileLength;
-#ifdef AFS_64BIT_ENV
tPos = (afs_fsize_t) Pos;
tLength = (afs_fsize_t) Length;
tFileLength = (afs_fsize_t) FileLength;
-#else /* AFS_64BIT_ENV */
- if (FileLength.high)
- return EFBIG;
- tPos = Pos.low;
- tLength = Length.low;
- tFileLength = FileLength.low;
-#endif /* AFS_64BIT_ENV */
code =
common_StoreData64(acall, Fid, InStatus, tPos, tLength, tFileLength,
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call backs on the directory */
BreakCallBack(client->host, Fid, 0);
Bad_StoreACL:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_StoreACL returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, StoreACLEvent, errorCode,
+ osi_auditU(acall, StoreACLEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* Break call backs on Fid */
BreakCallBack(client->host, Fid, 0);
Bad_StoreStatus:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_StoreStatus returns %d\n", errorCode));
return errorCode;
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, StoreStatusEvent, code,
+ osi_auditU(acall, StoreStatusEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
DeleteFileCallBacks(&fileFid);
/* convert the parent lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
} else {
/* convert the parent lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* convert the target lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* tell all the file has changed */
BreakCallBack(client->host, &fileFid, 1);
}
Bad_RemoveFile:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_RemoveFile returns %d\n", errorCode));
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RemoveFileEvent, code,
+ osi_auditU(acall, RemoveFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on parent dir */
BreakCallBack(client->host, DirFid, 0);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, CreateFileEvent, code,
+ osi_auditU(acall, CreateFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_FID, OutFid, AUD_END);
return code;
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon = rx_ConnectionOf(acall);
+ afs_ino_str_t stmp;
FidZero(&olddir);
FidZero(&newdir);
goto Bad_Rename;
}
+ if (CheckLength(volptr, oldvptr, -1) ||
+ CheckLength(volptr, newvptr, -1)) {
+ VTakeOffline(volptr);
+ errorCode = VSALVAGE;
+ goto Bad_Rename;
+ }
+
/* The CopyOnWrite might return ENOSPC ( disk full). Even if the second
* call to CopyOnWrite returns error, it is not necessary to revert back
- * the effects of the first call because the contents of the volume is
+ * the effects of the first call because the contents of the volume is
* not modified, it is only replicated.
*/
if (oldvptr->disk.cloned) {
}
if (testnode == 1) top = 1;
testvptr = VGetVnode(&errorCode, volptr, testnode, READ_LOCK);
- assert(errorCode == 0);
+ osi_Assert(errorCode == 0);
testnode = testvptr->disk.parent;
VPutVnode(&errorCode, testvptr);
if ((top == 1) && (testnode != 0)) {
errorCode = EIO;
goto Bad_Rename;
}
- assert(errorCode == 0);
+ osi_Assert(errorCode == 0);
}
}
if (newfileptr) {
/* Delete NewName from its directory */
code = Delete(&newdir, NewName);
- assert(code == 0);
+ osi_Assert(code == 0);
/* Drop the link count */
newfileptr->disk.linkCount--;
if (errorCode == -1) {
ViceLog(0,
("Del: inode=%s, name=%s, errno=%d\n",
- PrintInode(NULL, VN_GET_INO(newfileptr)),
+ PrintInode(stmp, VN_GET_INO(newfileptr)),
NewName, errno));
if ((errno != ENOENT) && (errno != EIO)
&& (errno != ENXIO))
goto Bad_Rename;
/* Delete the old name */
- assert(Delete(&olddir, (char *)OldName) == 0);
+ osi_Assert(Delete(&olddir, (char *)OldName) == 0);
/* if the directory length changes, reflect it in the statistics */
#if FS_STATS_DETAILED
/* if we are dealing with a rename of a directory, and we need to
* update the .. entry of that directory */
if (updatefile) {
- assert(!fileptr->disk.cloned);
+ osi_Assert(!fileptr->disk.cloned);
fileptr->changed_newTime = 1; /* status change of moved file */
/* fix .. to point to the correct place */
Delete(&filedir, ".."); /* No assert--some directories may be bad */
- assert(Create(&filedir, "..", NewDirFid) == 0);
+ osi_Assert(Create(&filedir, "..", NewDirFid) == 0);
fileptr->disk.dataVersion++;
/* if the parent directories are different the link counts have to be */
/* convert the write locks to a read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, newvptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
if (oldvptr != newvptr) {
VVnodeWriteToRead(&errorCode, oldvptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
}
if (newfileptr && !doDelete) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, newfileptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
}
/* break call back on NewDirFid, OldDirFid, NewDirFid and newFileFid */
Bad_Rename:
if (newfileptr) {
VPutVnode(&fileCode, newfileptr);
- assert(fileCode == 0);
+ osi_Assert(fileCode == 0);
}
- (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
+ (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
newvptr : 0), oldvptr, volptr, &client);
FidZap(&olddir);
FidZap(&newdir);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RenameFileEvent, code,
+ osi_auditU(acall, RenameFileEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
- AUD_FID, OldDirFid, AUD_STR, OldName,
+ AUD_FID, OldDirFid, AUD_STR, OldName,
AUD_FID, NewDirFid, AUD_STR, NewName, AUD_END);
return code;
ViceLog(0, ("Volume %u now offline, must be salvaged.\n",
volptr->hashid));
return EIO;
- }
+ }
len = strlen((char *) LinkContents);
- code = (len == FDH_WRITE(fdP, (char *) LinkContents, len)) ? 0 : VDISKFULL;
- if (code)
- ViceLog(0, ("SAFSS_Symlink FDH_WRITE failed for len=%d, Fid=%u.%d.%d\n", (int)len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
+ code = (len == FDH_PWRITE(fdP, (char *) LinkContents, len, 0)) ? 0 : VDISKFULL;
+ if (code)
+ ViceLog(0, ("SAFSS_Symlink FDH_PWRITE failed for len=%d, Fid=%u.%d.%d\n", (int)len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
FDH_CLOSE(fdP);
/*
* Set up and return modified status for the parent dir and new symlink
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on the parent dir */
BreakCallBack(client->host, DirFid, 0);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SymlinkEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
+ osi_auditU(acall, SymlinkEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_STR, LinkContents, AUD_END);
return code;
goto Bad_Link;
}
+ if (CheckLength(volptr, parentptr, -1)) {
+ VTakeOffline(volptr);
+ errorCode = VSALVAGE;
+ goto Bad_Link;
+ }
+
/* get the file vnode */
if ((errorCode =
CheckVnode(ExistingFid, &volptr, &targetptr, WRITE_LOCK))) {
/* convert the write locks to read locks before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
/*
- * We also need to break the callback for the file that is hard-linked since part
+ * We also need to break the callback for the file that is hard-linked since part
* of its status (like linkcount) is changed
*/
BreakCallBack(client->host, ExistingFid, 0);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, LinkEvent, code,
+ osi_auditU(acall, LinkEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, ExistingFid, AUD_END);
* requires w access for the user to create a directory. this
* closes a loophole in the current security arrangement, since a
* user with i access only can create a directory and get the
- * implcit a access that goes with dir ownership, and proceed to
+ * implcit a access that goes with dir ownership, and proceed to
* subvert quota in the volume.
*/
if ((errorCode = CheckWriteMode(parentptr, rights, PRSFS_INSERT))
#endif /* FS_STATS_DETAILED */
/* Point to target's ACL buffer and copy the parent's ACL contents to it */
- assert((SetAccessList
+ osi_Assert((SetAccessList
(&targetptr, &volptr, &newACL, &newACLSize,
&parentwhentargetnotdir, (AFSFid *) 0, 0)) == 0);
- assert(parentwhentargetnotdir == 0);
+ osi_Assert(parentwhentargetnotdir == 0);
memcpy((char *)newACL, (char *)VVnodeACL(parentptr), VAclSize(parentptr));
/* update the status for the target vnode */
/* Actually create the New directory in the directory package */
SetDirHandle(&dir, targetptr);
- assert(!(MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
+ osi_Assert(!(MakeDir(&dir, (afs_int32 *)OutFid, (afs_int32 *)DirFid)));
DFlush();
VN_SET_LEN(targetptr, (afs_fsize_t) Length(&dir));
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid */
BreakCallBack(client->host, DirFid, 0);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, MakeDirEvent, code,
+ osi_auditU(acall, MakeDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, OutFid, AUD_END);
Volume *volptr = 0; /* pointer to the volume header */
struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
- Vnode debugvnode1, debugvnode2;
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon = rx_ConnectionOf(acall);
&rights, &anyrights))) {
goto Bad_RemoveDir;
}
- debugvnode1 = *parentptr;
/* set volume synchronization information */
SetVolumeSync(Sync, volptr);
goto Bad_RemoveDir;
}
- debugvnode2 = *parentptr;
/* Do the actual delete of the desired (empty) directory, Name */
if ((errorCode =
DeleteTarget(parentptr, volptr, &targetptr, &dir, &fileFid, Name,
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, parentptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
/* break call back on DirFid and fileFid */
BreakCallBack(client->host, DirFid, 0);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RemoveDirEvent, code,
+ osi_auditU(acall, RemoveDirEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SetLockEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
+ osi_auditU(acall, SetLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_LONG, type, AUD_END);
return code;
} /*SRXAFS_SetLock */
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, ExtendLockEvent, code,
+ osi_auditU(acall, ExtendLockEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
if (targetptr->disk.lock.lockCount <= 0) {
/* convert the write lock to a read lock before breaking callbacks */
VVnodeWriteToRead(&errorCode, targetptr);
- assert(!errorCode || errorCode == VSALVAGE);
+ osi_Assert(!errorCode || errorCode == VSALVAGE);
BreakCallBack(client->host, Fid, 0);
}
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, ReleaseLockEvent, code,
- AUD_ID, t_client ? t_client->ViceId : 0,
+ osi_auditU(acall, ReleaseLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
AUD_FID, Fid, AUD_END);
return code;
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, GetStatisticsEvent, code,
+ osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
goto Bad_GetStatistics64;
ViceLog(1, ("SAFS_GetStatistics64 Received\n"));
- Statistics->ViceStatistics64_val =
+ Statistics->ViceStatistics64_val =
malloc(statsVersion*sizeof(afs_int64));
Statistics->ViceStatistics64_len = statsVersion;
FS_LOCK;
Statistics->ViceStatistics64_val[STATS64_STARTTIME] = StartTime;
Statistics->ViceStatistics64_val[STATS64_CURRENTCONNECTIONS] =
CurrentConnections;
- Statistics->ViceStatistics64_val[STATS64_TOTALVICECALLS] =
+ Statistics->ViceStatistics64_val[STATS64_TOTALVICECALLS] =
AFSCallStats.TotalCalls;
Statistics->ViceStatistics64_val[STATS64_TOTALFETCHES] =
AFSCallStats.FetchData + AFSCallStats.FetchACL +
AFSCallStats.FetchStatus;
- Statistics->ViceStatistics64_val[STATS64_FETCHDATAS] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHDATAS] =
AFSCallStats.FetchData;
- Statistics->ViceStatistics64_val[STATS64_FETCHEDBYTES] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHEDBYTES] =
AFSCallStats.TotalFetchedBytes;
seconds = AFSCallStats.AccumFetchTime / 1000;
if (seconds <= 0)
seconds = 1;
- Statistics->ViceStatistics64_val[STATS64_FETCHDATARATE] =
+ Statistics->ViceStatistics64_val[STATS64_FETCHDATARATE] =
AFSCallStats.TotalFetchedBytes / seconds;
Statistics->ViceStatistics64_val[STATS64_TOTALSTORES] =
AFSCallStats.StoreData + AFSCallStats.StoreACL +
AFSCallStats.StoreStatus;
- Statistics->ViceStatistics64_val[STATS64_STOREDATAS] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDATAS] =
AFSCallStats.StoreData;
- Statistics->ViceStatistics64_val[STATS64_STOREDBYTES] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDBYTES] =
AFSCallStats.TotalStoredBytes;
seconds = AFSCallStats.AccumStoreTime / 1000;
if (seconds <= 0)
seconds = 1;
- Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
+ Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] =
AFSCallStats.TotalStoredBytes / seconds;
#ifdef AFS_NT40_ENV
Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = -1;
#else
- Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
+ Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] =
(afs_int32) ((long)sbrk(0) >> 10);
#endif
FS_UNLOCK;
- h_GetWorkStats((int *)&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
- (int *)&(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
- (int *)0,
- (afs_int32) (FT_ApproxTime()) - (15 * 60));
+ h_GetWorkStats64(&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
+ &(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]),
+ 0,
+ (afs_int32) (FT_ApproxTime()) - (15 * 60));
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, GetStatisticsEvent, code,
+ osi_auditU(acall, GetStatisticsEvent, code,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return code;
} /*SRXAFS_GetStatistics */
FS_UNLOCK;
#endif /* FS_STATS_DETAILED */
- osi_auditU(a_call, XStatsVersionEvent, 0,
+ osi_auditU(a_call, XStatsVersionEvent, 0,
AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return (0);
} /*SRXAFS_XStatsVersion */
int dir_Buffers; /*# buffers in use by dir package */
int dir_Calls; /*# read calls in dir package */
int dir_IOs; /*# I/O ops in dir package */
+ struct rx_statistics *stats;
/*
* Vnode cache section.
/*
* Rx section.
*/
- a_perfP->rx_packetRequests = (afs_int32) rx_stats.packetRequests;
+ stats = rx_GetStatistics();
+
+ a_perfP->rx_packetRequests = (afs_int32) stats->packetRequests;
a_perfP->rx_noPackets_RcvClass =
- (afs_int32) rx_stats.receivePktAllocFailures;
+ (afs_int32) stats->receivePktAllocFailures;
a_perfP->rx_noPackets_SendClass =
- (afs_int32) rx_stats.sendPktAllocFailures;
+ (afs_int32) stats->sendPktAllocFailures;
a_perfP->rx_noPackets_SpecialClass =
- (afs_int32) rx_stats.specialPktAllocFailures;
- a_perfP->rx_socketGreedy = (afs_int32) rx_stats.socketGreedy;
- a_perfP->rx_bogusPacketOnRead = (afs_int32) rx_stats.bogusPacketOnRead;
- a_perfP->rx_bogusHost = (afs_int32) rx_stats.bogusHost;
- a_perfP->rx_noPacketOnRead = (afs_int32) rx_stats.noPacketOnRead;
+ (afs_int32) stats->specialPktAllocFailures;
+ a_perfP->rx_socketGreedy = (afs_int32) stats->socketGreedy;
+ a_perfP->rx_bogusPacketOnRead = (afs_int32) stats->bogusPacketOnRead;
+ a_perfP->rx_bogusHost = (afs_int32) stats->bogusHost;
+ a_perfP->rx_noPacketOnRead = (afs_int32) stats->noPacketOnRead;
a_perfP->rx_noPacketBuffersOnRead =
- (afs_int32) rx_stats.noPacketBuffersOnRead;
- a_perfP->rx_selects = (afs_int32) rx_stats.selects;
- a_perfP->rx_sendSelects = (afs_int32) rx_stats.sendSelects;
+ (afs_int32) stats->noPacketBuffersOnRead;
+ a_perfP->rx_selects = (afs_int32) stats->selects;
+ a_perfP->rx_sendSelects = (afs_int32) stats->sendSelects;
a_perfP->rx_packetsRead_RcvClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_RECEIVE];
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_RECEIVE];
a_perfP->rx_packetsRead_SendClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_SEND];
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_SEND];
a_perfP->rx_packetsRead_SpecialClass =
- (afs_int32) rx_stats.packetsRead[RX_PACKET_CLASS_SPECIAL];
- a_perfP->rx_dataPacketsRead = (afs_int32) rx_stats.dataPacketsRead;
- a_perfP->rx_ackPacketsRead = (afs_int32) rx_stats.ackPacketsRead;
- a_perfP->rx_dupPacketsRead = (afs_int32) rx_stats.dupPacketsRead;
+ (afs_int32) stats->packetsRead[RX_PACKET_CLASS_SPECIAL];
+ a_perfP->rx_dataPacketsRead = (afs_int32) stats->dataPacketsRead;
+ a_perfP->rx_ackPacketsRead = (afs_int32) stats->ackPacketsRead;
+ a_perfP->rx_dupPacketsRead = (afs_int32) stats->dupPacketsRead;
a_perfP->rx_spuriousPacketsRead =
- (afs_int32) rx_stats.spuriousPacketsRead;
+ (afs_int32) stats->spuriousPacketsRead;
a_perfP->rx_packetsSent_RcvClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_RECEIVE];
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_RECEIVE];
a_perfP->rx_packetsSent_SendClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_SEND];
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_SEND];
a_perfP->rx_packetsSent_SpecialClass =
- (afs_int32) rx_stats.packetsSent[RX_PACKET_CLASS_SPECIAL];
- a_perfP->rx_ackPacketsSent = (afs_int32) rx_stats.ackPacketsSent;
- a_perfP->rx_pingPacketsSent = (afs_int32) rx_stats.pingPacketsSent;
- a_perfP->rx_abortPacketsSent = (afs_int32) rx_stats.abortPacketsSent;
- a_perfP->rx_busyPacketsSent = (afs_int32) rx_stats.busyPacketsSent;
- a_perfP->rx_dataPacketsSent = (afs_int32) rx_stats.dataPacketsSent;
- a_perfP->rx_dataPacketsReSent = (afs_int32) rx_stats.dataPacketsReSent;
- a_perfP->rx_dataPacketsPushed = (afs_int32) rx_stats.dataPacketsPushed;
- a_perfP->rx_ignoreAckedPacket = (afs_int32) rx_stats.ignoreAckedPacket;
- a_perfP->rx_totalRtt_Sec = (afs_int32) rx_stats.totalRtt.sec;
- a_perfP->rx_totalRtt_Usec = (afs_int32) rx_stats.totalRtt.usec;
- a_perfP->rx_minRtt_Sec = (afs_int32) rx_stats.minRtt.sec;
- a_perfP->rx_minRtt_Usec = (afs_int32) rx_stats.minRtt.usec;
- a_perfP->rx_maxRtt_Sec = (afs_int32) rx_stats.maxRtt.sec;
- a_perfP->rx_maxRtt_Usec = (afs_int32) rx_stats.maxRtt.usec;
- a_perfP->rx_nRttSamples = (afs_int32) rx_stats.nRttSamples;
- a_perfP->rx_nServerConns = (afs_int32) rx_stats.nServerConns;
- a_perfP->rx_nClientConns = (afs_int32) rx_stats.nClientConns;
- a_perfP->rx_nPeerStructs = (afs_int32) rx_stats.nPeerStructs;
- a_perfP->rx_nCallStructs = (afs_int32) rx_stats.nCallStructs;
- a_perfP->rx_nFreeCallStructs = (afs_int32) rx_stats.nFreeCallStructs;
+ (afs_int32) stats->packetsSent[RX_PACKET_CLASS_SPECIAL];
+ a_perfP->rx_ackPacketsSent = (afs_int32) stats->ackPacketsSent;
+ a_perfP->rx_pingPacketsSent = (afs_int32) stats->pingPacketsSent;
+ a_perfP->rx_abortPacketsSent = (afs_int32) stats->abortPacketsSent;
+ a_perfP->rx_busyPacketsSent = (afs_int32) stats->busyPacketsSent;
+ a_perfP->rx_dataPacketsSent = (afs_int32) stats->dataPacketsSent;
+ a_perfP->rx_dataPacketsReSent = (afs_int32) stats->dataPacketsReSent;
+ a_perfP->rx_dataPacketsPushed = (afs_int32) stats->dataPacketsPushed;
+ a_perfP->rx_ignoreAckedPacket = (afs_int32) stats->ignoreAckedPacket;
+ a_perfP->rx_totalRtt_Sec = (afs_int32) stats->totalRtt.sec;
+ a_perfP->rx_totalRtt_Usec = (afs_int32) stats->totalRtt.usec;
+ a_perfP->rx_minRtt_Sec = (afs_int32) stats->minRtt.sec;
+ a_perfP->rx_minRtt_Usec = (afs_int32) stats->minRtt.usec;
+ a_perfP->rx_maxRtt_Sec = (afs_int32) stats->maxRtt.sec;
+ a_perfP->rx_maxRtt_Usec = (afs_int32) stats->maxRtt.usec;
+ a_perfP->rx_nRttSamples = (afs_int32) stats->nRttSamples;
+ a_perfP->rx_nServerConns = (afs_int32) stats->nServerConns;
+ a_perfP->rx_nClientConns = (afs_int32) stats->nClientConns;
+ a_perfP->rx_nPeerStructs = (afs_int32) stats->nPeerStructs;
+ a_perfP->rx_nCallStructs = (afs_int32) stats->nCallStructs;
+ a_perfP->rx_nFreeCallStructs = (afs_int32) stats->nFreeCallStructs;
a_perfP->host_NumHostEntries = HTs;
a_perfP->host_HostBlocks = HTBlocks;
a_perfP->host_ClientBlocks = CEBlocks;
a_perfP->sysname_ID = afs_perfstats.sysname_ID;
- a_perfP->rx_nBusies = (afs_int32) rx_stats.nBusies;
+ a_perfP->rx_nBusies = (afs_int32) stats->nBusies;
a_perfP->fs_nBusies = afs_perfstats.fs_nBusies;
+ rx_FreeStatistics(&stats);
} /*FillPerfValues */
afs_int32 * a_timeP, AFS_CollData * a_dataP)
{ /*SRXAFS_GetXStats */
- register int code; /*Return value */
+ int code; /*Return value */
afs_int32 *dataBuffP; /*Ptr to data to be returned */
afs_int32 dataBytes; /*Bytes in data buffer */
#if FS_STATS_DETAILED
struct AFSCBs *CallBackArray)
{
afs_int32 errorCode = 0;
- register int i;
+ int i;
struct client *client = 0;
struct rx_connection *tcon;
struct host *thost;
errorCode = GetClient(tcon, &client);
if (!errorCode) {
for (i = 0; i < FidArray->AFSCBFids_len; i++) {
- register struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
+ struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
DeleteCallBack(client->host, fid);
}
PutClient(&client);
/*
- * Dummy routine. Should never be called (the cache manager should only
+ * Dummy routine. Should never be called (the cache manager should only
* invoke this interface when communicating with a AFS/DFS Protocol
* Translator).
*/
dataBytes = 1 * sizeof(afs_int32);
dataBuffP = (afs_uint32 *) malloc(dataBytes);
dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
-#if defined(AFS_64BIT_ENV)
dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
-#endif
if (saneacls)
dataBuffP[0] |= VICED_CAPABILITY_SANEACLS;
/* worthless hack to let CS keep running ancient software */
static int
-afs_vtoi(register char *aname)
+afs_vtoi(char *aname)
{
- register afs_int32 temp;
- register int tc;
+ afs_int32 temp;
+ int tc;
temp = 0;
while ((tc = *aname++)) {
* or backup volumes by name or #
*/
static afs_int32
-CopyVolumeEntry(char *aname, register struct vldbentry *ave,
- register struct VolumeInfo *av)
+CopyVolumeEntry(char *aname, struct vldbentry *ave,
+ struct VolumeInfo *av)
{
- register int i, j, vol;
+ int i, j, vol;
afs_int32 mask, whichType;
afs_uint32 *serverHost, *typePtr;
static afs_int32 lastDownTime = 0;
struct vldbentry tve;
struct rx_securityClass *vlSec;
- register afs_int32 code;
+ afs_int32 code;
if (!vlConn) {
vlSec = rxnull_NewClientSecurityObject();
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, GetVolumeStatusEvent, errorCode,
+ osi_auditU(acall, GetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_LONG, avolid, AUD_STR, *Name, AUD_END);
return (errorCode);
RXUpdate_VolumeStatus(volptr, StoreVolStatus, Name, OfflineMsg, Motd);
Bad_SetVolumeStatus:
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
volptr, &client);
ViceLog(2, ("SAFS_SetVolumeStatus returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode, thost);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SetVolumeStatusEvent, errorCode,
+ osi_auditU(acall, SetVolumeStatusEvent, errorCode,
AUD_ID, t_client ? t_client->ViceId : 0,
AUD_LONG, avolid, AUD_STR, Name, AUD_END);
return (errorCode);
afs_int32
FetchData_RXStyle(Volume * volptr, Vnode * targetptr,
- register struct rx_call * Call, afs_sfsize_t Pos,
+ struct rx_call * Call, afs_sfsize_t Pos,
afs_sfsize_t Len, afs_int32 Int64Mode,
#if FS_STATS_DETAILED
afs_sfsize_t * a_bytesToFetchP,
struct timeval StartTime, StopTime; /* used to calculate file transfer rates */
IHandle_t *ihP;
FdHandle_t *fdP;
-#ifdef AFS_NT40_ENV
- register char *tbuffer;
-#else /* AFS_NT40_ENV */
+#ifndef HAVE_PIOV
+ char *tbuffer;
+#else /* HAVE_PIOV */
struct iovec tiov[RX_MAXIOVECS];
int tnio;
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
afs_sfsize_t tlen;
afs_int32 optSize;
volptr->hashid));
return EIO;
}
+ if (CheckLength(volptr, targetptr, tlen)) {
+ FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
if (Pos > tlen) {
Len = 0;
}
if (Pos + Len > tlen) /* get length we should send */
Len = ((tlen - Pos) < 0) ? 0 : tlen - Pos;
- (void)FDH_SEEK(fdP, Pos, 0);
{
afs_int32 high, low;
SplitOffsetOrSize(Len, high, low);
- assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
+ osi_Assert(Int64Mode || (Len >= 0 && high == 0) || Len < 0);
if (Int64Mode) {
high = htonl(high);
rx_Write(Call, (char *)&high, sizeof(afs_int32)); /* High order bits */
#if FS_STATS_DETAILED
(*a_bytesToFetchP) = Len;
#endif /* FS_STATS_DETAILED */
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
tbuffer = AllocSendBuffer();
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
while (Len > 0) {
size_t wlen;
ssize_t nBytes;
wlen = optSize;
else
wlen = Len;
-#ifdef AFS_NT40_ENV
- nBytes = FDH_READ(fdP, tbuffer, wlen);
+#ifndef HAVE_PIOV
+ nBytes = FDH_PREAD(fdP, tbuffer, wlen, Pos);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
return EIO;
}
nBytes = rx_Write(Call, tbuffer, wlen);
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
nBytes = rx_WritevAlloc(Call, tiov, &tnio, RX_MAXIOVECS, wlen);
if (nBytes <= 0) {
FDH_CLOSE(fdP);
return EIO;
}
wlen = nBytes;
- nBytes = FDH_READV(fdP, tiov, tnio);
+ nBytes = FDH_PREADV(fdP, tiov, tnio, Pos);
if (nBytes != wlen) {
FDH_CLOSE(fdP);
VTakeOffline(volptr);
return EIO;
}
nBytes = rx_Writev(Call, tiov, tnio, wlen);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
+ Pos += wlen;
#if FS_STATS_DETAILED
/*
* Bump the number of bytes actually sent by the number from this
(*a_bytesFetchedP) += nBytes;
#endif /* FS_STATS_DETAILED */
if (nBytes != wlen) {
+ afs_int32 err;
FDH_CLOSE(fdP);
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
+ err = VIsGoingOffline(volptr);
+ if (err) {
+ return err;
+ }
return -31;
}
Len -= wlen;
}
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
FDH_CLOSE(fdP);
FT_GetTimeOfDay(&StopTime, 0);
lhp = IH_OPEN(V_linkHandle(vp));
if (!lhp)
return EIO;
-#ifdef AFS_NT40_ENV
- *lc = nt_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0);
-#else
- *lc = namei_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0);
-#endif
+ *lc = namei_GetLinkCount(lhp, fdP->fd_ih->ih_ino, 0, 0, 1);
FDH_CLOSE(lhp);
if (*lc < 0)
return -1;
*/
afs_int32
StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
- struct client * client, register struct rx_call * Call,
+ struct client * client, struct rx_call * Call,
afs_fsize_t Pos, afs_fsize_t Length, afs_fsize_t FileLength,
int sync,
#if FS_STATS_DETAILED
afs_sfsize_t bytesTransfered; /* number of bytes actually transfered */
struct timeval StartTime, StopTime; /* Used to measure how long the store takes */
Error errorCode = 0; /* Returned error code to caller */
-#ifdef AFS_NT40_ENV
- register char *tbuffer; /* data copying buffer */
-#else /* AFS_NT40_ENV */
+#ifndef HAVE_PIOV
+ char *tbuffer; /* data copying buffer */
+#else /* HAVE_PIOV */
struct iovec tiov[RX_MAXIOVECS]; /* no data copying with iovec */
int tnio; /* temp for iovec size */
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
afs_sfsize_t tlen; /* temp for xfr length */
Inode tinode; /* inode for I/O */
afs_int32 optSize; /* optimal transfer size */
ssize_t nBytes;
FdHandle_t *fdP, *origfdP = NULL;
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
+ afs_ino_str_t stmp;
#if FS_STATS_DETAILED
/*
*/
ViceLog(25,
("StoreData_RXStyle : Opening inode %s\n",
- PrintInode(NULL, VN_GET_INO(targetptr))));
+ PrintInode(stmp, VN_GET_INO(targetptr))));
fdP = IH_OPEN(targetptr->handle);
if (fdP == NULL)
return ENOENT;
volptr->hashid));
return EIO;
}
+ if (CheckLength(volptr, targetptr, DataLength)) {
+ FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
+ return VSALVAGE;
+ }
if (linkCount != 1) {
afs_fsize_t size;
ViceLog(25,
("StoreData_RXStyle : inode %s has more than onelink\n",
- PrintInode(NULL, VN_GET_INO(targetptr))));
+ PrintInode(stmp, VN_GET_INO(targetptr))));
/* other volumes share this data, better copy it first */
/* Adjust the disk block count by the creation of the new inode.
if (fdP == NULL) {
ViceLog(25,
("StoreData : Reopen after CopyOnWrite failed\n"));
- FDH_CLOSE(origfdP);
+ FDH_REALLYCLOSE(origfdP);
return ENOENT;
}
}
AdjustDiskUsage(volptr, adjustSize,
adjustSize - SpareComp(volptr)))) {
FDH_CLOSE(fdP);
- if (origfdP) FDH_CLOSE(origfdP);
+ if (origfdP) FDH_REALLYCLOSE(origfdP);
return (errorCode);
}
/* truncate the file iff it needs it (ftruncate is slow even when its a noop) */
if (FileLength < DataLength)
FDH_TRUNC(fdP, FileLength);
- if (Pos > 0)
- FDH_SEEK(fdP, Pos, 0);
bytesTransfered = 0;
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
tbuffer = AllocSendBuffer();
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
/* if length == 0, the loop below isn't going to do anything, including
* extend the length of the inode, which it must do, since the file system
* assumes that the inode length == vnode's file length. So, we extend
/* Set the file's length; we've already done an lseek to the right
* spot above.
*/
- nBytes = FDH_WRITE(fdP, &tlen, 1);
+ nBytes = FDH_PWRITE(fdP, &tlen, 1, Pos);
if (nBytes != 1) {
errorCode = -1;
goto done;
rlen = optSize; /* bound by buffer size */
else
rlen = (int)tlen;
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
errorCode = rx_Read(Call, tbuffer, rlen);
-#else /* AFS_NT40_ENV */
+#else /* HAVE_PIOV */
errorCode = rx_Readv(Call, tiov, &tnio, RX_MAXIOVECS, rlen);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
if (errorCode <= 0) {
errorCode = -32;
break;
(*a_bytesStoredP) += errorCode;
#endif /* FS_STATS_DETAILED */
rlen = errorCode;
-#ifdef AFS_NT40_ENV
- nBytes = FDH_WRITE(fdP, tbuffer, rlen);
-#else /* AFS_NT40_ENV */
- nBytes = FDH_WRITEV(fdP, tiov, tnio);
-#endif /* AFS_NT40_ENV */
+#ifndef HAVE_PIOV
+ nBytes = FDH_PWRITE(fdP, tbuffer, rlen, Pos);
+#else /* HAVE_PIOV */
+ nBytes = FDH_PWRITEV(fdP, tiov, tnio, Pos);
+#endif /* HAVE_PIOV */
if (nBytes != rlen) {
errorCode = VDISKFULL;
break;
}
bytesTransfered += rlen;
+ Pos += rlen;
}
}
done:
-#ifdef AFS_NT40_ENV
+#ifndef HAVE_PIOV
FreeSendBuffer((struct afs_buffer *)tbuffer);
-#endif /* AFS_NT40_ENV */
+#endif /* HAVE_PIOV */
if (sync) {
FDH_SYNC(fdP);
}
if (errorCode) {
- afs_fsize_t nfSize = (afs_fsize_t) FDH_SIZE(fdP);
+ afs_sfsize_t nfSize = FDH_SIZE(fdP);
+ osi_Assert(nfSize >= 0);
/* something went wrong: adjust size and return */
VN_SET_LEN(targetptr, nfSize); /* set new file size. */
/* changed_newTime is tested in StoreData to detemine if we
targetptr->changed_newTime = 1;
if (origfdP && (bytesTransfered < Length)) /* Need to "finish" CopyOnWrite still */
CopyOnWrite2(origfdP, fdP, Pos + bytesTransfered, NewLength - Pos - bytesTransfered);
- if (origfdP) FDH_CLOSE(origfdP);
+ if (origfdP) FDH_REALLYCLOSE(origfdP);
FDH_CLOSE(fdP);
/* set disk usage to be correct */
VAdjustDiskUsage(&errorCode, volptr,
afs_printable_VnodeId_u(targetptr->vnodeNumber),
V_name(volptr), CoW_off, CoW_len, errorCode));
}
- FDH_CLOSE(origfdP);
+ FDH_REALLYCLOSE(origfdP);
}
FDH_CLOSE(fdP);
sys2et[EIO] = UAEIO;
}
-/* NOTE: 2006-03-01
- * SRXAFS_CallBackRxConnAddr should be re-written as follows:
- * - pass back the connection, client, and host from CallPreamble
- * - keep a ref on the client, which we don't now
- * - keep a hold on the host, which we already do
- * - pass the connection, client, and host down into SAFSS_*, and use
- * them instead of independently discovering them via rx_ConnectionOf
- * (safe) and rx_GetSpecific (not so safe)
+/* NOTE: 2006-03-01
+ * SRXAFS_CallBackRxConnAddr should be re-written as follows:
+ * - pass back the connection, client, and host from CallPreamble
+ * - keep a ref on the client, which we don't now
+ * - keep a hold on the host, which we already do
+ * - pass the connection, client, and host down into SAFSS_*, and use
+ * them instead of independently discovering them via rx_ConnectionOf
+ * (safe) and rx_GetSpecific (not so safe)
* The idea being that we decide what client and host we're going to use
* when CallPreamble is called, and stay consistent throughout the call.
- * This change is too invasive for 1.4.1 but should be made in 1.5.x.
- */
+ * This change is too invasive for 1.4.1 but should be made in 1.5.x.
+ */
afs_int32
SRXAFS_CallBackRxConnAddr (struct rx_call * acall, afs_int32 *addr)
int i,j;
struct rx_connection *conn;
#endif
-
+
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &tcallhost)))
goto Bad_CallBackRxConnAddr1;
-
+
#ifndef __EXPERIMENTAL_CALLBACK_CONN_MOVING
errorCode = 1;
#else
goto Bad_CallBackRxConnAddr;
}
thost = tclient->host;
-
+
/* nothing more can be done */
- if ( !thost->interface )
+ if ( !thost->interface )
goto Bad_CallBackRxConnAddr;
-
+
/* the only address is the primary interface */
/* can't change when there's only 1 address, anyway */
- if ( thost->interface->numberOfInterfaces <= 1 )
+ if ( thost->interface->numberOfInterfaces <= 1 )
goto Bad_CallBackRxConnAddr;
-
+
/* initialise a security object only once */
if ( !sc )
sc = (struct rx_securityClass *) rxnull_NewClientSecurityObject();
-
+
for ( i=0; i < thost->interface->numberOfInterfaces; i++)
{
if ( *addr == thost->interface->addr[i] ) {
break;
}
}
-
- if ( *addr != thost->interface->addr[i] )
+
+ if ( *addr != thost->interface->addr[i] )
goto Bad_CallBackRxConnAddr;
conn = rx_NewConnection (thost->interface->addr[i],
thost->port, 1, sc, 0);
- rx_SetConnDeadTime(conn, 2);
- rx_SetConnHardDeadTime(conn, AFS_HARDDEADTIME);
+ rx_SetConnDeadTime(conn, 2);
+ rx_SetConnHardDeadTime(conn, AFS_HARDDEADTIME);
H_UNLOCK;
errorCode = RXAFSCB_Probe(conn);
H_LOCK;
return errorCode;
} else {
rx_DestroyConnection(conn);
- }
+ }
Bad_CallBackRxConnAddr:
h_ReleaseClient_r(tclient);
/* The hold on thost will be released by CallPostamble */