Windows: reset volume NOEXIST flag
authorJeffrey Altman <jaltman@your-file-system.com>
Mon, 13 Aug 2012 02:51:54 +0000 (22:51 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Tue, 14 Aug 2012 04:00:55 +0000 (21:00 -0700)
In response to fs checkvolumes the NOEXIST flag should be reset.

It should also be reset if the volume location update fails
because of a commumicaton (or other) error with the VLDB server.
The volume's lastUpdateTime is refreshed on error.

Change-Id: I0bb5e61b9eb8a9613d47a32acda35b79aa71c293
Reviewed-on: http://gerrit.openafs.org/7969
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsd/cm_volume.c

index 66692a4..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);