Windows: cm_ForceNewConnections serverp == NULL
[openafs.git] / src / WINNT / afsd / cm_conn.c
index 0f75e97..6a867fd 100644 (file)
@@ -869,7 +869,6 @@ cm_Analyze(cm_conn_t *connp,
                _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);
@@ -942,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;
@@ -970,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) {
         /*
@@ -991,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) {
         /*
@@ -1021,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) {
         /*
@@ -1096,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);
@@ -1201,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";
@@ -1252,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);
@@ -1659,6 +1655,9 @@ long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, afs_uint32 replicat
         userp = cm_rootUserp;
 
     lock_ObtainMutex(&userp->mx);
+    /* find ucell structure */
+    ucellp = cm_GetUCell(userp, serverp->cellp);
+
     lock_ObtainRead(&cm_connLock);
     for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
         if (tcp->userp == userp &&
@@ -1667,13 +1666,13 @@ long cm_ConnByServer(cm_server_t *serverp, cm_user_t *userp, afs_uint32 replicat
             break;
     }
 
-    /* find ucell structure */
-    ucellp = cm_GetUCell(userp, serverp->cellp);
     if (!tcp) {
         lock_ConvertRToW(&cm_connLock);
         for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
-            if (tcp->userp == userp)
-                break;
+           if (tcp->userp == userp &&
+                (replicated && (tcp->flags & CM_CONN_FLAG_REPLICATION) ||
+                 !replicated && !(tcp->flags & CM_CONN_FLAG_REPLICATION)))
+               break;
         }
         if (tcp) {
             InterlockedIncrement(&tcp->refCount);
@@ -1828,6 +1827,9 @@ void cm_ForceNewConnections(cm_server_t *serverp)
 {
     cm_conn_t *tcp;
 
+    if (serverp == NULL)
+       return;
+
     lock_ObtainWrite(&cm_connLock);
     for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
        lock_ObtainMutex(&tcp->mx);