From ef5686b1a11e1a6ba4590b09170306190d6c7393 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 5 Jul 2012 18:06:13 -0400 Subject: [PATCH] Windows: Modify cm_GetVolServers and cm_GetServerList Move the determination of the 'replicated' state into cm_GetVolServers() so that cm_GetServerList() and cm_ConnFromVolume() can be implemented without duplicating the resolution of the cm_vol_state_t object. Change-Id: I355cb2cdf7e327742df7936171ad3dc604f135df Reviewed-on: http://gerrit.openafs.org/7721 Reviewed-by: Chas Williams - CONTRACTOR Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_conn.c | 10 ++-------- src/WINNT/afsd/cm_ioctl.c | 2 +- src/WINNT/afsd/cm_volume.c | 18 +++++++++--------- src/WINNT/afsd/cm_volume.h | 2 +- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 0be99fcc0..7774c1671 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -215,7 +215,6 @@ long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp, { long code; cm_volume_t *volp = NULL; - cm_vol_state_t *volstatep = NULL; cm_cell_t *cellp = NULL; if (!fidp) { @@ -231,9 +230,7 @@ long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp, 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); @@ -1702,13 +1699,10 @@ long cm_ConnFromVolume(struct cm_volume *volp, unsigned long volid, struct cm_us 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); diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 990ebfcaa..026b98453 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1060,7 +1060,7 @@ cm_IoctlWhereIs(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scache_t *scp 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 { diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 951e047b2..a3772e468 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -1139,22 +1139,22 @@ long cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp) } /* 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; diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index 3addb4e19..d17103be0 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -111,7 +111,7 @@ extern long cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp, 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); -- 2.39.5