]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-afsd-reset-acl-cache-20090312
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 14 Mar 2009 04:59:34 +0000 (04:59 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 14 Mar 2009 04:59:34 +0000 (04:59 +0000)
LICENSE MIT

Modify the cm_ResetACLCache interface to accept an optional cm_cell_t *.
At the moment every time a token is set or cleared all of the acl info
for all cm_scache_t objects regardless of cell is reset.  This is both
a performance hit and unnecessary.  If we know the cell, only reset
the acl info for cm_scache_t objects in that cell.

If cell is not specified, reset for all cells.

(cherry picked from commit d0e4044cfeef3ce1c5d435251de9b584343225f5)

src/WINNT/afsd/afsd.h
src/WINNT/afsd/cm_aclent.c
src/WINNT/afsd/cm_aclent.h
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_user.c
src/WINNT/afsd/smb3.c
src/WINNT/afsd/smb_ioctl.c

index f5289410beb6c821da328648baf10689f698d342..0e0332ba1bd6b5b03f1bc8c554a1cd610d5a4041 100644 (file)
@@ -38,9 +38,9 @@ BOOL APIENTRY About(HWND, unsigned int, unsigned int, long);
 #include "cm_diskcache95.h"
 #endif /* DISKCACHE95 */
 #include "cm_conn.h"
+#include "cm_cell.h"
 #include "cm_aclent.h"
 #include "cm_server.h"
-#include "cm_cell.h"
 #include "cm_volstat.h"
 #include "cm_volume.h"
 #include "cm_dcache.h"
index 9182b9ae6ecbd50cdfad312fee0e8a106622b322..77a1b5b81718c0c4d7385e78673d0ae3cec671c8 100644 (file)
@@ -342,7 +342,7 @@ void cm_InvalidateACLUser(cm_scache_t *scp, cm_user_t *userp)
  * Invalidate ACL info for a user that has just        obtained or lost tokens.
  */
 void 
-cm_ResetACLCache(cm_user_t *userp)
+cm_ResetACLCache(cm_cell_t *cellp, cm_user_t *userp)
 {
     cm_scache_t *scp;
     int hash;
@@ -350,13 +350,16 @@ cm_ResetACLCache(cm_user_t *userp)
     lock_ObtainWrite(&cm_scacheLock);
     for (hash=0; hash < cm_data.scacheHashTableSize; hash++) {
         for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
-            cm_HoldSCacheNoLock(scp);
-            lock_ReleaseWrite(&cm_scacheLock);
-            lock_ObtainWrite(&scp->rw);
-            cm_InvalidateACLUser(scp, userp);
-            lock_ReleaseWrite(&scp->rw);
-            lock_ObtainWrite(&cm_scacheLock);
-            cm_ReleaseSCacheNoLock(scp);
+            if (cellp == NULL || 
+                scp->fid.cell == cellp->cellID) {
+                cm_HoldSCacheNoLock(scp);
+                lock_ReleaseWrite(&cm_scacheLock);
+                lock_ObtainWrite(&scp->rw);
+                cm_InvalidateACLUser(scp, userp);
+                lock_ReleaseWrite(&scp->rw);
+                lock_ObtainWrite(&cm_scacheLock);
+                cm_ReleaseSCacheNoLock(scp);
+            }
         }
     }
     lock_ReleaseWrite(&cm_scacheLock);
index 27e0ec30ea0312797c19d883f41e6fd606b24e6c..fae82bbf7d0eda39b5ec1e9982ea9be8a79eb90b 100644 (file)
@@ -47,6 +47,6 @@ extern long cm_ValidateACLCache(void);
 
 extern long cm_ShutdownACLCache(void);
 
-extern void cm_ResetACLCache(cm_user_t *userp);
+extern void cm_ResetACLCache(cm_cell_t *cellp, cm_user_t *userp);
 
 #endif  /* _CM_ACLENT_H_ */
index b7d8fb29fe6504cf926fd86f3803f5bdc0094487..20bb686d56ffe8f6064276623881212354d8a3a7 100644 (file)
@@ -2355,7 +2355,7 @@ cm_IoctlSetToken(struct cm_ioctl *ioctlp, struct cm_user *userp)
         ioctlp->flags |= CM_IOCTLFLAG_LOGON;
     }
 
-    cm_ResetACLCache(userp);
+    cm_ResetACLCache(cellp, userp);
 
     if (release_userp)
        cm_ReleaseUser(userp);
@@ -2578,7 +2578,7 @@ cm_IoctlDelToken(struct cm_ioctl *ioctlp, struct cm_user *userp)
 
     lock_ReleaseMutex(&userp->mx);
 
-    cm_ResetACLCache(userp);
+    cm_ResetACLCache(cellp, userp);
 
     return 0;
 }
@@ -2613,7 +2613,7 @@ cm_IoctlDelAllToken(struct cm_ioctl *ioctlp, struct cm_user *userp)
 
     lock_ReleaseMutex(&userp->mx);
 
-    cm_ResetACLCache(userp);
+    cm_ResetACLCache(NULL, userp);
 
     return 0;
 }
index 47e00bef77f6651ddd8abef44402bb0ea019ef27..d3e4c939b325c75e1119d77e3458c24b22f2d7ee 100644 (file)
@@ -189,7 +189,7 @@ void cm_CheckTokenCache(time_t now)
             lock_ReleaseMutex(&userp->mx);
             if (bExpired) {
                 bExpired=FALSE;
-                cm_ResetACLCache(userp);
+                cm_ResetACLCache(NULL, userp);
             }
         }
     }
index fa27c50d9c768cdc371249f2fcb2d6b932b3f16f..17645eaf7a9583cda42dc899411bd3ff73cd6e2c 100644 (file)
@@ -6124,7 +6124,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
         key = cm_GenerateKey(vcp->vcID, pid, fidp->fid);
 
-        code = cm_Unlock(scp, LockType, LOffset, LLength, key, userp, &req);
+        code = cm_Unlock(scp, LockType, LOffset, LLength, key, 0, userp, &req);
 
         if (code) 
             goto done;
@@ -6246,7 +6246,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
 
                 wlNext = (smb_waitingLock_t *) osi_QNext(&wl->q);
 
-                ul_code = cm_Unlock(scp, LockType, wl->LOffset, wl->LLength, wl->key, userp, &req);
+                ul_code = cm_Unlock(scp, LockType, wl->LOffset, wl->LLength, wl->key, 0, userp, &req);
                 
                 if(ul_code != 0) {
                     osi_Log1(smb_logp, "smb_ReceiveV3Locking cm_Unlock returns code %d", ul_code);
index 64c829abae0fc64277abd81f5a49f8c1c2846cad..e2cf6862ae5efca402d3a88d8d077cedb892a954 100644 (file)
@@ -1040,7 +1040,7 @@ smb_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
         ioctlp->ioctl.flags |= CM_IOCTLFLAG_LOGON;
     }
 
-    cm_ResetACLCache(userp);
+    cm_ResetACLCache(cellp, userp);
 
   done:
     if (release_userp)