windows-get-volume-no-reset-flag-20080124
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 24 Jan 2008 15:29:56 +0000 (15:29 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 24 Jan 2008 15:29:56 +0000 (15:29 +0000)
LICENSE MIT

There are circumstances where a volume object is being accessed and the
volume is marked indicating that the volume location information is out
of date but where it is also pointless and perhaps dangerous to block
waiting for the rpc to complete.  One example is when processing the
cmdebug requests.  If we know that we are not going to use the volume
object to contact a server, then we can now set the CM_GETVOL_FLAG_NO_RESET
flag.

src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_volume.c
src/WINNT/afsd/cm_volume.h

index c0f0dd9..72602b9 100644 (file)
@@ -1968,6 +1968,7 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
                 tsp->downTime = osi_Time();
             }
             cm_ForceNewConnections(tsp);
+
             /* Now update the volume status */
             for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
                 for (i=0; i<NUM_SERVER_VOLS; i++) {
@@ -1977,7 +1978,7 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
                         cm_InitReq(&req);
 
                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
-                                                 &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+                                                 &req, CM_GETVOL_FLAG_NO_LRU_UPDATE | CM_GETVOL_FLAG_NO_RESET, &volp);
                         if (code == 0) {    
                             cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
                             cm_PutVolume(volp);
index 491a4da..e9025c2 100644 (file)
@@ -613,25 +613,27 @@ long cm_GetVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp,
         
     /* return it held */
     if (volp) {
-       lock_ObtainMutex(&volp->mx);
+        lock_ObtainMutex(&volp->mx);
         
-       code = 0;
-       if (volp->flags & CM_VOLUMEFLAG_RESET) {
-           code = cm_UpdateVolume(cellp, userp, reqp, volp);
-           if (code == 0)
-               volp->flags &= ~CM_VOLUMEFLAG_RESET;
-       }
-       lock_ReleaseMutex(&volp->mx);
-       if (code == 0) {
-           *outVolpp = volp;
-
-            lock_ObtainWrite(&cm_volumeLock);
-            cm_AdjustVolumeLRU(volp);
-            lock_ReleaseWrite(&cm_volumeLock);
+        code = 0;
+        if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
+            code = cm_UpdateVolume(cellp, userp, reqp, volp);
+            if (code == 0)
+                volp->flags &= ~CM_VOLUMEFLAG_RESET;
+        }
+        lock_ReleaseMutex(&volp->mx);
+        if (code == 0) {
+            *outVolpp = volp;
+
+            if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
+                lock_ObtainWrite(&cm_volumeLock);
+                cm_AdjustVolumeLRU(volp);
+                lock_ReleaseWrite(&cm_volumeLock);
+            }
         } else
-           cm_PutVolume(volp);
+            cm_PutVolume(volp);
 
-       return code;
+        return code;
     }
         
     /* otherwise, we didn't find it so consult the VLDB */
@@ -780,10 +782,10 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep,
     }
 
     /* if we get here we are holding the mutex */
-    if (volp->flags & CM_VOLUMEFLAG_RESET) {
-       code = cm_UpdateVolume(cellp, userp, reqp, volp);
-       if (code == 0)
-           volp->flags &= ~CM_VOLUMEFLAG_RESET;
+    if ((volp->flags & CM_VOLUMEFLAG_RESET) && !(flags & CM_GETVOL_FLAG_NO_RESET)) {
+        code = cm_UpdateVolume(cellp, userp, reqp, volp);
+        if (code == 0)
+            volp->flags &= ~CM_VOLUMEFLAG_RESET;
     }  
     lock_ReleaseMutex(&volp->mx);
 
@@ -792,13 +794,15 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep,
         code = CM_ERROR_NOSUCHVOLUME;
 
     if (code == 0) {
-       *outVolpp = volp;
-
-        lock_ObtainWrite(&cm_volumeLock);
-        cm_AdjustVolumeLRU(volp);
-        lock_ReleaseWrite(&cm_volumeLock);
+               *outVolpp = volp;
+               
+               if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
+               lock_ObtainWrite(&cm_volumeLock);
+                       cm_AdjustVolumeLRU(volp);
+                       lock_ReleaseWrite(&cm_volumeLock);
+               }
     } else
-       cm_PutVolume(volp);
+               cm_PutVolume(volp);
 
     return code;
 }      
index 61b84d5..a125b6c 100644 (file)
@@ -62,6 +62,7 @@ extern long cm_GetVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
 
 #define CM_GETVOL_FLAG_CREATE               1
 #define CM_GETVOL_FLAG_NO_LRU_UPDATE        2
+#define CM_GETVOL_FLAG_NO_RESET                    4
 
 /* hash define.  Must not include the cell, since the callback revocation code
  * doesn't necessarily know the cell in the case of a multihomed server