long code;
cm_volume_t *volp = NULL;
cm_serverRef_t *serversp = NULL;
- cm_serverRef_t *newServersp = NULL;
cm_cell_t *cellp = NULL;
if (!fidp) {
code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp);
if (code) return code;
- lock_ObtainMutex(&volp->mx);
if (fidp->volume == volp->rwID)
serversp = volp->rwServersp;
else if (fidp->volume == volp->roID)
else
serversp = NULL;
- /* make a copy of the server list because by the time the
- caller tries to use it, it might have been freed.
- Preserve server order. */
- if(serversp) {
- cm_serverRef_t ** nl;
- cm_serverRef_t * tref;
-
- nl = &newServersp;
-
- lock_ObtainWrite(&cm_serverLock);
- while(serversp) {
-
- tref = malloc(sizeof(cm_serverRef_t));
- tref->next = NULL;
- tref->server = serversp->server;
- tref->status = serversp->status;
-
- tref->server->refCount++;
-
- *nl = tref;
- nl = &tref->next;
-
- serversp = serversp->next;
- }
- lock_ReleaseWrite(&cm_serverLock);
- }
- lock_ReleaseMutex(&volp->mx);
-
cm_PutVolume(volp);
- *serverspp = newServersp;
+ *serverspp = serversp;
return 0;
}
retry = 1;
}
- cm_FreeServerList(&serversp);
if (fidp != NULL) /* Not a VLDB call */
cm_ForceUpdateVolume(fidp, userp, reqp);
tsrp->status = not_busy;
}
lock_ReleaseWrite(&cm_serverLock);
- cm_FreeServerList(&serversp);
thrd_Sleep(5000);
retry = 1;
}
}
}
lock_ReleaseWrite(&cm_serverLock);
- cm_FreeServerList(&serversp);
retry = 1;
}
/* Mark server offline for this volume */
cm_GetServerList(fidp, userp, reqp, &serversp);
+
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->server == serverp)
tsrp->status = offline;
}
- cm_FreeServerList(&serversp);
retry = 1;
}
}
code = cm_ConnByMServers(serversp, userp, reqp, connpp);
- cm_FreeServerList(&serversp);
return code;
}