]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 c0f0dd97943ecba790fc03215940491dfe10be2b..72602b9097eb5123f3669600f0c66e6160c029d3 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 491a4daca9d0f5d2952326846635b10781cb1d14..e9025c26384820a1e3bac3da4a6c39f6a5b285bd 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 61b84d551d3b1761865aff47dae1fed29f4ad3d7..a125b6cb33bc71fb9788d4b6bca0483116363d7f 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