From: Jeffrey Altman Date: Sat, 14 Mar 2009 04:59:34 +0000 (+0000) Subject: DEVEL15-windows-afsd-reset-acl-cache-20090312 X-Git-Tag: openafs-devel-1_5_58~117 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=e938e866da0d8cfb9606f260828c903d6c14ae0a;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-afsd-reset-acl-cache-20090312 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) --- diff --git a/src/WINNT/afsd/afsd.h b/src/WINNT/afsd/afsd.h index f5289410b..0e0332ba1 100644 --- a/src/WINNT/afsd/afsd.h +++ b/src/WINNT/afsd/afsd.h @@ -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" diff --git a/src/WINNT/afsd/cm_aclent.c b/src/WINNT/afsd/cm_aclent.c index 9182b9ae6..77a1b5b81 100644 --- a/src/WINNT/afsd/cm_aclent.c +++ b/src/WINNT/afsd/cm_aclent.c @@ -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); diff --git a/src/WINNT/afsd/cm_aclent.h b/src/WINNT/afsd/cm_aclent.h index 27e0ec30e..fae82bbf7 100644 --- a/src/WINNT/afsd/cm_aclent.h +++ b/src/WINNT/afsd/cm_aclent.h @@ -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_ */ diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index b7d8fb29f..20bb686d5 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -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; } diff --git a/src/WINNT/afsd/cm_user.c b/src/WINNT/afsd/cm_user.c index 47e00bef7..d3e4c939b 100644 --- a/src/WINNT/afsd/cm_user.c +++ b/src/WINNT/afsd/cm_user.c @@ -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); } } } diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index fa27c50d9..17645eaf7 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -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); diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index 64c829aba..e2cf6862a 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -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)