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)
#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"
* 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;
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);
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_ */
ioctlp->flags |= CM_IOCTLFLAG_LOGON;
}
- cm_ResetACLCache(userp);
+ cm_ResetACLCache(cellp, userp);
if (release_userp)
cm_ReleaseUser(userp);
lock_ReleaseMutex(&userp->mx);
- cm_ResetACLCache(userp);
+ cm_ResetACLCache(cellp, userp);
return 0;
}
lock_ReleaseMutex(&userp->mx);
- cm_ResetACLCache(userp);
+ cm_ResetACLCache(NULL, userp);
return 0;
}
lock_ReleaseMutex(&userp->mx);
if (bExpired) {
bExpired=FALSE;
- cm_ResetACLCache(userp);
+ cm_ResetACLCache(NULL, userp);
}
}
}
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;
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);
ioctlp->ioctl.flags |= CM_IOCTLFLAG_LOGON;
}
- cm_ResetACLCache(userp);
+ cm_ResetACLCache(cellp, userp);
done:
if (release_userp)