From cd465d19ac1f9583cd3519c916502e2e960355e6 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 10 Aug 2011 11:41:21 -0400 Subject: [PATCH] Windows: Interlocked ops for cm_volume Use Interlocked operations for protection of cm_volume flags and qFlags as well as cm_vol_state flags. Reviewed-on: http://gerrit.openafs.org/5194 Tested-by: BuildBot Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit cbd075a36000d0b54b64eb7d9736587b27a08e9e) Change-Id: Ib2b11cbadcbdbc244866d6bf90ab4d55ef589819 Reviewed-on: http://gerrit.openafs.org/5215 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/WINNT/afsd/cm_volume.c | 36 ++++++++++++++++++------------------ src/WINNT/afsd/cm_volume.h | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 46061069e..b57426585 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -102,8 +102,8 @@ void cm_InitVolume(int newFile, long maxVols) 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; @@ -230,7 +230,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * } } - volp->flags |= CM_VOLUMEFLAG_UPDATING_VL; + _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_UPDATING_VL); lock_ReleaseWrite(&volp->rw); if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID) @@ -469,7 +469,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * } 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)); } @@ -633,9 +633,9 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * 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; } @@ -659,9 +659,9 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * 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); @@ -1080,7 +1080,7 @@ long cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp) /* 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); @@ -1114,7 +1114,7 @@ cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume, cm_user_ 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) @@ -1182,7 +1182,7 @@ void cm_RefreshVolumes(int lifetime) 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); } @@ -1601,7 +1601,7 @@ void cm_AddVolumeToNameHashTable(cm_volume_t *volp) 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 */ @@ -1619,7 +1619,7 @@ void cm_RemoveVolumeFromNameHashTable(cm_volume_t *volp) 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; } @@ -1654,7 +1654,7 @@ void cm_AddVolumeToIDHashTable(cm_volume_t *volp, afs_uint32 volType) cm_data.volumeBKIDHashTablep[i] = volp; break; } - statep->qflags |= CM_VOLUME_QFLAG_IN_HASH; + _InterlockedOr(&statep->qflags, CM_VOLUME_QFLAG_IN_HASH); } @@ -1691,7 +1691,7 @@ void cm_RemoveVolumeFromIDHashTable(cm_volume_t *volp, afs_uint32 volType) 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; } @@ -1713,7 +1713,7 @@ void cm_AdjustVolumeLRU(cm_volume_t *volp) 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"); } @@ -1729,7 +1729,7 @@ void cm_MoveVolumeToLRULast(cm_volume_t *volp) 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"); } @@ -1741,7 +1741,7 @@ void cm_RemoveVolumeFromLRU(cm_volume_t *volp) 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"); diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index 6b5a97c5f..ff0589abf 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -33,6 +33,7 @@ typedef struct cm_vol_state { typedef struct cm_volume { osi_queue_t q; /* LRU queue; cm_volumeLock */ + afs_uint32 qflags; /* by cm_volumeLock */ afs_uint32 magic; struct cm_volume *allNextp; /* allVolumes; by cm_volumeLock */ struct cm_volume *nameNextp; /* volumeNameHashTable; by cm_volumeLock */ @@ -41,8 +42,7 @@ typedef struct cm_volume { /* by cm_volumeLock */ struct cm_vol_state vol[NUM_VOL_TYPES]; /* by cm_volumeLock */ osi_rwlock_t rw; - afs_uint16 flags; /* by rw */ - afs_uint16 qflags; /* by cm_volumeLock */ + afs_uint32 flags; /* by rw */ afs_int32 refCount; /* by Interlocked operations */ struct cm_server *cbServerpRO; /* server granting RO callback; by cm_scacheLock */ time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */ -- 2.39.5