rx: Remove RX_CALL_BUSY
[openafs.git] / src / WINNT / afsd / cm_server.c
index 68fe24e..4a9ae48 100644 (file)
@@ -280,7 +280,10 @@ cm_PingServer(cm_server_t *tsp)
     afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
     lock_ReleaseMutex(&tsp->mx);
 
-    code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &connp);
+    if (cm_noIPAddr > 0)
+       code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &connp);
+    else
+       code = RX_CALL_DEAD;    /* No network */
     if (code == 0) {
        /* now call the appropriate ping call.  Drop the timeout if
        * the server is known to be down, so that we don't waste a
@@ -310,14 +313,13 @@ cm_PingServer(cm_server_t *tsp)
     }  /* got an unauthenticated connection to this server */
 
     lock_ObtainMutex(&tsp->mx);
-    if (code >= 0 || code == RXGEN_OPCODE || code == RX_CALL_BUSY) {
+    if (code >= 0 || code == RXGEN_OPCODE) {
        /* mark server as up */
        _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
         tsp->downTime = 0;
 
        /* we currently handle 32-bits of capabilities */
-       if (code != RXGEN_OPCODE && code != RX_CALL_BUSY &&
-            caps.Capabilities_len > 0) {
+       if (code != RXGEN_OPCODE && caps.Capabilities_len > 0) {
            tsp->capabilities = caps.Capabilities_val[0];
            xdr_free((xdrproc_t) xdr_Capabilities, &caps);
            caps.Capabilities_len = 0;
@@ -530,10 +532,18 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
-            code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           if (cm_noIPAddr > 0)
+               code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           else
+               code = RX_CALL_DEAD;
             if (code) {
-                lock_ObtainRead(&cm_serverLock);
-                cm_PutServerNoLock(tsp);
+               if (code == RX_CALL_DEAD) {
+                   lock_ObtainMutex(&tsp->mx);
+                   cm_MarkServerDown(tsp, code, isDown);
+                   lock_ReleaseMutex(&tsp->mx);
+               }
+               lock_ObtainRead(&cm_serverLock);
+               cm_PutServerNoLock(tsp);
                 continue;
             }
             lock_ObtainRead(&cm_serverLock);
@@ -568,15 +578,13 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ObtainMutex(&tsp->mx);
             wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
 
-            if (results[i] >= 0 || results[i] == RXGEN_OPCODE ||
-                results[i] == RX_CALL_BUSY)  {
+            if (results[i] >= 0 || results[i] == RXGEN_OPCODE) {
                 /* mark server as up */
                 _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
                 tsp->downTime = 0;
 
                 /* we currently handle 32-bits of capabilities */
-                if (results[i] != RXGEN_OPCODE && results[i] != RX_CALL_BUSY &&
-                    caps[i].Capabilities_len > 0) {
+                if (results[i] != RXGEN_OPCODE && caps[i].Capabilities_len > 0) {
                     tsp->capabilities = caps[i].Capabilities_val[0];
                     xdr_free((xdrproc_t) xdr_Capabilities, &caps[i]);
                     caps[i].Capabilities_len = 0;
@@ -667,9 +675,17 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
-            code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           if (cm_noIPAddr > 0)
+               code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           else
+               code = RX_CALL_DEAD;
             if (code) {
-                lock_ObtainRead(&cm_serverLock);
+               if (code == RX_CALL_DEAD) {
+                   lock_ObtainMutex(&tsp->mx);
+                   cm_MarkServerDown(tsp, code, isDown);
+                   lock_ReleaseMutex(&tsp->mx);
+               }
+               lock_ObtainRead(&cm_serverLock);
                 cm_PutServerNoLock(tsp);
                 continue;
             }
@@ -706,7 +722,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ObtainMutex(&tsp->mx);
             wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
 
-            if (results[i] >= 0 || results[i] == RX_CALL_BUSY)  {
+            if (results[i] >= 0)  {
                 /* mark server as up */
                 _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
                 tsp->downTime = 0;
@@ -1509,6 +1525,20 @@ int cm_IsServerListEmpty(cm_serverRef_t *serversp)
     return ( allDeleted ? CM_ERROR_EMPTY : 0 );
 }
 
+void cm_AppendServerList(cm_serverRef_t *dest, cm_serverRef_t **src)
+{
+    cm_serverRef_t *ref;
+
+    if (dest == NULL || src == NULL || *src == NULL)
+       return;
+
+    for (ref = dest; ref->next != NULL; ref = ref->next);
+
+    ref->next = *src;
+
+    *src = NULL;
+}
+
 void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags)
 {
     cm_serverRef_t  **current;