_InterlockedOr(&volp->flags, CM_VOLUMEFLAG_NOEXIST);
} else {
rwNewstate = roNewstate = bkNewstate = vl_alldown;
+
+ /*
+ * we are updating lastUpdateTime but didn't get an answer
+ * so clear the no exist flag.
+ */
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_NOEXIST);
}
if (volp->vol[RWVOL].state != rwNewstate) {
InterlockedIncrement(&volp->refCount);
lock_ReleaseRead(&cm_volumeLock);
- if (!(volp->flags & CM_VOLUMEFLAG_RESET)) {
+ if (!(volp->flags & CM_VOLUMEFLAG_RESET) ||
+ (volp->flags & CM_VOLUMEFLAG_NOEXIST)) {
lock_ObtainWrite(&volp->rw);
+ if (volp->flags & CM_VOLUMEFLAG_NOEXIST) {
+ _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_NOEXIST);
+ }
+
if (volp->flags & CM_VOLUMEFLAG_RO_MIXED) {
if (volp->lastUpdateTime + 300 <= now) {
_InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET);
}
return cksum;
}
+
+afs_int32
+cm_IsVolumeReplicated(cm_fid_t *fidp)
+{
+ afs_int32 replicated = 0;
+ cm_volume_t *volp;
+ cm_vol_state_t * volstatep;
+
+ volp = cm_GetVolumeByFID(fidp);
+ if (volp) {
+ volstatep = cm_VolumeStateByID(volp, fidp->volume);
+ replicated = (volstatep->flags & CM_VOL_STATE_FLAG_REPLICATED);
+ cm_PutVolume(volp);
+ }
+
+ return replicated;
+}