sa = addrs[i];
ForceNewConnections(sa);
}
+
+ afs_osi_Free(addrs, srvAddrCount * sizeof(*addrs));
}
static void
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*/
osi_timeval_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);
#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;
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)) {
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