Windows: reset volume NOEXIST flag
[openafs.git] / src / WINNT / afsd / cm_volume.c
index 245f4c2..644d07a 100644 (file)
@@ -677,6 +677,12 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
         _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) {
@@ -1226,8 +1232,13 @@ void cm_RefreshVolumes(int lifetime)
        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);
@@ -1973,3 +1984,20 @@ cm_ChecksumVolumeServerList(struct cm_fid *fidp, cm_user_t *userp, cm_req_t *req
     }
     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;
+}