{
struct server *a_serverP = sa->server;
struct srvAddr *sap;
- osi_timeval_t currTime, *currTimeP; /*Current time */
+ osi_timeval32_t currTime, *currTimeP; /*Current time */
afs_int32 downTime; /*Computed downtime, in seconds */
struct afs_stats_SrvUpDownInfo *upDownP; /*Ptr to up/down info record */
* updated; we'll need them one way or another.
*/
currTimeP = &currTime;
- osi_GetuTime(currTimeP);
+ osi_GetTime(currTimeP);
upDownP = GetUpDownStats(a_serverP);
afs_int32
-afs_ServerDown(struct srvAddr *sa, int code)
+afs_ServerDown(struct srvAddr *sa, int code, struct rx_connection *rxconn)
{
struct server *aserver = sa->server;
return 0;
afs_MarkServerUpOrDown(sa, SRVR_ISDOWN);
if (sa->sa_portal == aserver->cell->vlport)
- print_internet_address
- ("afs: Lost contact with volume location server ", sa, "", 1, code);
+ print_internet_address("afs: Lost contact with volume location server ",
+ sa, "", 1, code, rxconn);
else
print_internet_address("afs: Lost contact with file server ", sa, "",
- 1, code);
+ 1, code, rxconn);
return 1;
} /*ServerDown */
code = VL_ProbeServer(rxconn);
RX_AFS_GLOCK();
rx_SetConnDeadTime(rxconn, afs_rx_deadtime);
- afs_PutConn(tc, rxconn, SHARED_LOCK);
/*
* If probe worked, or probe call not yet defined (for compatibility
* with old vlsevers), then we treat this server as running again
if (tc->parent->srvr == sa) {
afs_MarkServerUpOrDown(sa, 0);
print_internet_address("afs: volume location server ", sa,
- " is back up", 2, code);
+ " is back up", 2, code, rxconn);
}
}
+ afs_PutConn(tc, rxconn, SHARED_LOCK);
} /*CheckVLServer */
int currIdx; /*Curr idx into srv table */
struct server *currSrvP; /*Ptr to curr server record */
afs_int32 currChainLen; /*Length of curr hash chain */
- osi_timeval_t currTime; /*Current time */
- osi_timeval_t *currTimeP; /*Ptr to above */
+ osi_timeval32_t currTime; /*Current time */
+ osi_timeval32_t *currTimeP; /*Ptr to above */
afs_int32 srvRecordAge; /*Age of server record, in secs */
struct afs_stats_SrvUpDownInfo *upDownP; /*Ptr to current up/down
* info being manipulated */
* Compute the current time, used to figure out server record ages.
*/
currTimeP = &currTime;
- osi_GetuTime(currTimeP);
+ osi_GetTime(currTimeP);
/*
* Sweep the server hash table, tallying all we need to know.
sa = addrs[i];
ForceNewConnections(sa);
}
+
+ afs_osi_Free(addrs, srvAddrCount * sizeof(*addrs));
}
static void
-CkSrv_MarkUpDown(struct afs_conn **conns, int nconns, afs_int32 *results)
+CkSrv_MarkUpDown(struct afs_conn **conns, struct rx_connection **rxconns,
+ int nconns, afs_int32 *results)
{
struct srvAddr *sa;
struct afs_conn *tc;
(tc->parent->srvr == sa)) {
/* server back up */
print_internet_address("afs: file server ", sa, " is back up", 2,
- results[i]);
+ results[i], rxconns[i]);
ObtainWriteLock(&afs_xserver, 244);
ObtainWriteLock(&afs_xsrvAddr, 245);
} else {
if (results[i] < 0) {
/* server crashed */
- afs_ServerDown(sa, results[i]);
+ afs_ServerDown(sa, results[i], rxconns[i]);
ForceNewConnections(sa); /* multi homed clients */
}
}
caps[i].Capabilities_len = 0;
}
}
- CkSrv_MarkUpDown(conns, nconns, results);
+ CkSrv_MarkUpDown(conns, rxconns, nconns, results);
afs_osi_Free(caps, nconns * sizeof(Capabilities));
afs_osi_Free(results, nconns * sizeof(afs_int32));
void (*func2) (int nservers, struct rx_connection **rxconns,
struct afs_conn **conns))
{
- struct vrequest treq;
+ struct vrequest *treq = NULL;
struct server *ts;
struct srvAddr *sa;
struct afs_conn *tc = NULL;
if (AFS_IS_DISCONNECTED)
return;
- if ((code = afs_InitReq(&treq, afs_osi_credp)))
+ if ((code = afs_CreateReq(&treq, afs_osi_credp)))
return;
ObtainReadLock(&afs_xserver); /* Necessary? */
ObtainReadLock(&afs_xsrvAddr);
/* check vlserver with special code */
if (sa->sa_portal == AFS_VLPORT) {
if (vlalso)
- CheckVLServer(sa, &treq);
+ CheckVLServer(sa, treq);
continue;
}
continue; /* have just been added by setsprefs */
/* get a connection, even if host is down; bumps conn ref count */
- tu = afs_GetUser(treq.uid, ts->cell->cellNum, SHARED_LOCK);
+ tu = afs_GetUser(treq->uid, ts->cell->cellNum, SHARED_LOCK);
tc = afs_ConnBySA(sa, ts->cell->fsport, ts->cell->cellNum, tu,
1 /*force */ , 1 /*create */ , SHARED_LOCK, 0,
&rxconn);
afs_osi_Free(conns, j * sizeof(struct afs_conn *));
afs_osi_Free(rxconns, j * sizeof(struct rx_connection *));
afs_osi_Free(conntimer, j * sizeof(afs_int32));
+ afs_DestroyReq(treq);
} /*afs_CheckServers*/
AFS_STATCNT(afs_random);
if (!state) {
- osi_timeval_t t;
+ osi_timeval32_t t;
osi_GetTime(&t);
/*
- * 0xfffffff0 was changed to (~0 << 4) since it works no matter how many
- * bits are in a tv_usec
+ * Clear the low nybble of tv_usec in a size-independent manner before adding
+ * in the rest of the state.
*/
- state = (t.tv_usec & (~0 << 4)) + (rxi_getaddr() & 0xff);
+ state = t.tv_usec;
+ state ^= (state & 0x0f);
+ state += rxi_getaddr() & 0xff;
state += (t.tv_sec & 0xff);
for (i = 0; i < 30; i++) {
ranstage(state);
sa->sa_iprank = t;
}
}
-#ifdef IFF_POINTOPOINT
+#if defined(IFF_POINTOPOINT) && !defined(UKERNEL)
/* check for case #4 -- point-to-point link */
if ((ifa->ia_ifp->if_flags & IFF_POINTOPOINT)
&& (SA2ULONG(IA_DST(ifa)) == ntohl(sa->sa_ip))) {
}
#endif /* AFS_SGI62_ENV */
static int
-afs_SetServerPrefs(struct srvAddr *sa)
+afs_SetServerPrefs(struct srvAddr *const sa)
{
#if defined(AFS_USERSPACE_IP_ADDR)
int i;
#endif
int subnet, subnetmask, net, netmask;
- if (sa)
- sa->sa_iprank = 0;
+ sa->sa_iprank = 0;
#ifdef AFS_SUN510_ENV
rw_enter(&afsifinfo_lock, RW_READER);
}
net = afsifinfo[i].ipaddr & netmask;
-#ifdef notdef
- if (!s) {
- if (!rx_IsLoopbackAddr(afsifinfo[i].ipaddr)) { /* ignore loopback */
- *cnt += 1;
- if (*cnt > 16)
- return;
- *addrp++ = afsifinfo[i].ipaddr;
- }
- } else
-#endif /* notdef */
{
/* XXXXXX Do the individual ip ranking below XXXXX */
if ((sa->sa_ip & netmask) == net) {
netmask = 0;
}
net = ipif->ipif_local_addr & netmask;
-#ifdef notdef
- if (!s) {
- if (!rx_IsLoopbackAddr(ipif->ipif_local_addr)) { /* ignore loopback */
- *cnt += 1;
- if (*cnt > 16)
- return;
- *addrp++ = ipif->ipif_local_addr;
- }
- } else
-#endif /* notdef */
{
/* XXXXXX Do the individual ip ranking below XXXXX */
if ((sa->sa_ip & netmask) == net) {
struct in_ifaddr *ifad = (struct in_ifaddr *)0;
struct sockaddr_in *sin;
- if (!sa) {
-#ifdef notdef /* clean up, remove this */
- for (ifn = ifnet; ifn != NULL; ifn = ifn->if_next) {
- for (ifad = ifn->if_addrlist; ifad != NULL; ifad = ifad->ifa_next) {
- if ((IFADDR2SA(ifad)->sa_family == AF_INET)
- && !(ifn->if_flags & IFF_LOOPBACK)) {
- *cnt += 1;
- if (*cnt > 16)
- return;
- *addrp++ =
- ((struct sockaddr_in *)IFADDR2SA(ifad))->sin_addr.
- s_addr;
- }
- }}
-#endif /* notdef */
- return;
- }
sa->sa_iprank = 0;
-#ifdef ADAPT_MTU
ifn = rxi_FindIfnet(sa->sa_ip, &ifad);
-#endif
if (ifn) { /* local, more or less */
#ifdef IFF_LOOPBACK
if (ifn->if_flags & IFF_LOOPBACK) {
}
#else /* USEIFADDR */
- if (sa)
- sa->sa_iprank = LO;
+ sa->sa_iprank = LO;
#ifdef AFS_SGI62_ENV
(void)hash_enum(&hashinfo_inaddr, afsi_enum_set_rank, HTF_INET, NULL,
(caddr_t) sa, NULL);
#elif defined(AFS_FBSD_ENV)
{
struct in_ifaddr *ifa;
-#if defined(AFS_FBSD80_ENV)
- TAILQ_FOREACH(ifa, &V_in_ifaddrhead, ia_link) {
-#else
- TAILQ_FOREACH(ifa, &in_ifaddrhead, ia_link) {
-#endif
+ CURVNET_SET(rx_socket->so_vnet);
+ TAILQ_FOREACH(ifa, &V_in_ifaddrhead, ia_link) {
afsi_SetServerIPRank(sa, &ifa->ia_ifa);
- }}
+ }
+ CURVNET_RESTORE();
+ }
#elif defined(AFS_OBSD_ENV)
{
extern struct in_ifaddrhead in_ifaddr;
#endif
#endif /* AFS_SUN5_ENV */
#endif /* else AFS_USERSPACE_IP_ADDR */
- if (sa)
- sa->sa_iprank += afs_randomMod15();
+ sa->sa_iprank += afs_randomMod15();
return 0;
} /* afs_SetServerPrefs */
afs_GetCapabilities(struct server *ts)
{
Capabilities caps = {0, NULL};
- struct vrequest treq;
+ struct vrequest *treq = NULL;
struct afs_conn *tc;
struct unixuser *tu;
struct rx_connection *rxconn;
if ( !afs_osi_credp )
return;
- if ((code = afs_InitReq(&treq, afs_osi_credp)))
+ if ((code = afs_CreateReq(&treq, afs_osi_credp)))
return;
- tu = afs_GetUser(treq.uid, ts->cell->cellNum, SHARED_LOCK);
- if ( !tu )
+ tu = afs_GetUser(treq->uid, ts->cell->cellNum, SHARED_LOCK);
+ if ( !tu ) {
+ afs_DestroyReq(treq);
return;
+ }
tc = afs_ConnBySA(ts->addr, ts->cell->fsport, ts->cell->cellNum, tu, 0, 1,
SHARED_LOCK, 0, &rxconn);
afs_PutUser(tu, SHARED_LOCK);
- if ( !tc )
+ if ( !tc ) {
+ afs_DestroyReq(treq);
return;
+ }
/* InitCallBackStateN, triggered by our RPC, may need this */
ReleaseWriteLock(&afs_xserver);
+ AFS_GUNLOCK();
code = RXAFS_GetCapabilities(rxconn, &caps);
+ AFS_GLOCK();
ObtainWriteLock(&afs_xserver, 723);
/* we forced a conn above; important we mark it down if needed */
if ((code < 0) && (code != RXGEN_OPCODE)) {
- afs_ServerDown(tc->parent->srvr, code);
+ afs_ServerDown(tc->parent->srvr, code, rxconn);
ForceNewConnections(tc->parent->srvr); /* multi homed clients */
}
afs_PutConn(tc, rxconn, SHARED_LOCK);
if ( code && code != RXGEN_OPCODE ) {
afs_warn("RXAFS_GetCapabilities failed with code %d\n", code);
/* better not be anything to free. we failed! */
+ afs_DestroyReq(treq);
return;
}
caps.Capabilities_val = NULL;
}
+ afs_DestroyReq(treq);
}
static struct server *
newts->flags |= SRVR_MULTIHOMED;
}
if (acell)
- newts->cell = afs_GetCell(acell, 0);
+ /* Use the afs_GetCellStale variant to avoid afs_GetServer recursion. */
+ newts->cell = afs_GetCellStale(acell, 0);
/* For each IP address we are registering */
for (k = 0; k < nservers; k++) {
afs_servers[iphash] = orphts;
if (acell)
- orphts->cell = afs_GetCell(acell, 0);
+ /* Use the afs_GetCellStale variant to avoid afs_GetServer recursion. */
+ orphts->cell = afs_GetCellStale(acell, 0);
}
/* Hang the srvAddr struct off of the server structure. The server
void
afs_ActivateServer(struct srvAddr *sap)
{
- osi_timeval_t currTime; /*Filled with current time */
- osi_timeval_t *currTimeP; /*Ptr to above */
+ osi_timeval32_t currTime; /*Filled with current time */
+ osi_timeval32_t *currTimeP; /*Ptr to above */
struct afs_stats_SrvUpDownInfo *upDownP; /*Ptr to up/down info record */
struct server *aserver = sap->server;
*/
aserver->flags |= AFS_SERVER_FLAG_ACTIVATED;
currTimeP = &currTime;
- osi_GetuTime(currTimeP);
+ osi_GetTime(currTimeP);
aserver->activationTime = currTime.tv_sec;
upDownP = GetUpDownStats(aserver);
if (aserver->flags & SRVR_ISDOWN) {