DEVEL15-windows-check-offline-volumes-20080214
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 15 Feb 2008 03:31:36 +0000 (03:31 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 15 Feb 2008 03:31:36 +0000 (03:31 +0000)
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
src/WINNT/afsd/cm_cell.h
src/WINNT/afsd/cm_volume.c

index f3eb9cc..ead30d3 100644 (file)
@@ -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;
             }
         }
 
index 2471ea2..659843a 100644 (file)
@@ -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_ */
index a7f5682..3dc6beb 100644 (file)
@@ -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);