windows-volstat-20080207
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 7 Feb 2008 14:47:25 +0000 (14:47 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 7 Feb 2008 14:47:25 +0000 (14:47 +0000)
LICENSE MIT

When updating the volume status do not introduce a deadlock by holding
cm_serverLock

src/WINNT/afsd/cm_conn.c

index b407bd6..8413a19 100644 (file)
@@ -267,9 +267,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
          * background daemon thread as they become available 
          */
         if (timeLeft > 7 && fidp) {
-            cm_volume_t *volp;
-            cm_vol_state_t *statep;
-
             thrd_Sleep(5000);
 
             code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, 
@@ -382,20 +379,18 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                             statep = &volp->ro;
                         else if (fidp->volume == volp->bk.ID)
                             statep = &volp->bk;
-
-                        cm_UpdateVolumeStatus(volp, statep->ID);
                     }
-            
-                    cm_PutVolume(volp);
                 }
                 break;
             }
         }
         lock_ReleaseWrite(&cm_serverLock);
         
-        if (statep)
+        if (statep) {
             cm_UpdateVolumeStatus(volp, statep->ID);
-        
+            cm_PutVolume(volp);
+        }
+
         if (free_svr_list) {
             cm_FreeServerList(&serversp, 0);
             *serverspp = serversp;
@@ -455,13 +450,12 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                 free_svr_list = 1;
             }
         }
+        lock_ObtainWrite(&cm_serverLock);
         for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
             if (tsrp->server == serverp) {
                 /* REDIRECT */
                 if (errorCode == VMOVED) {
                     tsrp->status = srv_deleted;
-                    if (fidp)
-                        cm_ForceUpdateVolume(fidp, userp, reqp);
                 } else {
                     tsrp->status = srv_offline;
                 }
@@ -477,13 +471,20 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                             statep = &volp->ro;
                         else if (fidp->volume == volp->bk.ID)
                             statep = &volp->bk;
-
-                        cm_UpdateVolumeStatus(volp, statep->ID);
                     }
-                    cm_PutVolume(volp);
                 }   
             }
         }   
+        lock_ReleaseWrite(&cm_serverLock);
+
+        if (fidp && errorCode == VMOVED)
+            cm_ForceUpdateVolume(fidp, userp, reqp);
+
+        if (statep) {
+            cm_UpdateVolumeStatus(volp, statep->ID);
+            cm_PutVolume(volp);
+        }
+
         if (free_svr_list) {
             cm_FreeServerList(&serversp, 0);
             *serverspp = serversp;