if ((acode < 0) && (acode != VRESTARTING)) {
if (acode == RX_CALL_TIMEOUT) {
serversleft = afs_BlackListOnce(areq, afid, tsp);
- areq->idleError++;
- if (serversleft) {
- shouldRetry = 1;
- } else {
+ tvp = afs_FindVolume(afid, READ_LOCK);
+ if (!tvp || (tvp->states & VRO))
+ areq->idleError++;
+ if ((serversleft == 0) && tvp &&
+ ((tvp->states & VRO) || (tvp->states & VBackup))) {
shouldRetry = 0;
+ } else {
+ shouldRetry = 1;
}
+ if (tvp)
+ afs_PutVolume(tvp, READ_LOCK);
/* By doing this, we avoid ever marking a server down
* in an idle timeout case. That's because the server is
* still responding and may only be letting a single vnode