Windows: cm_Analyze retries vs CM_REQ_NORETRY
[openafs.git] / src / WINNT / afsd / cm_conn.c
index eb8fd3b..642b766 100644 (file)
@@ -508,7 +508,8 @@ cm_Analyze(cm_conn_t *connp,
                     if (code == 0)
                         free_svr_list = 1;
                 }
-                cm_ResetServerBusyStatus(volServerspp);
+                if (volServerspp)
+                    cm_ResetServerBusyStatus(volServerspp);
                 if (free_svr_list) {
                     cm_FreeServerList(volServerspp, 0);
                     free_svr_list = 0;
@@ -559,7 +560,8 @@ cm_Analyze(cm_conn_t *connp,
                     if (code == 0)
                         free_svr_list = 1;
                 }
-                cm_ResetServerBusyStatus(volServerspp);
+                if (volServerspp)
+                    cm_ResetServerBusyStatus(volServerspp);
                 if (free_svr_list) {
                     cm_FreeServerList(volServerspp, 0);
                     free_svr_list = 0;
@@ -651,7 +653,8 @@ cm_Analyze(cm_conn_t *connp,
             osi_Log3(afsd_logp, format, osi_LogSaveString(afsd_logp,addr), fidp->volume, cellp->name);
             LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume, cellp->name);
 
-            cm_SetServerBusyStatus(volServerspp, serverp);
+            if (volServerspp)
+                cm_SetServerBusyStatus(volServerspp, serverp);
         }
 
         if (free_svr_list) {
@@ -863,10 +866,9 @@ cm_Analyze(cm_conn_t *connp,
                    pscp = cm_FindSCacheParent(scp);
 
                lock_ObtainWrite(&scp->rw);
-               scp->flags |= CM_SCACHEFLAG_DELETED;
+               _InterlockedOr(&scp->flags, CM_SCACHEFLAG_DELETED);
                lock_ObtainWrite(&cm_scacheLock);
                 cm_AdjustScacheLRU(scp);
-                cm_RemoveSCacheFromHashTable(scp);
                lock_ReleaseWrite(&cm_scacheLock);
                 cm_LockMarkSCacheLost(scp);
                lock_ReleaseWrite(&scp->rw);
@@ -939,7 +941,7 @@ cm_Analyze(cm_conn_t *connp,
             if (!fidp) { /* vldb */
                 retry = 1;
             } else { /* file */
-                cm_volume_t *volp = cm_GetVolumeByFID(fidp);
+               cm_volume_t *volp = cm_FindVolumeByFID(fidp, userp, reqp);
                 if (volp) {
                     if (fidp->volume == cm_GetROVolumeID(volp))
                         retry = 1;
@@ -967,7 +969,7 @@ cm_Analyze(cm_conn_t *connp,
         osi_Log1(afsd_logp, "cm_Analyze: Path MTU may have been exceeded addr[%s]",
                  osi_LogSaveString(afsd_logp,addr));
 
-        retry = 1;
+        retry = 2;
     }
     else if (errorCode == RX_CALL_BUSY) {
         /*
@@ -988,7 +990,7 @@ cm_Analyze(cm_conn_t *connp,
         LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_BUSY_CALL_CHANNEL, addr);
         osi_Log1(afsd_logp, "cm_Analyze: Retry RPC due to busy call channel addr[%s]",
                  osi_LogSaveString(afsd_logp,addr));
-        retry = 1;
+        retry = 2;
     }
     else if (errorCode == VNOSERVICE) {
         /*
@@ -1018,8 +1020,7 @@ cm_Analyze(cm_conn_t *connp,
                      osi_LogSaveString(afsd_logp,addr), fidp->volume, cellp->name);
         }
 
-        if (timeLeft > 2)
-            retry = 1;
+       retry = 2;
     }
     else if (errorCode == RX_CALL_IDLE) {
         /*
@@ -1093,8 +1094,7 @@ cm_Analyze(cm_conn_t *connp,
             reqp->errorServp = serverp;
             reqp->tokenError = errorCode;
 
-            if (timeLeft > 2)
-                retry = 1;
+           retry = 2;
         }
 
         LogEvent(EVENTLOG_WARNING_TYPE, MSG_RX_IDLE_DEAD_TIMEOUT, addr, retry);
@@ -1198,8 +1198,8 @@ cm_Analyze(cm_conn_t *connp,
             forcing_new = 1;
             cm_ForceNewConnections(serverp);
 
-            if ( timeLeft > 2 )
-                retry = 1;
+           if ( timeLeft > 2 )
+               retry = 2;
         }
     } else if (errorCode >= ERROR_TABLE_BASE_RXK && errorCode < ERROR_TABLE_BASE_RXK + 256) {
         char * s = "unknown error";
@@ -1249,8 +1249,7 @@ cm_Analyze(cm_conn_t *connp,
         reqp->flags |= CM_REQ_NEW_CONN_FORCED;
         forcing_new = 1;
         cm_ForceNewConnections(serverp);
-        if ( timeLeft > 2 )
-            retry = 1;
+       retry = 2;
     } else {
        if (connp)
            _InterlockedAnd(&connp->flags, ~CM_CONN_FLAG_NEW);