cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown);
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
lock_FinalizeRWLock(&volp->rw);
}
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, vl_unknown, volp->vol[volType].state);
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
}
}
osi_EndOnce(&once);
cm_AddVolumeToNameHashTable(volp);
}
+ if (flags & VLF_DFSFILESET) {
+ 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));
+ }
+
if (flags & VLF_RWEXISTS) {
if (volp->vol[RWVOL].ID != rwID) {
if (volp->vol[RWVOL].flags & CM_VOLUMEFLAG_IN_HASH)
volp->vol[volType].flags = 0;
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
}
-/* called from the Daemon thread */
+/*
+ * called from the Daemon thread.
+ * when checking the offline status, check those of the most recently used volumes first.
+ */
void cm_CheckOfflineVolumes(void)
{
cm_volume_t *volp;
afs_int32 refCount;
+ extern int daemon_ShutdownFlag;
+ extern int powerStateSuspended;
lock_ObtainRead(&cm_volumeLock);
- for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
+ for (volp = cm_data.volumeLRULastp;
+ volp && !daemon_ShutdownFlag && !powerStateSuspended;
+ volp=(cm_volume_t *) osi_QPrev(&volp->q)) {
if (volp->flags & CM_VOLUMEFLAG_IN_HASH) {
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
allBusy = 0;
}
} else {
- osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s online",
+ osi_Log2(afsd_logp, "cm_UpdateVolumeStatusInt volume %d server reference %s down",
statep->ID, osi_LogSaveString(afsd_logp,addr));
}
cm_PutServerNoLock(tsp);