if (cellp == NULL && serversp) {
struct cm_serverRef * refp;
for ( refp=serversp ; cellp == NULL && refp != NULL; refp=refp->next) {
+ if (refp->status == srv_deleted)
+ continue;
if ( refp->server )
cellp = refp->server->cellp;
}
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
if (tsrp->status == srv_busy) {
tsrp->status = srv_not_busy;
}
lock_ReleaseWrite(&cm_serverLock);
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
- *serverspp = serversp;
+ *serverspp = serversp = NULL;
+ free_svr_list = 0;
}
cm_UpdateVolumeStatus(volp, fidp->volume);
if (serversp) {
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
if (tsrp->status == srv_busy) {
tsrp->status = srv_not_busy;
}
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
if (tsrp->server == serverp && tsrp->status == srv_not_busy) {
tsrp->status = srv_busy;
if (fidp) { /* File Server query */
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
- *serverspp = serversp;
+ *serverspp = serversp = NULL;
+ free_svr_list = 0;
}
retry = 1;
}
if (!serversp && fidp) {
code = cm_GetServerList(fidp, userp, reqp, &serverspp);
if (code == 0) {
- serversp = *serverspp;
+ serversp = *serverspp = NULL;
free_svr_list = 1;
}
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
if (tsrp->server == serverp) {
/* REDIRECT */
if (errorCode == VMOVED || errorCode == VNOVOL) {
} else {
tsrp->status = srv_offline;
}
-
- if (fidp) { /* File Server query */
- lock_ReleaseWrite(&cm_serverLock);
- code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
- CM_GETVOL_FLAG_NO_LRU_UPDATE,
- &volp);
- if (code == 0)
- cm_VolumeStateByID(volp, fidp->volume);
- lock_ObtainWrite(&cm_serverLock);
- }
}
}
lock_ReleaseWrite(&cm_serverLock);
- if (fidp && (errorCode == VMOVED || errorCode == VNOVOL)) {
- code = cm_ForceUpdateVolume(fidp, userp, reqp);
- if (code)
- timeLeft = 0; /* prevent a retry on failure */
+ /* Free the server list before cm_ForceUpdateVolume is called */
+ if (free_svr_list) {
+ cm_FreeServerList(&serversp, 0);
+ *serverspp = serversp = NULL;
+ free_svr_list = 0;
}
- if (statep) {
- cm_UpdateVolumeStatus(volp, statep->ID);
- lock_ObtainRead(&cm_volumeLock);
- cm_PutVolume(volp);
- lock_ReleaseRead(&cm_volumeLock);
- volp = NULL;
- }
+ if (fidp) { /* File Server query */
+ code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
+ CM_GETVOL_FLAG_NO_LRU_UPDATE,
+ &volp);
+ if (code == 0)
+ statep = cm_VolumeStateByID(volp, fidp->volume);
+
+ if (errorCode == VMOVED || errorCode == VNOVOL) {
+ code = cm_ForceUpdateVolume(fidp, userp, reqp);
+ if (code)
+ timeLeft = 0; /* prevent a retry on failure */
+ osi_Log3(afsd_logp, "cm_Analyze called cm_ForceUpdateVolume cell %u vol %u code 0x%x",
+ fidp->cell, fidp->volume, code);
+ }
- if (free_svr_list) {
- cm_FreeServerList(&serversp, 0);
- *serverspp = serversp;
+ if (statep) {
+ cm_UpdateVolumeStatus(volp, statep->ID);
+ osi_Log3(afsd_logp, "cm_Analyze NewVolState cell %u vol %u state %u",
+ fidp->cell, fidp->volume, statep->state);
+ }
+
+ if (volp) {
+ lock_ObtainRead(&cm_volumeLock);
+ cm_PutVolume(volp);
+ lock_ReleaseRead(&cm_volumeLock);
+ volp = NULL;
+ }
}
+
if ( timeLeft > 2 )
retry = 1;
} else if ( errorCode == VNOVNODE ) {
lock_ObtainRead(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
+
tsp = tsrp->server;
if (reqp->tokenIdleErrorServp) {
/*
if (tsp) {
cm_GetServerNoLock(tsp);
lock_ReleaseRead(&cm_serverLock);
- if ((tsrp->status != srv_deleted) && !(tsp->flags & CM_SERVERFLAG_DOWN)) {
+ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
allDown = 0;
if (tsrp->status == srv_busy) {
allOffline = 0;
lock_ObtainRead(&cm_serverLock);
for (tsrp = *serverspp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
tsp = tsrp->server;
- if ((tsrp->status != srv_deleted) && !(tsp->flags & CM_SERVERFLAG_DOWN)) {
+ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
allDown = 0;
if (tsrp->status == srv_busy) {
allOffline = 0;
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);
+ osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s",
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,volp->namep));
do {
struct rx_connection * rxconnp;
code = cm_MapVLRPCError(code, reqp);
if ( code )
osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x",
- volp->cellp->name, volp->namep, code);
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,volp->namep), code);
else
osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS",
- volp->cellp->name, volp->namep);
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,volp->namep));
}
/* We can end up here with code == CM_ERROR_NOSUCHVOLUME if the base volume name
snprintf(name, VL_MAXNAMELEN, "%s.readonly", volp->namep);
/* 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,
+ osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s",
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
osi_LogSaveString(afsd_logp,name));
do {
struct rx_connection * rxconnp;
code = cm_MapVLRPCError(code, reqp);
if ( code )
osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x",
- volp->cellp->name, osi_LogSaveString(afsd_logp,name), code);
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,name), code);
else
osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS",
- volp->cellp->name, osi_LogSaveString(afsd_logp,name));
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,name));
}
lock_ObtainWrite(&volp->rw);
name[len - 9] = '\0';
}
- osi_Log2(afsd_logp, "cm_UpdateVolume name %s -> %s", volp->namep, name);
+ osi_Log2(afsd_logp, "cm_UpdateVolume name %s -> %s",
+ osi_LogSaveString(afsd_logp,volp->namep), osi_LogSaveString(afsd_logp,name));
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
cm_RemoveVolumeFromNameHashTable(volp);
cm_RandomizeServer(&volp->vol[ROVOL].serversp);
}
+
rwNewstate = rwServers_alldown ? vl_alldown : vl_online;
roNewstate = roServers_alldown ? vl_alldown : vl_online;
bkNewstate = bkServers_alldown ? vl_alldown : vl_online;
volp->flags &= ~CM_VOLUMEFLAG_UPDATING_VL;
osi_Log4(afsd_logp, "cm_UpdateVolumeLocation done, waking others name %s:%s flags 0x%x code 0x%x",
- volp->cellp->name, volp->namep, volp->flags, code);
+ osi_LogSaveString(afsd_logp,volp->cellp->name),
+ osi_LogSaveString(afsd_logp,volp->namep), volp->flags, code);
osi_Wakeup((LONG_PTR) &volp->flags);
return code;
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_unknown);
volp->vol[volType].ID = 0;
cm_SetFid(&volp->vol[volType].dotdotFid, 0, 0, 0, 0);
+ cm_FreeServerList(&volp->vol[volType].serversp, CM_FREESERVERLIST_DELETE);
}
} else {
volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++];
cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume)
{
cm_serverRef_t **serverspp;
- cm_serverRef_t *current;;
+ cm_serverRef_t *current;
lock_ObtainWrite(&cm_serverLock);
else
osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__);
- for (current = *serverspp; current; current = current->next)
+ /*
+ * Increment the refCount on deleted items as well.
+ * They will be freed by cm_FreeServerList when they get to zero
+ */
+ for (current = *serverspp; current; current = current->next)
current->refCount++;
lock_ReleaseWrite(&cm_serverLock);
alldown = 1;
alldeleted = 1;
for (serversp = statep->serversp; serversp; serversp = serversp->next) {
- if (serversp->status != srv_deleted) {
- alldeleted = 0;
- *onlinep = 1;
- alldown = 0;
- }
- if (serversp->status == srv_busy || serversp->status == srv_offline)
+ if (serversp->status == srv_deleted)
+ continue;
+
+ alldeleted = 0;
+ *onlinep = 1;
+ alldown = 0;
+
+ if (serversp->status == srv_busy || serversp->status == srv_offline)
serversp->status = srv_not_busy;
}
lock_ObtainWrite(&cm_serverLock);
for (tsrp = statep->serversp; tsrp; tsrp=tsrp->next) {
+ if (tsrp->status == srv_deleted)
+ continue;
tsp = tsrp->server;
if (tsp) {
cm_GetServerNoLock(tsp);