reqp->startTime = GetTickCount();
}
-static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
+long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
struct cm_req *reqp, afs_uint32 *replicated, cm_serverRef_t ***serversppp)
{
long code;
if ((errorCode == VMOVED || errorCode == VNOVOL || errorCode == VOFFLINE) &&
!(reqp->flags & CM_REQ_VOLUME_UPDATED))
{
+ LONG_PTR oldSum, newSum;
+
+ oldSum = cm_ChecksumVolumeServerList(fidp, userp, reqp);
+
code = cm_ForceUpdateVolume(fidp, userp, reqp);
- if (code == 0)
+ if (code == 0) {
location_updated = 1;
+ newSum = cm_ChecksumVolumeServerList(fidp, userp, reqp);
+ }
- /* Even if the update fails, there might still be another replica */
+ /*
+ * Even if the update fails, there might still be another replica.
+ * If the volume location list changed, permit another update on
+ * a subsequent error.
+ */
+ if (code || oldSum == newSum)
+ reqp->flags |= CM_REQ_VOLUME_UPDATED;
- reqp->flags |= CM_REQ_VOLUME_UPDATED;
osi_Log3(afsd_logp, "cm_Analyze called cm_ForceUpdateVolume cell %u vol %u code 0x%x",
- fidp->cell, fidp->volume, code);
+ fidp->cell, fidp->volume, code);
}
if (statep) {
extern long cm_ServerAvailable(struct cm_fid *fidp, struct cm_user *userp);
+extern long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
+ struct cm_req *reqp, afs_uint32 *replicated,
+ cm_serverRef_t ***serversppp);
+
#endif /* OPENAFS_WINNT_AFSD_CM_CONN_H */
return -1;
}
+
+LONG_PTR
+cm_ChecksumVolumeServerList(struct cm_fid *fidp, cm_user_t *userp, cm_req_t *reqp)
+{
+ LONG_PTR cksum = 0;
+ long code;
+ afs_uint32 replicated;
+ cm_serverRef_t **serverspp;
+
+ code = cm_GetServerList(fidp, userp, reqp, &replicated, &serverspp);
+ if (code == 0) {
+ cksum = cm_ChecksumServerList(*serverspp);
+ cm_FreeServerList(serverspp, 0);
+ }
+ return cksum;
+}
extern long cm_GetROVolumeID(cm_volume_t *volp);
+extern LONG_PTR cm_ChecksumVolumeServerList(struct cm_fid *fidp,
+ cm_user_t *userp, cm_req_t *reqp);
+
extern long cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp,
cm_req_t *reqp);