#include <strsafe.h>
#include <malloc.h>
#include "afsd.h"
+#include "cm_getaddrs.h"
#include <osi.h>
#include <rx/rx.h>
lock_FinalizeRWLock(&volp->rw);
}
+ cm_getaddrsShutdown();
+
return 0;
}
_InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_RO_SIZE_VALID);
}
}
- osi_EndOnce(&once);
+
+ cm_getaddrsInit();
+
+ osi_EndOnce(&once);
}
}
long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
cm_volume_t *volp)
{
- struct rx_connection *rxconnp;
- cm_conn_t *connp;
int i;
- afs_uint32 j, k;
+ afs_uint32 j;
cm_serverRef_t *tsrp;
cm_server_t *tsp;
struct sockaddr_in tsockAddr;
/* Do not hold the volume lock across the RPC calls */
lock_ReleaseWrite(&volp->rw);
- if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID)
- cm_UpdateCell(cellp, 0);
+ if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID) {
+ cellp = cm_UpdateCell(cellp, 0);
+ if (cellp == NULL) {
+ lock_ObtainWrite(&volp->rw);
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_UPDATING_VL);
+ return(CM_ERROR_NOSUCHCELL);
+ }
+ }
/* now we have volume structure locked and held; make RPC to fill it */
code = cm_GetEntryByName(cellp, volp->namep, &vldbEntry, &nvldbEntry,
afs_int32 roID;
afs_int32 bkID;
afs_int32 serverNumber[NMAXNSERVERS];
+ afs_int32 serverUnique[NMAXNSERVERS];
afs_int32 serverFlags[NMAXNSERVERS];
afsUUID serverUUID[NMAXNSERVERS];
afs_int32 rwServers_alldown = 1;
}
memset(serverUUID, 0, sizeof(serverUUID));
+ memset(serverUnique, 0, sizeof(serverUnique));
switch ( method ) {
case 0:
serverNumber[j] = uvldbEntry.serverNumber[i].time_low;
j++;
} else {
- afs_uint32 * addrp, nentries, code, unique;
- bulkaddrs addrs;
- ListAddrByAttributes attrs;
- afsUUID uuid;
-
- memset(&attrs, 0, sizeof(attrs));
- attrs.Mask = VLADDR_UUID;
- attrs.uuid = uvldbEntry.serverNumber[i];
- memset(&uuid, 0, sizeof(uuid));
- memset(&addrs, 0, sizeof(addrs));
-
- do {
- code = cm_ConnByMServers(cellp->vlServersp, FALSE, userp, reqp, &connp);
- if (code)
- continue;
-
- rxconnp = cm_GetRxConn(connp);
- code = VL_GetAddrsU(rxconnp, &attrs, &uuid, &unique, &nentries, &addrs);
- rx_PutConnection(rxconnp);
- } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, NULL, &cellp->vlServersp, NULL, code));
-
- if ( code ) {
- code = cm_MapVLRPCError(code, reqp);
- osi_Log2(afsd_logp, "CALL VL_GetAddrsU serverNumber %u FAILURE, code 0x%x",
- i, code);
- continue;
- }
- osi_Log1(afsd_logp, "CALL VL_GetAddrsU serverNumber %u SUCCESS", i);
-
- addrp = addrs.bulkaddrs_val;
- for (k = 0; k < nentries && j < NMAXNSERVERS; j++, k++) {
- serverFlags[j] = uvldbEntry.serverFlags[i];
- serverNumber[j] = addrp[k];
- serverUUID[j] = uuid;
- }
-
- xdr_free((xdrproc_t) xdr_bulkaddrs, &addrs);
-
- if (nentries == 0)
- code = CM_ERROR_INVAL;
+ code = cm_GetAddrsU(cellp, userp, reqp,
+ &uvldbEntry.serverNumber[i],
+ uvldbEntry.serverUnique[i],
+ uvldbEntry.serverFlags[i], &j,
+ serverFlags, serverNumber,
+ serverUUID, serverUnique);
+ if (code == CM_ERROR_RETRY)
+ continue;
}
}
nServers = j; /* update the server count */
volp->vol[BACKVOL].state = bkNewstate;
}
- volp->lastUpdateTime = time(NULL);
+ if (code == 0 || (volp->flags & CM_VOLUMEFLAG_NOEXIST))
+ volp->lastUpdateTime = time(NULL);
+
if (isMixed)
_InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RO_MIXED);
else
code = cm_GetSCache(&vfid, NULL, &vscp, cm_rootUserp, &req);
if (code = 0) {
- lock_ObtainWrite(&vscp->rw);
- code = cm_SyncOp(vscp, NULL, cm_rootUserp, &req, PRSFS_READ,
- CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- lock_ReleaseWrite(&vscp->rw);
- if (code == 0) {
- do {
- code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
- if (code)
- continue;
-
- rxconnp = cm_GetRxConn(connp);
- code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
- &volStat, &Name, &OfflineMsg, &MOTD);
- rx_PutConnection(rxconnp);
- } while (cm_Analyze(connp, cm_rootUserp, &req, &vfid, NULL, 0, NULL, NULL, NULL, NULL, code));
- code = cm_MapRPCError(code, &req);
-
- if (code == 0 && volType == ROVOL)
- {
-
- lock_ObtainWrite(&volp->rw);
- volp->volumeSizeRO = volStat.BlocksInUse * 1024;
- _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RO_SIZE_VALID);
- lock_ReleaseWrite(&volp->rw);
- }
- }
-
- lock_ObtainWrite(&vscp->rw);
- cm_SyncOpDone(vscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- lock_ReleaseWrite(&vscp->rw);
- cm_ReleaseSCache(vscp);
+ do {
+ code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
+ if (code)
+ continue;
+
+ rxconnp = cm_GetRxConn(connp);
+ code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
+ &volStat, &Name, &OfflineMsg, &MOTD);
+ rx_PutConnection(rxconnp);
+ } while (cm_Analyze(connp, cm_rootUserp, &req, &vfid, NULL, 0, NULL, NULL, NULL, NULL, code));
+ code = cm_MapRPCError(code, &req);
+
+ if (code == 0 && volType == ROVOL)
+ {
+ lock_ObtainWrite(&volp->rw);
+ volp->volumeSizeRO = volStat.BlocksInUse * 1024;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RO_SIZE_VALID);
+ lock_ReleaseWrite(&volp->rw);
+ }
+
+ cm_ReleaseSCache(vscp);
}
lock_ObtainWrite(&volp->rw);
if (code == 0 && volStat.Online) {