* at the appropriate times to change the pointers to these servers.
*/
typedef struct cm_server {
- struct cm_server *allNextp; /* locked by cm_serverLock */
+ struct cm_server *allNextp; /* locked by cm_serverLock */
struct sockaddr_in addr; /* by mx */
int type; /* by mx */
- struct cm_conn *connsp; /* locked by cm_connLock */
+ struct cm_conn *connsp; /* locked by cm_connLock */
long flags; /* by mx */
- struct cm_cell *cellp; /* cell containing this server */
- unsigned long refCount; /* locked by cm_serverLock */
- osi_mutex_t mx;
- unsigned short ipRank; /* server priority */
+ struct cm_cell *cellp; /* cell containing this server */
+ unsigned long refCount; /* locked by cm_serverLock */
+ osi_mutex_t mx;
+ unsigned short ipRank; /* server priority */
} cm_server_t;
enum repstate {not_busy, busy, offline};
* first, and fall back to successively older versions if you get
* RXGEN_OPCODE.
*/
+#define MULTIHOMED 1
long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
cm_volume_t *volp)
{
cm_conn_t *connp;
- int i;
+ int i, j, k;
cm_serverRef_t *tsrp;
cm_server_t *tsp;
struct sockaddr_in tsockAddr;
osi_Log1(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s", volp->namep);
#ifdef MULTIHOMED
code = VL_GetEntryByNameU(connp->callp, volp->namep, &uvldbEntry);
+ type = 2;
if ( code == RXGEN_OPCODE )
#endif
{
rwID = uvldbEntry.volumeId[0];
roID = uvldbEntry.volumeId[1];
bkID = uvldbEntry.volumeId[2];
- for ( i=0; i<nServers; i++ ) {
- serverFlags[i] = uvldbEntry.serverFlags[i];
- if ( !(flags & VLSERVER_FLAG_UUID) )
- serverNumber[i] = uvldbEntry.serverNumber[i].time_low;
- else {
- /* see afs/afs_volume.c InstallUVolumeEntry(). We need to
- * implement an equivalent to afs_FindServer() and afs_GetServer()
- * which support multiple addresses.
- */
+ for ( i=0, j=0; i<nServers && j<NMAXNSERVERS; i++ ) {
+ if ( !(uvldbEntry.serverFlags[i] & VLSERVER_FLAG_UUID) ) {
+ serverFlags[j] = uvldbEntry.serverFlags[i];
+ serverNumber[j] = uvldbEntry.serverNumber[i].time_low;
+ j++;
+ } else {
+ afs_uint32 * addrp, nentries, code, unique;
+ bulkaddrs addrs;
+ ListAddrByAttributes attrs;
+ afsUUID uuid;
+
+ memset((char *)&attrs, 0, sizeof(attrs));
+ attrs.Mask = VLADDR_UUID;
+ attrs.uuid = uvldbEntry.serverNumber[i];
+ memset((char *)&uuid, 0, sizeof(uuid));
+ memset((char *)&addrs, 0, sizeof(addrs));
+
+ do {
+ code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp);
+ if (code)
+ continue;
+
+ code = VL_GetAddrsU(connp->callp, &attrs, &uuid, &unique, &nentries, &addrs);
+
+ if (code == 0 && nentries == 0)
+ code = VL_NOENT;
+ } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code));
+ code = cm_MapVLRPCError(code, reqp);
+ if (code)
+ return code;
+
+ addrp = addrs.bulkaddrs_val;
+ for (k = 0; k < nentries && j < NMAXNSERVERS; j++, k++) {
+ serverFlags[j] = uvldbEntry.serverFlags[i];
+ serverNumber[j] = addrp[k];
+ }
+
+ free(addrs.bulkaddrs_val); /* This is wrong */
}
}
+ nServers = j; /* update the server count */
break;
#endif
}