#else
#include <sys/param.h>
#include <sys/file.h>
-#include <netinet/in.h>
-#include <netdb.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
#ifdef HAVE_STRING_H
#include <string.h>
struct client *tclient;
int retry_flag = 1;
int code = 0;
- char hoststr[16];
+ char hoststr[16], hoststr2[16];
if (!tconn) {
ViceLog(0, ("CallPreamble: unexpected null tconn!\n"));
return -1;
thost = tclient->host;
tclient->LastCall = thost->LastCall = FT_ApproxTime();
- if (activecall) /* For all but "GetTime" calls */
+ if (activecall) /* For all but "GetTime", "GetStats", and "GetCaps" calls */
thost->ActiveCall = thost->LastCall;
h_Lock_r(thost);
if (thost->hostFlags & HOSTDELETED) {
ViceLog(3,
- ("Discarded a packet for deleted host %s\n",
- afs_inet_ntoa_r(thost->host, hoststr)));
+ ("Discarded a packet for deleted host %s:%d\n",
+ afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port)));
code = VBUSY; /* raced, so retry */
} else if ((thost->hostFlags & VENUSDOWN)
|| (thost->hostFlags & HFE_LATER)) {
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
- ("BreakDelayedCallbacks FAILED for host %s which IS UP. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr)));
+ ("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),
+ ntohs(rxr_PortOf(*tconn))));
if (MultiProbeAlternateAddress_r(thost)) {
ViceLog(0,
("MultiProbe failed to find new address for host %s:%d\n",
ntohs(thost->port)));
if (BreakDelayedCallBacks_r(thost)) {
ViceLog(0,
- ("BreakDelayedCallbacks FAILED AGAIN for host %s which IS UP. Possible network or routing failure.\n",
- afs_inet_ntoa_r(thost->host, hoststr)));
+ ("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),
+ ntohs(rxr_PortOf(*tconn))));
code = -1;
}
}
/* I'm not really worried about when we restarted, I'm */
/* just worried about when the first VBUSY was returned. */
TM_GetTimeOfDay(&restartedat, 0);
+ if (busyonrst) {
+ FS_LOCK;
+ afs_perfstats.fs_nBusies++;
+ FS_UNLOCK;
+ }
return (busyonrst ? VBUSY : VRESTARTING);
} else {
struct timeval now;
TM_GetTimeOfDay(&now, 0);
if ((now.tv_sec - restartedat.tv_sec) < (11 * 60)) {
+ if (busyonrst) {
+ FS_LOCK;
+ afs_perfstats.fs_nBusies++;
+ FS_UNLOCK;
+ }
return (busyonrst ? VBUSY : VRESTARTING);
} else {
return (VRESTARTING);
} /*SetAccessList */
+/* Must not be called with H_LOCK held */
+static void
+client_CheckRights(struct client *client, struct acl_accessList *ACL,
+ afs_int32 *rights)
+{
+ *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);
+ ReleaseReadLock(&client->lock);
+}
+
+/* Must not be called with H_LOCK held */
+static afs_int32
+client_HasAsMember(struct client *client, afs_int32 id)
+{
+ afs_int32 code = 0;
+
+ ObtainReadLock(&client->lock);
+ if (client->CPS.prlist_len > 0 && !client->deleted &&
+ client->host && !(client->host->hostFlags & HOSTDELETED))
+ ReleaseReadLock(&client->lock);
+ return code;
+}
+
/*
* Compare the directory's ACL with the user's access rights in the client
* connection and return the user's and everybody else's access permissions
#endif
if (acl_CheckRights(ACL, &SystemAnyUserCPS, anyrights) != 0) {
-
ViceLog(0, ("CheckRights failed\n"));
*anyrights = 0;
}
*rights = 0;
- acl_CheckRights(ACL, &client->CPS, rights);
+
+ client_CheckRights(client, ACL, rights);
/* wait if somebody else is already doing the getCPS call */
H_LOCK;
acl_CheckRights(ACL, &client->host->hcps, &hrights);
H_UNLOCK;
/* Allow system:admin the rights given with the -implicit option */
- if (acl_IsAMember(SystemId, &client->CPS))
+ if (client_HasAsMember(client, SystemId))
*rights |= implicitAdminRights;
+
*rights |= hrights;
*anyrights |= hrights;
static afs_int32
VanillaUser(struct client *client)
{
- if (acl_IsAMember(SystemId, &client->CPS))
+ if (client_HasAsMember(client, SystemId))
return (0); /* not a system administrator, then you're "vanilla" */
return (1);
return (errorCode);
if (chkforDir == MustBeDIR)
assert((*parent) == 0);
- if ((errorCode = GetClient(tcon, client)) != 0)
- return (errorCode);
- if (!(*client))
- return (EINVAL);
- assert(GetRights(*client, aCL, rights, anyrights) == 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 */
*/
static void
PutVolumePackage(Vnode * parentwhentargetnotdir, Vnode * targetptr,
- Vnode * parentptr, Volume * volptr)
+ Vnode * parentptr, Volume * volptr, struct client **client)
{
int fileCode = 0; /* Error code returned by the volume package */
if (volptr) {
VPutVolume(volptr);
}
+ if (*client) {
+ PutClient(client);
+ }
} /*PutVolumePackage */
static int
* We don't have to check for host's cps since only regular
* viceid are volume owners.
*/
- return (acl_IsAMember(owner, &client->CPS));
+ return (client_HasAsMember(client, owner));
}
} /*VolumeOwner */
&& targetptr->disk.type == vFile)
#ifdef USE_GROUP_PERMS
if (!OWNSp(client, targetptr)
- && !acl_IsAMember(targetptr->disk.owner, &client->CPS)) {
+ && !client_HasAsMember(client, targetptr->disk.owner)) {
errorCode =
(((GROUPREAD | GROUPEXEC) & targetptr->disk.modeBits)
? 0 : EACCES);
#endif
} else { /* !VanillaUser(client) && !FetchData */
- osi_audit(PrivilegeEvent, 0, AUD_INT,
+ osi_audit(PrivilegeEvent, 0, AUD_ID,
(client ? client->ViceId : 0), AUD_INT, CallingRoutine,
AUD_END);
}
else if (VanillaUser(client))
return (EPERM); /* Was EACCES */
else
- osi_audit(PrivilegeEvent, 0, AUD_INT,
+ osi_audit(PrivilegeEvent, 0, AUD_ID,
(client ? client->ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
} else {
if (CallingRoutine != CHK_STOREDATA && !VanillaUser(client)) {
- osi_audit(PrivilegeEvent, 0, AUD_INT,
+ osi_audit(PrivilegeEvent, 0, AUD_ID,
(client ? client->ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
} else {
else if (VanillaUser(client))
return (EPERM); /* Was EACCES */
else
- osi_audit(PrivilegeEvent, 0, AUD_INT,
+ osi_audit(PrivilegeEvent, 0, AUD_ID,
(client ? client->ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
if (VanillaUser(client))
return (EACCES);
else
- osi_audit(PrivSetID, 0, AUD_INT,
+ osi_audit(PrivSetID, 0, AUD_ID,
(client ? client->ViceId : 0), AUD_INT,
CallingRoutine, AUD_END);
}
if ((targetptr->disk.type == vFile)
&& VanillaUser(client)) {
if (!OWNSp(client, targetptr)
- && !acl_IsAMember(targetptr->disk.owner,
- &client->CPS)) {
+ && !client_HasAsMember(client, targetptr->disk.owner)) {
errorCode =
((GROUPWRITE & targetptr->disk.modeBits)
? 0 : EACCES);
if (VanillaUser(client))
return (EACCES);
else
- osi_audit(PrivilegeEvent, 0, AUD_INT,
+ osi_audit(PrivilegeEvent, 0, AUD_ID,
(client ? client->ViceId : 0),
AUD_INT, CallingRoutine, AUD_END);
}
} /*RXStore_AccessList */
-static afs_int32
-Fetch_AccessList(Vnode * targetptr, Vnode * parentwhentargetnotdir,
- struct AFSAccessList *AccessList)
-{
- char *eACL; /* External access list placeholder */
-
- assert(acl_Externalize
- ((targetptr->disk.type ==
- vDirectory ? VVnodeACL(targetptr) :
- VVnodeACL(parentwhentargetnotdir)), &eACL) == 0);
- if ((strlen(eACL) + 1) > AccessList->MaxSeqLen) {
- acl_FreeExternalACL(&eACL);
- return (E2BIG);
- } else {
- strcpy((char *)(AccessList->SeqBody), (char *)eACL);
- AccessList->SeqLen = strlen(eACL) + 1;
- }
- acl_FreeExternalACL(&eACL);
- return (0);
-
-} /*Fetch_AccessList */
-
-/*
- * The Access List information is converted from its external form in the
- * input AccessList structure to the internal representation and copied into
- * the target dir's vnode storage.
- */
-static afs_int32
-Store_AccessList(Vnode * targetptr, struct AFSAccessList *AccessList)
-{
- struct acl_accessList *newACL; /* PlaceHolder for new access list */
-
- if (acl_Internalize(AccessList->SeqBody, &newACL) != 0)
- return (EINVAL);
- if ((newACL->size + 4) > VAclSize(targetptr))
- return (E2BIG);
- memcpy((char *)VVnodeACL(targetptr), (char *)newACL, (int)(newACL->size));
- acl_FreeACL(&newACL);
- return (0);
-
-} /*Store_AccessList */
-
-
/* In our current implementation, each successive data store (new file
* data version) creates a new inode. This function creates the new
* inode, copies the old inode's contents to the new one, remove the old
("DT: inode=%s, name=%s, errno=%d\n",
PrintInode(NULL, VN_GET_INO(*targetptr)), Name,
errno));
-#ifdef AFS_DEC_ENV
- if ((errno != ENOENT) && (errno != EIO) && (errno != ENXIO))
-#else
if (errno != ENOENT)
-#endif
{
ViceLog(0,
("Volume %u now offline, must be salvaged.\n",
targetptr->disk.modeBits = modebits;
switch (Caller) {
case TVS_SDATA:
- osi_audit(PrivSetID, 0, AUD_INT, client->ViceId, AUD_INT,
+ osi_audit(PrivSetID, 0, AUD_ID, client->ViceId, AUD_INT,
CHK_STOREDATA, AUD_END);
break;
case TVS_CFILE:
case TVS_SSTATUS:
- osi_audit(PrivSetID, 0, AUD_INT, client->ViceId, AUD_INT,
+ osi_audit(PrivSetID, 0, AUD_ID, client->ViceId, AUD_INT,
CHK_STORESTATUS, AUD_END);
break;
default:
} /*RXUpdate_VolumeStatus */
-/* old interface */
-static afs_int32
-Update_VolumeStatus(Volume * volptr, VolumeStatus * StoreVolStatus,
- struct BBS *Name, struct BBS *OfflineMsg,
- struct BBS *Motd)
-{
- Error errorCode = 0;
-
- if (StoreVolStatus->MinQuota > -1)
- V_minquota(volptr) = StoreVolStatus->MinQuota;
- if (StoreVolStatus->MaxQuota > -1)
- V_maxquota(volptr) = StoreVolStatus->MaxQuota;
- if (OfflineMsg->SeqLen > 1)
- strcpy(V_offlineMessage(volptr), OfflineMsg->SeqBody);
- if (Name->SeqLen > 1)
- strcpy(V_name(volptr), Name->SeqBody);
-#if OPENAFS_VOL_STATS
- /*
- * We don't overwrite the motd field, since it's now being used
- * for stats
- */
-#else
- if (Motd->SeqLen > 1)
- strcpy(V_motd(volptr), Motd->SeqBody);
-#endif /* FS_STATS_DETAILED */
- VUpdateVolume(&errorCode, volptr);
- return (errorCode);
-
-} /*Update_VolumeStatus */
-
-
-/*
- * Get internal volume-related statistics from the Volume disk label
- * structure and put it into the VolumeStatus structure, status; it's
- * used by both SAFS_GetVolumeStatus and SAFS_SetVolumeStatus to return
- * the volume status to the caller.
- */
-static afs_int32
-GetVolumeStatus(VolumeStatus * status, struct BBS *name, struct BBS *offMsg,
- struct BBS *motd, Volume * volptr)
-{
- status->Vid = V_id(volptr);
- status->ParentId = V_parentId(volptr);
- status->Online = V_inUse(volptr);
- status->InService = V_inService(volptr);
- status->Blessed = V_blessed(volptr);
- status->NeedsSalvage = V_needsSalvaged(volptr);
- if (VolumeWriteable(volptr))
- status->Type = ReadWrite;
- else
- status->Type = ReadOnly;
- status->MinQuota = V_minquota(volptr);
- status->MaxQuota = V_maxquota(volptr);
- status->BlocksInUse = V_diskused(volptr);
- status->PartBlocksAvail = volptr->partition->free;
- status->PartMaxBlocks = volptr->partition->totalUsable;
- strncpy(name->SeqBody, V_name(volptr), (int)name->MaxSeqLen);
- name->SeqLen = strlen(V_name(volptr)) + 1;
- if (name->SeqLen > name->MaxSeqLen)
- name->SeqLen = name->MaxSeqLen;
- strncpy(offMsg->SeqBody, V_offlineMessage(volptr), (int)name->MaxSeqLen);
- offMsg->SeqLen = strlen(V_offlineMessage(volptr)) + 1;
- if (offMsg->SeqLen > offMsg->MaxSeqLen)
- offMsg->SeqLen = offMsg->MaxSeqLen;
-#ifdef notdef
- /*Don't do anything with the motd field */
- strncpy(motd->SeqBody, nullString, (int)offMsg->MaxSeqLen);
- motd->SeqLen = strlen(nullString) + 1;
-#endif
- if (motd->SeqLen > motd->MaxSeqLen)
- motd->SeqLen = motd->MaxSeqLen;
-
-} /*GetVolumeStatus */
-
static afs_int32
RXGetVolumeStatus(AFSFetchVolumeStatus * status, char **name, char **offMsg,
char **motd, Volume * volptr)
}
strcpy(*motd, V_motd(volptr));
#endif /* FS_STATS_DETAILED */
-
+ return 0;
} /*RXGetVolumeStatus */
} /*FileNameOK */
-/* Debugging tool to print Volume Statu's contents */
-static void
-PrintVolumeStatus(VolumeStatus * status)
-{
- ViceLog(5, ("Volume header contains:\n"));
- ViceLog(5,
- ("Vid = %u, Parent = %u, Online = %d, InService = %d, Blessed = %d, NeedsSalvage = %d\n",
- status->Vid, status->ParentId, status->Online, status->InService,
- status->Blessed, status->NeedsSalvage));
- ViceLog(5,
- ("MinQuota = %d, MaxQuota = %d\n", status->MinQuota,
- status->MaxQuota));
- ViceLog(5,
- ("Type = %d, BlocksInUse = %d, PartBlocksAvail = %d, PartMaxBlocks = %d\n",
- status->Type, status->BlocksInUse, status->PartBlocksAvail,
- status->PartMaxBlocks));
-
-} /*PrintVolumeStatus */
-
-
/*
* This variant of symlink is expressly to support the AFS/DFS translator
* and is not supported by the AFS fileserver. We just return EINVAL.
return EINVAL;
}
+#ifdef AFS_NT40_ENV
static struct afs_buffer {
struct afs_buffer *next;
} *freeBufferList = 0;
return (char *)tp;
} /*AllocSendBuffer */
+#endif /* AFS_NT40_ENV */
/*
* This routine returns the status info associated with the targetptr vnode
int errorCode = 0; /* return code to caller */
int fileCode = 0; /* return code from vol package */
Volume *volptr = 0; /* pointer to the volume */
- struct client *client; /* pointer to the client data */
+ struct client *client = 0; /* pointer to the client data */
struct rx_connection *tcon; /* the connection we're part of */
afs_int32 rights, anyrights; /* rights for this and any user */
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(5,
- ("SRXAFS_FetchData, Fid = %u.%u.%u, Host %s, Id %d\n",
+ ("SRXAFS_FetchData, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
/*
* Get volume/vnode for the fetched file; caller's access rights to
* it are also returned
Bad_FetchData:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
ViceLog(2, ("SRXAFS_FetchData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchDataEvent, errorCode, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, FetchDataEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return (errorCode);
} /*SRXAFS_FetchData */
afs_int32 Len, struct AFSFetchStatus * OutStatus,
struct AFSCallBack * CallBack, struct AFSVolSync * Sync)
{
- int code;
-
- code =
- common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack, Sync,
- 0);
- return code;
+ return common_FetchData64(acall, Fid, Pos, Len, OutStatus, CallBack,
+ Sync, 0);
}
afs_int32
#ifdef AFS_64BIT_ENV
#ifndef AFS_LARGEFILE_ENV
if (Pos + Len > 0x7fffffff)
- return E2BIG;
+ return EFBIG;
#endif /* !AFS_LARGEFILE_ENV */
tPos = (afs_sfsize_t) Pos;
tLen = (afs_sfsize_t) Len;
#else /* AFS_64BIT_ENV */
if (Pos.high || Len.high)
- return E2BIG;
+ return EFBIG;
tPos = Pos.low;
tLen = Len.low;
#endif /* AFS_64BIT_ENV */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
int errorCode = 0; /* return error code to caller */
Volume *volptr = 0; /* pointer to the volume */
- struct client *client; /* pointer to the client data */
+ struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
struct rx_connection *tcon = rx_ConnectionOf(acall);
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(5,
- ("SAFS_FetchACL, Fid = %u.%u.%u, Host %s, Id %d\n", Fid->Volume,
+ ("SAFS_FetchACL, Fid = %u.%u.%u, Host %s:%d, Id %d\n", Fid->Volume,
Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
AccessList->AFSOpaque_len = 0;
AccessList->AFSOpaque_val = malloc(AFSOPAQUEMAX);
Bad_FetchACL:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
ViceLog(2,
("SAFS_FetchACL returns %d (ACL=%s)\n", errorCode,
AccessList->AFSOpaque_val));
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchACLEvent, errorCode, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, FetchACLEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid,
+ AUD_ACL, AccessList->AFSOpaque_val, AUD_END);
return errorCode;
} /*SRXAFS_FetchACL */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
int errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
- struct client *client; /* pointer to the client data */
+ struct client *client = 0; /* pointer to the client data */
afs_int32 rights, anyrights; /* rights for this and any user */
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon = rx_ConnectionOf(acall);
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_FetchStatus, Fid = %u.%u.%u, Host %s, Id %d\n",
+ ("SAFS_FetchStatus, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.FetchStatus++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_FetchStatus:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
ViceLog(2, ("SAFS_FetchStatus returns %d\n", errorCode));
return errorCode;
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
int errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
- struct client *client; /* pointer to the client data */
+ 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 rx_connection *tcon = rx_ConnectionOf(acall);
+ struct client *t_client = NULL; /* tmp pointer to the client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
/* put back the file ID and volume */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
+ client = (struct client *)0;
}
Bad_BulkStatus:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
errorCode = CallPostamble(tcon, errorCode);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (errorCode == 0) {
Audit_and_Return:
ViceLog(2, ("SAFS_BulkStatus returns %d\n", errorCode));
- osi_auditU(acall, BulkFetchStatusEvent, errorCode, AUD_FIDS, Fids,
- AUD_END);
+ osi_auditU(acall, BulkFetchStatusEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FIDS, Fids, AUD_END);
return errorCode;
} /*SRXAFS_BulkStatus */
Vnode *parentwhentargetnotdir = 0; /* parent vnode if targetptr is a file */
int errorCode = 0; /* return code to caller */
Volume *volptr = 0; /* pointer to the volume */
- struct client *client; /* pointer to the client data */
+ 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 rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
AFSFetchStatus *tstatus;
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
&rights, &anyrights))) {
tstatus = &OutStats->AFSBulkStats_val[i];
tstatus->errorCode = errorCode;
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
+ client = (struct client *)0;
continue;
}
tstatus = &OutStats->AFSBulkStats_val[i];
tstatus->errorCode = errorCode;
(void)PutVolumePackage(parentwhentargetnotdir, targetptr,
- (Vnode *) 0, volptr);
+ (Vnode *) 0, volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
+ client = (struct client *)0;
continue;
}
}
/* put back the file ID and volume */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
parentwhentargetnotdir = (Vnode *) 0;
targetptr = (Vnode *) 0;
volptr = (Volume *) 0;
+ client = (struct client *)0;
}
Bad_InlineBulkStatus:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
errorCode = CallPostamble(tcon, errorCode);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (errorCode == 0) {
Audit_and_Return:
ViceLog(2, ("SAFS_InlineBulkStatus returns %d\n", errorCode));
- osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode, AUD_FIDS, Fids,
- AUD_END);
+ osi_auditU(acall, InlineBulkFetchStatusEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FIDS, Fids, AUD_END);
return 0;
} /*SRXAFS_InlineBulkStatus */
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_FetchStatus:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, FetchStatusEvent, code, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, FetchStatusEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_FetchStatus */
int errorCode = 0; /* return code for caller */
int fileCode = 0; /* return code from vol package */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon;
#if FS_STATS_DETAILED
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(5,
- ("StoreData: Fid = %u.%u.%u, Host %s, Id %d\n", Fid->Volume,
+ ("StoreData: Fid = %u.%u.%u, Host %s:%d, Id %d\n", Fid->Volume,
Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
/*
* Get associated volume/vnode for the stored file; caller's rights
Bad_StoreData:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
ViceLog(2, ("SAFS_StoreData returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode);
FS_UNLOCK;
}
#endif /* FS_STATS_DETAILED */
-
- osi_auditU(acall, StoreDataEvent, errorCode, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, StoreDataEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return (errorCode);
-
} /*common_StoreData64 */
afs_int32
afs_uint32 Length, afs_uint32 FileLength,
struct AFSFetchStatus * OutStatus, struct AFSVolSync * Sync)
{
- int code;
-
- code =
- common_StoreData64(acall, Fid, InStatus, Pos, Length, FileLength,
- OutStatus, Sync);
- return code;
-
+ return common_StoreData64(acall, Fid, InStatus, Pos, Length, FileLength,
+ OutStatus, Sync);
} /*SRXAFS_StoreData */
afs_int32
#ifdef AFS_64BIT_ENV
#ifndef AFS_LARGEFILE_ENV
if (FileLength > 0x7fffffff)
- return E2BIG;
+ return EFBIG;
#endif /* !AFS_LARGEFILE_ENV */
tPos = (afs_fsize_t) Pos;
tLength = (afs_fsize_t) Length;
tFileLength = (afs_fsize_t) FileLength;
#else /* AFS_64BIT_ENV */
if (FileLength.high)
- return E2BIG;
+ return EFBIG;
tPos = Pos.low;
tLength = Length.low;
tFileLength = FileLength.low;
int errorCode = 0; /* return code for caller */
struct AFSStoreStatus InStatus; /* Input status for fid */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct rx_connection *tcon;
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_StoreACL, Fid = %u.%u.%u, ACL=%s, Host %s, Id %d\n",
+ ("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), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.StoreACL++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_StoreACL:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0, volptr);
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ volptr, &client);
ViceLog(2, ("SAFS_StoreACL returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode);
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, StoreACLEvent, errorCode, AUD_FID, Fid, AUD_END);
+ 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;
} /*SRXAFS_StoreACL */
Vnode *parentwhentargetnotdir = 0; /* parent of Fid to get ACL */
int errorCode = 0; /* return code for caller */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
- struct client *t_client; /* tmp ptr to client data */
+ struct client *t_client = NULL; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
struct rx_connection *tcon = rx_ConnectionOf(acall);
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_StoreStatus, Fid = %u.%u.%u, Host %s, Id %d\n",
+ ("SAFS_StoreStatus, Fid = %u.%u.%u, Host %s:%d, Id %d\n",
Fid->Volume, Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.StoreStatus++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_StoreStatus:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0, volptr);
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ volptr, &client);
ViceLog(2, ("SAFS_StoreStatus returns %d\n", errorCode));
return errorCode;
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_StoreStatus:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, StoreStatusEvent, code, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, StoreStatusEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_StoreStatus */
AFSFid fileFid; /* area for Fid from the directory */
int errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
FidZero(&dir);
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_RemoveFile %s, Did = %u.%u.%u, Host %s, Id %d\n", Name,
+ ("SAFS_RemoveFile %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.RemoveFile++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_RemoveFile:
/* Update and store volume/vnode and parent vnodes back */
- PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr, volptr);
+ PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
+ volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_RemoveFile returns %d\n", errorCode));
return errorCode;
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_RemoveFile:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RemoveFileEvent, code, AUD_FID, DirFid, AUD_STR, Name,
- AUD_END);
+ osi_auditU(acall, RemoveFileEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
} /*SRXAFS_RemoveFile */
Volume *volptr = 0; /* pointer to the volume header */
int errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_CreateFile %s, Did = %u.%u.%u, Host %s, Id %d\n", Name,
+ ("SAFS_CreateFile %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.CreateFile++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Update_TargetVnodeStatus(targetptr, TVS_CFILE, client, InStatus,
parentptr, volptr, 0);
- /* set up the return status for the parent dir and the newly created file */
- GetStatus(targetptr, OutFidStatus, rights, anyrights, parentptr);
+ /* set up the return status for the parent dir and the newly created file, and since the newly created file is owned by the creator, give it PRSFS_ADMINISTER to tell the client its the owner of the file */
+ GetStatus(targetptr, OutFidStatus, rights | PRSFS_ADMINISTER, anyrights, parentptr);
GetStatus(parentptr, OutDirStatus, rights, anyrights, 0);
/* convert the write lock to a read lock before breaking callbacks */
Bad_CreateFile:
/* Update and store volume/vnode and parent vnodes back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr);
+ volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_CreateFile returns %d\n", errorCode));
return errorCode;
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
TM_GetTimeOfDay(&opStartTime, 0);
#endif /* FS_STATS_DETAILED */
+ memset(OutFid, 0, sizeof(struct AFSFid));
+
if ((code = CallPreamble(acall, ACTIVECALL, &tcon)))
goto Bad_CreateFile;
Bad_CreateFile:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, CreateFileEvent, code, AUD_FID, DirFid, AUD_STR, Name,
- AUD_END);
+ 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;
} /*SRXAFS_CreateFile */
DirHandle filedir; /* Handle for dir package I/O */
DirHandle newfiledir; /* Handle for dir package I/O */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
afs_int32 newrights; /* rights for this user */
afs_int32 newanyrights; /* rights for any user */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_Rename %s to %s, Fid = %u.%u.%u to %u.%u.%u, Host %s, Id %d\n",
+ ("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), t_client->ViceId));
+ NewDirFid->Unique, inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.Rename++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
VPutVnode(&fileCode, newfileptr);
assert(fileCode == 0);
}
- (void)PutVolumePackage(fileptr,
- (newvptr
- && newvptr != oldvptr ? newvptr : 0), oldvptr,
- volptr);
+ (void)PutVolumePackage(fileptr, (newvptr && newvptr != oldvptr ?
+ newvptr : 0), oldvptr, volptr, &client);
FidZap(&olddir);
FidZap(&newdir);
FidZap(&filedir);
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_Rename:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RenameFileEvent, code, AUD_FID, OldDirFid, AUD_STR,
- OldName, AUD_FID, NewDirFid, AUD_STR, NewName, AUD_END);
+ 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);
return code;
} /*SRXAFS_Rename */
Vnode *targetptr = 0; /* vnode of the new link */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
int errorCode = 0; /* error code */
- int code = 0;
+ int len, code = 0;
DirHandle dir; /* Handle for dir package I/O */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_Symlink %s to %s, Did = %u.%u.%u, Host %s, Id %d\n", Name,
+ ("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), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.Symlink++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
/* Write the contents of the symbolic link name into the target inode */
fdP = IH_OPEN(targetptr->handle);
assert(fdP != NULL);
- assert(FDH_WRITE(fdP, (char *)LinkContents, strlen((char *)LinkContents))
- == strlen((char *)LinkContents));
+ len = strlen((char *) LinkContents);
+ code = (len == FDH_WRITE(fdP, (char *) LinkContents, len)) ? 0 : VDISKFULL;
+ if (code) ViceLog(0, ("SAFSS_Symlink FDH_WRITE failed for len=%d, Fid=%u.%d.%d\n", len, OutFid->Volume, OutFid->Vnode, OutFid->Unique));
FDH_CLOSE(fdP);
/*
* Set up and return modified status for the parent dir and new symlink
Bad_SymLink:
/* Write the all modified vnodes (parent, new files) and volume back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr);
+ volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_Symlink returns %d\n", errorCode));
- return errorCode;
+ return ( errorCode ? errorCode : code );
} /*SAFSS_Symlink */
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_Symlink:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SymlinkEvent, code, AUD_FID, DirFid, AUD_STR, Name,
- AUD_END);
+ 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;
} /*SRXAFS_Symlink */
Volume *volptr = 0; /* pointer to the volume header */
int errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_Link %s, Did = %u.%u.%u, Fid = %u.%u.%u, Host %s, Id %d\n",
+ ("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), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.Link++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_Link:
/* Write the all modified vnodes (parent, new files) and volume back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr);
+ volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_Link returns %d\n", errorCode));
return errorCode;
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_Link:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, LinkEvent, code, AUD_FID, DirFid, AUD_STR, Name,
+ osi_auditU(acall, LinkEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name,
AUD_FID, ExistingFid, AUD_END);
return code;
int newACLSize; /* Size of access list */
DirHandle dir; /* Handle for dir package I/O */
DirHandle parentdir; /* Handle for dir package I/O */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_MakeDir %s, Did = %u.%u.%u, Host %s, Id %d\n", Name,
+ ("SAFS_MakeDir %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.MakeDir++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_MakeDir:
/* Write the all modified vnodes (parent, new files) and volume back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr);
+ volptr, &client);
FidZap(&dir);
FidZap(&parentdir);
ViceLog(2, ("SAFS_MakeDir returns %d\n", errorCode));
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_MakeDir:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, MakeDirEvent, code, AUD_FID, DirFid, AUD_STR, Name,
- AUD_END);
+ osi_auditU(acall, MakeDirEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name,
+ AUD_FID, OutFid, AUD_END);
return code;
} /*SRXAFS_MakeDir */
int errorCode = 0; /* error code */
DirHandle dir; /* Handle for dir package I/O */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ 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 */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_RemoveDir %s, Did = %u.%u.%u, Host %s, Id %d\n", Name,
+ ("SAFS_RemoveDir %s, Did = %u.%u.%u, Host %s:%d, Id %d\n", Name,
DirFid->Volume, DirFid->Vnode, DirFid->Unique,
- inet_ntoa(logHostAddr), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.RemoveDir++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_RemoveDir:
/* Write the all modified vnodes (parent, new files) and volume back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, parentptr,
- volptr);
+ volptr, &client);
FidZap(&dir);
ViceLog(2, ("SAFS_RemoveDir returns %d\n", errorCode));
return errorCode;
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_RemoveDir:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, RemoveDirEvent, code, AUD_FID, DirFid, AUD_STR, Name,
- AUD_END);
+ osi_auditU(acall, RemoveDirEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, DirFid, AUD_STR, Name, AUD_END);
return code;
} /*SRXAFS_RemoveDir */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
int errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
}
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_SetLock type = %s Fid = %u.%u.%u, Host %s, Id %d\n",
+ ("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), t_client->ViceId));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.SetLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_SetLock:
/* Write the all modified vnodes (parent, new files) and volume back */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
if ((errorCode == VREADONLY) && (type == LockRead))
errorCode = 0; /* allow read locks on RO volumes without saving state */
ViceLockType type, struct AFSVolSync * Sync)
{
return SRXAFS_SetLock(acall, Fid, type, Sync);
-
} /*SRXAFS_OldSetLock */
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_SetLock:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SetLockEvent, code, AUD_FID, Fid, AUD_LONG, type,
- AUD_END);
+ osi_auditU(acall, SetLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_LONG, type, AUD_END);
return code;
-
} /*SRXAFS_SetLock */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
int errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_ExtendLock Fid = %u.%u.%u, Host %s, Id %d\n", Fid->Volume,
+ ("SAFS_ExtendLock Fid = %u.%u.%u, Host %s:%d, Id %d\n", Fid->Volume,
Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.ExtendLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_ExtendLock:
/* Put back file's vnode and volume */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
if ((errorCode == VREADONLY)) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
struct AFSVolSync * Sync)
{
return SRXAFS_ExtendLock(acall, Fid, Sync);
-
} /*SRXAFS_OldExtendLock */
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_ExtendLock:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, ExtendLockEvent, code, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, ExtendLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_ExtendLock */
Vnode *parentwhentargetnotdir = 0; /* parent for use in SetAccessList */
int errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client structure */
+ struct client *client = 0; /* pointer to client structure */
afs_int32 rights, anyrights; /* rights for this and any user */
struct client *t_client; /* tmp ptr to client data */
struct in_addr logHostAddr; /* host ip holder for inet_ntoa */
/* Get ptr to client data for user Id for logging */
t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(tcon));
+ logHostAddr.s_addr = rxr_HostOf(tcon);
ViceLog(1,
- ("SAFS_ReleaseLock Fid = %u.%u.%u, Host %s, Id %d\n", Fid->Volume,
+ ("SAFS_ReleaseLock Fid = %u.%u.%u, Host %s:%d, Id %d\n", Fid->Volume,
Fid->Vnode, Fid->Unique, inet_ntoa(logHostAddr),
- t_client->ViceId));
+ ntohs(rxr_PortOf(tcon)), t_client->ViceId));
FS_LOCK;
AFSCallStats.ReleaseLock++, AFSCallStats.TotalCalls++;
FS_UNLOCK;
Bad_ReleaseLock:
/* Put back file's vnode and volume */
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
if ((errorCode == VREADONLY)) /* presumably, we already granted this lock */
errorCode = 0; /* under our generous policy re RO vols */
struct AFSVolSync * Sync)
{
return SRXAFS_ReleaseLock(acall, Fid, Sync);
-
} /*SRXAFS_OldReleaseLock */
{
afs_int32 code;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_ReleaseLock:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, ReleaseLockEvent, code, AUD_FID, Fid, AUD_END);
+ osi_auditU(acall, ReleaseLockEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_FID, Fid, AUD_END);
return code;
} /*SRXAFS_ReleaseLock */
SRXAFS_GetStatistics(struct rx_call *acall, struct ViceStatistics *Statistics)
{
afs_int32 code;
- struct rx_connection *tcon;
+ struct rx_connection *tcon = rx_ConnectionOf(acall);
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_GetStatistics:
code = CallPostamble(tcon, code);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (code == 0) {
}
#endif /* FS_STATS_DETAILED */
+ osi_auditU(acall, GetStatisticsEvent, code,
+ AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
return code;
-
} /*SRXAFS_GetStatistics */
SRXAFS_XStatsVersion(struct rx_call * a_call, afs_int32 * a_versionP)
{ /*SRXAFS_XStatsVersion */
+ struct client *t_client = NULL; /* tmp ptr to client data */
+ struct rx_connection *tcon;
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
*a_versionP = AFS_XSTAT_VERSION;
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
(opP->numSuccesses)++;
FS_UNLOCK;
#endif /* FS_STATS_DETAILED */
- return (0);
+ osi_auditU(a_call, XStatsVersionEvent, 0,
+ AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
+ return (0);
} /*SRXAFS_XStatsVersion */
a_perfP->host_ClientBlocks = CEBlocks;
a_perfP->sysname_ID = afs_perfstats.sysname_ID;
-
+ a_perfP->rx_nBusies = (afs_int32) rx_stats.nBusies;
+ a_perfP->fs_nBusies = afs_perfstats.fs_nBusies;
} /*FillPerfValues */
{
afs_int32 errorCode = 0;
register int i;
- struct client *client;
+ struct client *client = 0;
struct rx_connection *tcon;
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
("SAFS_GiveUpAllCallBacks: host=%x\n",
(tcon->peer ? tcon->peer->host : 0)));
errorCode = GetClient(tcon, &client);
- if (!errorCode)
+ if (!errorCode) {
DeleteAllCallBacks_r(client->host, 1);
+ PutClient(&client);
+ }
} else {
if (FidArray->AFSCBFids_len < CallBackArray->AFSCBs_len) {
ViceLog(0,
register struct AFSFid *fid = &(FidArray->AFSCBFids_val[i]);
DeleteCallBack(client->host, fid);
}
+ PutClient(&client);
}
}
afs_int32
SRXAFS_GetCapabilities(struct rx_call * acall, Capabilities * capabilities)
{
+ afs_int32 code;
+ struct rx_connection *tcon;
afs_int32 *dataBuffP;
afs_int32 dataBytes;
+#if FS_STATS_DETAILED
+ struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
+ struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
+ struct timeval elapsedTime; /* Transfer time */
+
+ /*
+ * Set our stats pointer, remember when the RPC operation started, and
+ * tally the operation.
+ */
+ opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETCAPABILITIES]);
+ FS_LOCK;
+ (opP->numOps)++;
+ FS_UNLOCK;
+ TM_GetTimeOfDay(&opStartTime, 0);
+#endif /* FS_STATS_DETAILED */
+
+ if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon)))
+ goto Bad_GetCaps;
+ FS_LOCK;
+ AFSCallStats.GetCapabilities++, AFSCallStats.TotalCalls++;
+ FS_UNLOCK;
dataBytes = 1 * sizeof(afs_int32);
dataBuffP = (afs_int32 *) malloc(dataBytes);
- dataBuffP[0] = CAPABILITY_ERRORTRANS;
+ dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS;
+#if defined(AFS_64BIT_ENV) && defined(AFS_LARGEFILE_ENV)
+ dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
+#endif
+
capabilities->Capabilities_len = dataBytes / sizeof(afs_int32);
capabilities->Capabilities_val = dataBuffP;
+ ViceLog(2, ("SAFS_GetCapabilties\n"));
+
+ Bad_GetCaps:
+ code = CallPostamble(tcon, code);
+
+#if FS_STATS_DETAILED
+ TM_GetTimeOfDay(&opStopTime, 0);
+ fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
+ if (code == 0) {
+ FS_LOCK;
+ (opP->numSuccesses)++;
+ fs_stats_AddTo((opP->sumTime), elapsedTime);
+ fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
+ if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
+ fs_stats_TimeAssign((opP->minTime), elapsedTime);
+ }
+ if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
+ fs_stats_TimeAssign((opP->maxTime), elapsedTime);
+ }
+ FS_UNLOCK;
+ }
+#endif /* FS_STATS_DETAILED */
return 0;
}
afs_int32 nids, naddrs;
afs_int32 *vd, *addr;
int errorCode = 0; /* return code to caller */
- struct client *client;
+ struct client *client = 0;
struct rx_connection *tcon = rx_ConnectionOf(acall);
ViceLog(1, ("SRXAFS_FlushCPS\n"));
for (i = 0; i < nids; i++, vd++) {
if (!*vd)
continue;
- client = h_ID2Client(*vd); /* returns client locked, or NULL */
+ client = h_ID2Client(*vd); /* returns client write locked, or NULL */
if (!client)
continue;
- BoostSharedLock(&client->lock);
client->prfail = 2; /* Means re-eval client's cps */
#ifdef notdef
if (client->tcon) {
Vnode *parentwhentargetnotdir = 0; /* vnode of parent */
int errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client entry */
+ struct client *client = 0; /* pointer to client entry */
afs_int32 rights, anyrights; /* rights for this and any user */
AFSFid dummyFid;
struct rx_connection *tcon;
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
Bad_GetVolumeStatus:
(void)PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
- volptr);
+ volptr, &client);
ViceLog(2, ("SAFS_GetVolumeStatus returns %d\n", errorCode));
/* next is to guarantee out strings exist for stub */
if (*Name == 0) {
}
errorCode = CallPostamble(tcon, errorCode);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (errorCode == 0) {
FS_UNLOCK;
}
#endif /* FS_STATS_DETAILED */
+
+ osi_auditU(acall, GetVolumeStatusEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_LONG, avolid, AUD_STR, *Name, AUD_END);
return (errorCode);
} /*SRXAFS_GetVolumeStatus */
Vnode *parentwhentargetnotdir = 0; /* vnode of parent */
int errorCode = 0; /* error code */
Volume *volptr = 0; /* pointer to the volume header */
- struct client *client; /* pointer to client entry */
+ struct client *client = 0; /* pointer to client entry */
afs_int32 rights, anyrights; /* rights for this and any user */
AFSFid dummyFid;
struct rx_connection *tcon = rx_ConnectionOf(acall);
+ struct client *t_client = NULL; /* tmp ptr to client data */
#if FS_STATS_DETAILED
struct fs_stats_opTimingData *opP; /* Ptr to this op's timing struct */
struct timeval opStartTime, opStopTime; /* Start/stop times for RPC op */
RXUpdate_VolumeStatus(volptr, StoreVolStatus, Name, OfflineMsg, Motd);
Bad_SetVolumeStatus:
- PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0, volptr);
+ PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0,
+ volptr, &client);
ViceLog(2, ("SAFS_SetVolumeStatus returns %d\n", errorCode));
errorCode = CallPostamble(tcon, errorCode);
+ t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+
#if FS_STATS_DETAILED
TM_GetTimeOfDay(&opStopTime, 0);
if (errorCode == 0) {
}
#endif /* FS_STATS_DETAILED */
- osi_auditU(acall, SetVolumeStatusEvent, errorCode, AUD_LONG, avolid,
- AUD_STR, Name, AUD_END);
+ osi_auditU(acall, SetVolumeStatusEvent, errorCode,
+ AUD_ID, t_client ? t_client->ViceId : 0,
+ AUD_LONG, avolid, AUD_STR, Name, AUD_END);
return (errorCode);
-
} /*SRXAFS_SetVolumeStatus */
#define DEFAULTVOLUME "root.afs"
TM_GetTimeOfDay(&StartTime, 0);
ihP = targetptr->handle;
fdP = IH_OPEN(ihP);
- if (fdP == NULL)
+ if (fdP == NULL) {
+ VTakeOffline(volptr);
return EIO;
+ }
optSize = sendBufSize;
tlen = FDH_SIZE(fdP);
ViceLog(25,
("FetchData_RXStyle: file size %llu\n", (afs_uintmax_t) tlen));
if (tlen < 0) {
FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
return EIO;
}
+ if (Pos > tlen) {
+ Len = 0;
+ }
if (Pos + Len > tlen)
Len = tlen - Pos; /* get length we should send */
{
afs_int32 high, low;
SplitOffsetOrSize(Len, high, low);
- assert(Int64Mode || high == 0);
+ 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 (errorCode != wlen) {
FDH_CLOSE(fdP);
FreeSendBuffer((struct afs_buffer *)tbuffer);
+ VTakeOffline(volptr);
return EIO;
}
errorCode = rx_Write(Call, tbuffer, wlen);
errorCode = rx_WritevAlloc(Call, tiov, &tnio, RX_MAXIOVECS, wlen);
if (errorCode <= 0) {
FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
return EIO;
}
wlen = errorCode;
errorCode = FDH_READV(fdP, tiov, tnio);
if (errorCode != wlen) {
FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
return EIO;
}
errorCode = rx_Writev(Call, tiov, tnio, wlen);
if (Pos == -1 || VN_GET_INO(targetptr) == 0) {
/* the inode should have been created in Alloc_NewVnode */
- logHostAddr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(Call)));
+ logHostAddr.s_addr = rxr_HostOf(rx_ConnectionOf(Call));
ViceLog(0,
- ("StoreData_RXStyle : Inode non-existent Fid = %u.%u.%u, inode = %llu, Pos %llu Host %s\n",
+ ("StoreData_RXStyle : Inode non-existent Fid = %u.%u.%u, inode = %llu, Pos %llu Host %s:%d\n",
Fid->Volume, Fid->Vnode, Fid->Unique,
(afs_uintmax_t) VN_GET_INO(targetptr), (afs_uintmax_t) Pos,
- inet_ntoa(logHostAddr)));
+ inet_ntoa(logHostAddr), ntohs(rxr_PortOf(rx_ConnectionOf(Call)))));
return ENOENT; /* is this proper error code? */
} else {
/*
return ENOENT;
if (GetLinkCountAndSize(volptr, fdP, &linkCount, &DataLength) < 0) {
FDH_CLOSE(fdP);
+ VTakeOffline(volptr);
return EIO;
}
}
afs_int32
+SRXAFS_CallBackRxConnAddr (struct rx_call * acall, afs_int32 *addr)
+{
+ Error errorCode = 0;
+ struct rx_connection *tcon;
+#ifdef __EXPERIMENTAL_CALLBACK_CONN_MOVING
+ struct host *thost;
+ struct client *tclient;
+ static struct rx_securityClass *sc = 0;
+ int i,j;
+ struct rx_connection *conn;
+#endif
+
+ if (errorCode = CallPreamble(acall, ACTIVECALL, &tcon))
+ goto Bad_CallBackRxConnAddr1;
+
+#ifndef __EXPERIMENTAL_CALLBACK_CONN_MOVING
+ errorCode = 1;
+#else
+ H_LOCK;
+ tclient = h_FindClient_r(tcon);
+ thost = tclient->host;
+
+ /* nothing more can be done */
+ if ( !thost->interface )
+ goto Bad_CallBackRxConnAddr;
+
+ assert(thost->interface->numberOfInterfaces > 0 );
+
+ /* the only address is the primary interface */
+ /* can't change when there's only 1 address, anyway */
+ 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] )
+ goto Bad_CallBackRxConnAddr;
+
+ conn = rx_NewConnection (thost->interface->addr[i],
+ thost->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);
+ H_UNLOCK;
+ errorCode = CallPostamble(tcon, errorCode);
+ return errorCode;
+ } else {
+ rx_DestroyConnection(conn);
+ }
+ Bad_CallBackRxConnAddr:
+ H_UNLOCK;
+#endif
+
+ errorCode = CallPostamble(tcon, errorCode);
+ Bad_CallBackRxConnAddr1:
+ return errorCode; /* failure */
+}
+
+afs_int32
sys_error_to_et(afs_int32 in)
{
if (in == 0)
return 0;
if (in < 0 || in > 511)
return in;
+ if (in >= VICE_SPECIAL_ERRORS && in <= VIO || in == VRESTRICTED)
+ return in;
if (sys2et[in] != 0)
return sys2et[in];
return in;