* 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;
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;
}
}
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_ */
} 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 {
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);
}
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);
}
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);