{
long code;
cm_volume_t *volp = NULL;
- cm_vol_state_t *volstatep = NULL;
cm_cell_t *cellp = NULL;
if (!fidp) {
if (code)
return code;
- volstatep = cm_VolumeStateByID(volp, fidp->volume);
- *replicated = (volstatep->flags & CM_VOL_STATE_FLAG_REPLICATED);
- *serversppp = cm_GetVolServers(volp, fidp->volume, userp, reqp);
+ *serversppp = cm_GetVolServers(volp, fidp->volume, userp, reqp, replicated);
lock_ObtainRead(&cm_volumeLock);
cm_PutVolume(volp);
long code;
cm_serverRef_t **serverspp;
afs_uint32 replicated;
- cm_vol_state_t * volstatep;
*connpp = NULL;
- volstatep = cm_VolumeStateByID(volp, volid);
- replicated = (volstatep->flags & CM_VOL_STATE_FLAG_REPLICATED);
- serverspp = cm_GetVolServers(volp, volid, userp, reqp);
+ serverspp = cm_GetVolServers(volp, volid, userp, reqp, &replicated);
code = cm_ConnByMServers(*serverspp, replicated, userp, reqp, connpp);
cm_FreeServerList(serverspp, 0);
cp = ioctlp->outDatap;
- tsrpp = cm_GetVolServers(tvp, volume, userp, reqp);
+ tsrpp = cm_GetVolServers(tvp, volume, userp, reqp, NULL);
if (tsrpp == NULL) {
code = CM_ERROR_NOSUCHVOLUME;
} else {
}
/* find the appropriate servers from a volume */
-cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume, cm_user_t *userp, cm_req_t *reqp)
+cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volid, cm_user_t *userp, cm_req_t *reqp, afs_uint32 *replicated)
{
cm_serverRef_t **serverspp;
cm_serverRef_t *current;
int firstTry = 1;
+ cm_vol_state_t *volstatep = NULL;
start:
- lock_ObtainWrite(&cm_serverLock);
+ volstatep = cm_VolumeStateByID(volp, volid);
- if (volume == volp->vol[RWVOL].ID)
- serverspp = &volp->vol[RWVOL].serversp;
- else if (volume == volp->vol[ROVOL].ID)
- serverspp = &volp->vol[ROVOL].serversp;
- else if (volume == volp->vol[BACKVOL].ID)
- serverspp = &volp->vol[BACKVOL].serversp;
- else {
+ lock_ObtainWrite(&cm_serverLock);
+ if (volstatep) {
+ if (replicated)
+ *replicated = (volstatep->flags & CM_VOL_STATE_FLAG_REPLICATED);
+ serverspp = &volstatep->serversp;
+ } else {
lock_ReleaseWrite(&cm_serverLock);
if (firstTry) {
afs_int32 code;
cm_req_t *reqp);
extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume,
- cm_user_t *userp, cm_req_t *reqp);
+ cm_user_t *userp, cm_req_t *reqp, afs_uint32 *replicated);
extern void cm_ChangeRankVolume(cm_server_t *tsp);