From 165c9e7465378f26db546c5f78fc4eeca0ba094a Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 12 Aug 2012 22:51:54 -0400 Subject: [PATCH] Windows: reset volume NOEXIST flag 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 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_volume.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 66692a4f30..644d07a31d 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -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);