windows-noprobe-20080131
[openafs.git] / src / WINNT / afsd / cm_server.c
index 4a9b325..ec3a70b 100644 (file)
@@ -31,13 +31,13 @@ cm_ForceNewConnectionsAllServers(void)
 {
     cm_server_t *tsp;
 
-    lock_ObtainRead(&cm_serverLock);
+    lock_ObtainWrite(&cm_serverLock);
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
         cm_GetServerNoLock(tsp);
        cm_ForceNewConnections(tsp);
         cm_PutServerNoLock(tsp);
     }
-    lock_ReleaseRead(&cm_serverLock);
+    lock_ReleaseWrite(&cm_serverLock);
 }
 
 void 
@@ -106,6 +106,7 @@ cm_PingServer(cm_server_t *tsp)
     if (code >= 0) {
        /* mark server as up */
        tsp->flags &= ~CM_SERVERFLAG_DOWN;
+        tsp->downTime = 0;
 
        /* we currently handle 32-bits of capabilities */
        if (caps.Capabilities_len > 0) {
@@ -128,14 +129,15 @@ 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) {
                         cm_InitReq(&req);
 
+                        lock_ReleaseMutex(&tsp->mx);
                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                 &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+                        lock_ObtainMutex(&tsp->mx);
                         if (code == 0) {
                             cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
                             cm_PutVolume(volp);
@@ -143,11 +145,13 @@ cm_PingServer(cm_server_t *tsp)
                     }
                 }
             }
-            lock_ObtainMutex(&tsp->mx);
         }
     } else {
        /* mark server as down */
-       tsp->flags |= CM_SERVERFLAG_DOWN;
+        if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+            tsp->flags |= CM_SERVERFLAG_DOWN;
+            tsp->downTime = osi_Time();
+        }
        if (code != VRESTARTING)
            cm_ForceNewConnections(tsp);
 
@@ -162,14 +166,15 @@ 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) {
                         cm_InitReq(&req);
 
+                        lock_ReleaseMutex(&tsp->mx);
                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                 &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+                        lock_ObtainMutex(&tsp->mx);
                         if (code == 0) {
                             cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
                             cm_PutVolume(volp);
@@ -177,7 +182,6 @@ cm_PingServer(cm_server_t *tsp)
                     }
                 }
             }
-            lock_ObtainMutex(&tsp->mx);
         }
     }
 
@@ -269,13 +273,13 @@ void cm_GetServerNoLock(cm_server_t *serverp)
 void cm_PutServer(cm_server_t *serverp)
 {
     lock_ObtainWrite(&cm_serverLock);
-    osi_assert(serverp->refCount-- > 0);
+    osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
     lock_ReleaseWrite(&cm_serverLock);
 }
 
 void cm_PutServerNoLock(cm_server_t *serverp)
 {
-    osi_assert(serverp->refCount-- > 0);
+    osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
 }
 
 void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit)
@@ -357,10 +361,10 @@ void cm_SetServerPrefs(cm_server_t * serverp)
     } /* and of for loop */
 }
 
-cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) {
+cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afs_uint32 flags) {
     cm_server_t *tsp;
 
-    osi_assert(socketp->sin_family == AF_INET);
+    osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
 
     tsp = malloc(sizeof(*tsp));
     if (tsp) {
@@ -370,7 +374,6 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
         tsp->refCount = 1;
         lock_InitializeMutex(&tsp->mx, "cm_server_t mutex");
         tsp->addr = *socketp;
-        tsp->flags = CM_SERVERFLAG_DOWN;       /* assume down; ping will mark up if available */
 
         cm_SetServerPrefs(tsp); 
 
@@ -379,7 +382,10 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
         cm_allServersp = tsp;
         lock_ReleaseWrite(&cm_serverLock);     /* release server lock */
 
-        cm_PingServer(tsp);                    /* Obtain Capabilities and check up/down state */
+        if ( !(flags & CM_FLAG_NOPROBE) ) {
+            tsp->flags = CM_SERVERFLAG_DOWN;   /* assume down; ping will mark up if available */
+            cm_PingServer(tsp);                        /* Obtain Capabilities and check up/down state */
+        }
     }
     return tsp;
 }
@@ -405,7 +411,7 @@ cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type)
 {
     cm_server_t *tsp;
 
-    osi_assert(addrp->sin_family == AF_INET);
+    osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
         
     lock_ObtainWrite(&cm_serverLock);
     for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {