From a520fbe9550bd9b7e8f4140709cc78a98e361be7 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 15 Feb 2008 03:31:36 +0000 Subject: [PATCH] DEVEL15-windows-check-offline-volumes-20080214 LICENSE MIT when checking offline volumes, update the cell vlserver info if required and don't perform a check if there are no servers in the list. (cherry picked from commit 935c49a2a6efa476c327e8a24fc4895f0c8f623d) --- src/WINNT/afsd/cm_cell.c | 3 ++- src/WINNT/afsd/cm_cell.h | 2 ++ src/WINNT/afsd/cm_volume.c | 13 +++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index f3eb9cc0b..ead30d39b 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -71,7 +71,7 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep) * and check to make sure we have a valid set of volume servers * this function must be called with a Write Lock on cm_cellLock */ -static cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags) +cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags) { long code = 0; cm_cell_rock_t rock; @@ -405,6 +405,7 @@ void cm_InitCell(int newFile, long maxCells) for (cellp = cm_data.allCellsp; cellp; cellp=cellp->allNextp) { lock_InitializeMutex(&cellp->mx, "cm_cell_t mutex"); cellp->vlServersp = NULL; + cellp->flags |= CM_CELLFLAG_VLSERVER_INVALID; } } diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h index 2471ea265..659843a25 100644 --- a/src/WINNT/afsd/cm_cell.h +++ b/src/WINNT/afsd/cm_cell.h @@ -72,4 +72,6 @@ extern void cm_AddCellToIDHashTable(cm_cell_t * cellp); extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); +extern cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags); + #endif /* __CELL_H_ENV_ */ diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index a7f5682b4..3dc6beb1b 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -213,6 +213,9 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, } else #endif { + if (cellp->flags & CM_CELLFLAG_VLSERVER_INVALID) + cm_UpdateCell(cellp, 0); + /* now we have volume structure locked and held; make RPC to fill it */ osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s", volp->cellp->name, volp->namep); do { @@ -1013,7 +1016,15 @@ cm_CheckOfflineVolume(cm_volume_t *volp, afs_uint32 volID) lock_ObtainMutex(&volp->mx); + if (volp->flags & CM_VOLUMEFLAG_RESET) { + cm_InitReq(&req); + code = cm_UpdateVolume(volp->cellp, cm_rootUserp, &req, volp); + if (code == 0) + volp->flags &= ~CM_VOLUMEFLAG_RESET; + } + if (volp->rw.ID != 0 && (!volID || volID == volp->rw.ID) && + volp->rw.serversp && (volp->rw.state == vl_busy || volp->rw.state == vl_offline || volp->rw.state == vl_unknown)) { cm_InitReq(&req); @@ -1049,6 +1060,7 @@ cm_CheckOfflineVolume(cm_volume_t *volp, afs_uint32 volID) } if (volp->ro.ID != 0 && (!volID || volID == volp->ro.ID) && + volp->ro.serversp && (volp->ro.state == vl_busy || volp->ro.state == vl_offline || volp->ro.state == vl_unknown)) { cm_InitReq(&req); @@ -1084,6 +1096,7 @@ cm_CheckOfflineVolume(cm_volume_t *volp, afs_uint32 volID) } if (volp->bk.ID != 0 && (!volID || volID == volp->bk.ID) && + volp->bk.serversp && (volp->bk.state == vl_busy || volp->bk.state == vl_offline || volp->bk.state == vl_unknown)) { cm_InitReq(&req); -- 2.39.5