lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock");
volp->flags |= CM_VOLUMEFLAG_RESET;
- volp->flags &= CM_VOLUMEFLAG_UPDATING_VL;
+ 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;
tempAddr = htonl(serverNumber[i]);
tsockAddr.sin_addr.s_addr = tempAddr;
tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
- if (!tsp)
- tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE,
- cellp, 0);
-
+ if (!tsp) {
+ /* cm_NewServer will probe the server which in turn will
+ * update the state on the volume group object */
+ lock_ReleaseWrite(&volp->rw);
+ tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE, cellp, 0);
+ lock_ObtainWrite(&volp->rw);
+ }
/* if this server was created by fs setserverprefs */
if ( !tsp->cellp )
tsp->cellp = cellp;
afs_uint32 volType;
/* otherwise, get from VLDB */
+ /*
+ * Change to a write lock so that we have exclusive use of
+ * the first cm_volume_t with a refCount of 0 so that we
+ * have time to increment it.
+ */
+ lock_ConvertRToW(&cm_volumeLock);
+
if ( cm_data.currentVolumes >= cm_data.maxVolumes ) {
#ifdef RECYCLE_FROM_ALL_VOLUMES_LIST
for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
if (!volp)
osi_panic("Exceeded Max Volumes", __FILE__, __LINE__);
- lock_ReleaseRead(&cm_volumeLock);
+ InterlockedIncrement(&volp->refCount);
+ lock_ReleaseWrite(&cm_volumeLock);
lock_ObtainWrite(&volp->rw);
lock_ObtainWrite(&cm_volumeLock);
volp->allNextp = cm_data.allVolumesp;
cm_data.allVolumesp = volp;
lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock");
- lock_ReleaseRead(&cm_volumeLock);
+ lock_ReleaseWrite(&cm_volumeLock);
lock_ObtainWrite(&volp->rw);
lock_ObtainWrite(&cm_volumeLock);
+ volp->refCount = 1; /* starts off held */
}
volp->cellp = cellp;
strncpy(volp->namep, name, VL_MAXNAMELEN);
volp->namep[VL_MAXNAMELEN-1] = '\0';
- volp->refCount = 1; /* starts off held */
volp->flags = CM_VOLUMEFLAG_RESET;
for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) {