windows-revoke-callback-20070619
[openafs.git] / src / WINNT / afsd / cm_server.c
index b64cab5..827f65b 100644 (file)
@@ -127,6 +127,7 @@ cm_PingServer(cm_server_t *tsp)
             cm_volume_t * volp;
             int i;
 
+            lock_ReleaseMutex(&tsp->mx);
             for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
                 for (i=0; i<NUM_SERVER_VOLS; i++) {
                     if (tsrvp->ids[i] != 0) {
@@ -141,6 +142,7 @@ cm_PingServer(cm_server_t *tsp)
                     }
                 }
             }
+            lock_ObtainMutex(&tsp->mx);
         }
     } else {
        /* mark server as down */
@@ -159,6 +161,7 @@ cm_PingServer(cm_server_t *tsp)
             cm_volume_t * volp;
             int i;
 
+            lock_ReleaseMutex(&tsp->mx);
             for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
                 for (i=0; i<NUM_SERVER_VOLS; i++) {
                     if (tsrvp->ids[i] != 0) {
@@ -173,6 +176,7 @@ cm_PingServer(cm_server_t *tsp)
                     }
                 }
             }
+            lock_ObtainMutex(&tsp->mx);
         }
     }
 
@@ -193,6 +197,7 @@ void cm_CheckServers(long flags, cm_cell_t *cellp)
     cm_server_t *tsp;
     int doPing;
     int isDown;
+    int isFS;
 
     lock_ObtainWrite(&cm_serverLock);
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
@@ -204,6 +209,7 @@ void cm_CheckServers(long flags, cm_cell_t *cellp)
 
         doPing = 0;
         isDown = tsp->flags & CM_SERVERFLAG_DOWN;
+        isFS   = tsp->type == CM_SERVER_FILE;
 
         /* only do the ping if the cell matches the requested cell, or we're
          * matching all cells (cellp == NULL), and if we've requested to ping
@@ -211,7 +217,11 @@ void cm_CheckServers(long flags, cm_cell_t *cellp)
          */
         if ((cellp == NULL || cellp == tsp->cellp) &&
              ((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
-               (!isDown && (flags & CM_FLAG_CHECKUPSERVERS)))) {
+               (!isDown && (flags & CM_FLAG_CHECKUPSERVERS))) &&
+             ((!(flags & CM_FLAG_CHECKVLDBSERVERS) || 
+               !isFS && (flags & CM_FLAG_CHECKVLDBSERVERS)) &&
+              (!(flags & CM_FLAG_CHECKFILESERVERS) || 
+                 isFS && (flags & CM_FLAG_CHECKFILESERVERS)))) {
             doPing = 1;
         }      /* we're supposed to check this up/down server */
         lock_ReleaseMutex(&tsp->mx);
@@ -701,3 +711,18 @@ void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags)
     lock_ReleaseWrite(&cm_serverLock);
 }
 
+cm_server_t *
+cm_FindServerByIP(afs_uint32 ipaddr)
+{
+    cm_server_t *tsp;
+
+    lock_ObtainRead(&cm_serverLock);
+    for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
+        if (tsp->addr.sin_addr.S_un.S_addr == ipaddr)
+            break;
+    }
+    lock_ReleaseRead(&cm_serverLock);
+
+    return tsp;
+}
+