afs_uint32 volType;
lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock", LOCK_HIERARCHY_VOLUME);
- volp->flags |= CM_VOLUMEFLAG_RESET;
- volp->flags &= ~CM_VOLUMEFLAG_UPDATING_VL;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET);
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_UPDATING_VL);
for (volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {
volp->vol[volType].state = vl_unknown;
volp->vol[volType].serversp = NULL;
}
}
- volp->flags |= CM_VOLUMEFLAG_UPDATING_VL;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_UPDATING_VL);
lock_ReleaseWrite(&volp->rw);
if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID)
}
if (flags & VLF_DFSFILESET) {
- volp->flags |= CM_VOLUMEFLAG_DFS_VOLUME;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_DFS_VOLUME);
osi_Log1(afsd_logp, "cm_UpdateVolume Volume Group '%s' is a DFS File Set. Correct behavior is not implemented.",
osi_LogSaveString(afsd_logp, volp->namep));
}
tsockAddr.sin_family = AF_INET;
tempAddr = htonl(serverNumber[i]);
tsockAddr.sin_addr.s_addr = tempAddr;
- tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
+ tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE, FALSE);
+#ifdef MULTIHOMED
if (tsp && (method == 2) && (tsp->flags & CM_SERVERFLAG_UUID)) {
/*
* Check to see if the uuid of the server we know at this address
osi_LogSaveString(afsd_logp, hoststr));
}
}
+#endif
if (!tsp) {
/*
* cm_NewServer will probe the file server which in turn will
if ( (method == 2) && !(tsp->flags & CM_SERVERFLAG_UUID) &&
!afs_uuid_is_nil(&serverUUID[i])) {
tsp->uuid = serverUUID[i];
- tsp->flags |= CM_SERVERFLAG_UUID;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
}
/* and add it to the list(s). */
if ((tflags & VLSF_RWVOL) && (flags & VLF_RWEXISTS)) {
tsrp = cm_NewServerRef(tsp, rwID);
cm_InsertServerList(&volp->vol[RWVOL].serversp, tsrp);
-
- lock_ObtainWrite(&cm_serverLock);
- tsrp->refCount--; /* drop allocation reference */
- lock_ReleaseWrite(&cm_serverLock);
-
if (!(tsp->flags & CM_SERVERFLAG_DOWN))
rwServers_alldown = 0;
}
if ((tflags & VLSF_ROVOL) && (flags & VLF_ROEXISTS)) {
tsrp = cm_NewServerRef(tsp, roID);
cm_InsertServerList(&volp->vol[ROVOL].serversp, tsrp);
- lock_ObtainWrite(&cm_serverLock);
- tsrp->refCount--; /* drop allocation reference */
- lock_ReleaseWrite(&cm_serverLock);
ROcount++;
if (!(tsp->flags & CM_SERVERFLAG_DOWN))
if ((tflags & VLSF_RWVOL) && (flags & VLF_BACKEXISTS)) {
tsrp = cm_NewServerRef(tsp, bkID);
cm_InsertServerList(&volp->vol[BACKVOL].serversp, tsrp);
- lock_ObtainWrite(&cm_serverLock);
- tsrp->refCount--; /* drop allocation reference */
- lock_ReleaseWrite(&cm_serverLock);
if (!(tsp->flags & CM_SERVERFLAG_DOWN))
bkServers_alldown = 0;
roNewstate = roServers_alldown ? vl_alldown : vl_online;
bkNewstate = bkServers_alldown ? vl_alldown : vl_online;
- volp->flags &= ~CM_VOLUMEFLAG_NOEXIST;
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_NOEXIST);
} else if (code == CM_ERROR_NOSUCHVOLUME || code == VL_NOENT || code == VL_BADNAME) {
- volp->flags |= CM_VOLUMEFLAG_NOEXIST;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_NOEXIST);
} else {
rwNewstate = roNewstate = bkNewstate = vl_alldown;
}
volp->lastUpdateTime = time(NULL);
if (code == 0)
- volp->flags &= ~CM_VOLUMEFLAG_RESET;
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_RESET);
- volp->flags &= ~CM_VOLUMEFLAG_UPDATING_VL;
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_UPDATING_VL);
osi_Log4(afsd_logp, "cm_UpdateVolumeLocation done, waking others name %s:%s flags 0x%x code 0x%x",
osi_LogSaveString(afsd_logp,volp->cellp->name),
osi_LogSaveString(afsd_logp,volp->namep), volp->flags, code);
/* update it */
cm_data.mountRootGen = time(NULL);
lock_ObtainWrite(&volp->rw);
- volp->flags |= CM_VOLUMEFLAG_RESET;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET);
code = cm_UpdateVolumeLocation(cellp, userp, reqp, volp);
lock_ReleaseWrite(&volp->rw);
afs_int32 code;
firstTry = 0;
lock_ObtainWrite(&volp->rw);
- volp->flags |= CM_VOLUMEFLAG_RESET;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET);
code = cm_UpdateVolumeLocation(volp->cellp, userp, reqp, volp);
lock_ReleaseWrite(&volp->rw);
if (code == 0)
* They will be freed by cm_FreeServerList when they get to zero
*/
for (current = *serverspp; current; current = current->next)
- current->refCount++;
+ cm_GetServerRef(current, TRUE);
lock_ReleaseWrite(&cm_serverLock);
if (!(volp->flags & CM_VOLUMEFLAG_RESET)) {
lock_ObtainWrite(&volp->rw);
if (volp->lastUpdateTime + lifetime <= now)
- volp->flags |= CM_VOLUMEFLAG_RESET;
+ _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET);
lock_ReleaseWrite(&volp->rw);
}
*volumeUpdatedp = 1;
}
+ lock_ObtainRead(&cm_serverLock);
if (statep->serversp) {
alldown = 1;
alldeleted = 1;
if (serversp->status == srv_busy || serversp->status == srv_offline)
serversp->status = srv_not_busy;
}
+ lock_ReleaseRead(&cm_serverLock);
if (alldeleted && !(*volumeUpdatedp)) {
cm_InitReq(&req);
cm_VolumeStatusNotification(volp, statep->ID, statep->state, vl_alldown);
statep->state = vl_alldown;
}
- } else if (statep->state != vl_alldown) {
- cm_VolumeStatusNotification(volp, statep->ID, statep->state, vl_alldown);
- statep->state = vl_alldown;
+ } else {
+ lock_ReleaseRead(&cm_serverLock);
+ if (statep->state != vl_alldown) {
+ cm_VolumeStatusNotification(volp, statep->ID, statep->state, vl_alldown);
+ statep->state = vl_alldown;
+ }
}
}
}
volp->nameNextp = cm_data.volumeNameHashTablep[i];
cm_data.volumeNameHashTablep[i] = volp;
- volp->qflags |= CM_VOLUME_QFLAG_IN_HASH;
+ _InterlockedOr(&volp->qflags, CM_VOLUME_QFLAG_IN_HASH);
}
/* call with volume write-locked and mutex held */
lvolpp = &tvolp->nameNextp, tvolp = tvolp->nameNextp) {
if (tvolp == volp) {
*lvolpp = volp->nameNextp;
- volp->qflags &= ~CM_VOLUME_QFLAG_IN_HASH;
+ _InterlockedAnd(&volp->qflags, ~CM_VOLUME_QFLAG_IN_HASH);
volp->nameNextp = NULL;
break;
}
cm_data.volumeBKIDHashTablep[i] = volp;
break;
}
- statep->qflags |= CM_VOLUME_QFLAG_IN_HASH;
+ _InterlockedOr(&statep->qflags, CM_VOLUME_QFLAG_IN_HASH);
}
do {
if (tvolp == volp) {
*lvolpp = statep->nextp;
- statep->qflags &= ~CM_VOLUME_QFLAG_IN_HASH;
+ _InterlockedAnd(&statep->qflags, ~CM_VOLUME_QFLAG_IN_HASH);
statep->nextp = NULL;
break;
}
if (volp->qflags & CM_VOLUME_QFLAG_IN_LRU_QUEUE)
osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
osi_QAddH((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
- volp->qflags |= CM_VOLUME_QFLAG_IN_LRU_QUEUE;
+ _InterlockedOr(&volp->qflags, CM_VOLUME_QFLAG_IN_LRU_QUEUE);
osi_assertx(cm_data.volumeLRULastp != NULL, "null cm_data.volumeLRULastp");
}
if (volp->qflags & CM_VOLUME_QFLAG_IN_LRU_QUEUE)
osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
osi_QAddT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
- volp->qflags |= CM_VOLUME_QFLAG_IN_LRU_QUEUE;
+ _InterlockedOr(&volp->qflags, CM_VOLUME_QFLAG_IN_LRU_QUEUE);
osi_assertx(cm_data.volumeLRULastp != NULL, "null cm_data.volumeLRULastp");
}
if (volp->qflags & CM_VOLUME_QFLAG_IN_LRU_QUEUE) {
osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
- volp->qflags &= ~CM_VOLUME_QFLAG_IN_LRU_QUEUE;
+ _InterlockedAnd(&volp->qflags, ~CM_VOLUME_QFLAG_IN_LRU_QUEUE);
}
osi_assertx(cm_data.volumeLRULastp != NULL, "null cm_data.volumeLRULastp");