/* * Invalidate ACL info for a user that has just obtained or lost tokens. */ void cm_ResetACLCache(cm_cell_t *cellp, cm_user_t *userp) { cm_volume_t *volp, *nextVolp; cm_scache_t *scp, *nextScp; afs_uint32 hash; lock_ObtainRead(&cm_scacheLock); for (hash=0; hash < cm_data.scacheHashTableSize; hash++) { for (scp=cm_data.scacheHashTablep[hash]; scp; scp=nextScp) { nextScp = scp->nextp; if (cellp == NULL || scp->fid.cell == cellp->cellID) { cm_HoldSCacheNoLock(scp); lock_ReleaseRead(&cm_scacheLock); cm_InvalidateACLUser(scp, userp); lock_ObtainRead(&cm_scacheLock); cm_ReleaseSCacheNoLock(scp); } } } lock_ReleaseRead(&cm_scacheLock); cm_EAccesClearUserEntries(userp, cellp ? cellp->cellID : 0); if (RDR_Initialized) { lock_ObtainRead(&cm_volumeLock); for (hash = 0; hash < cm_data.volumeHashTableSize; hash++) { for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = nextVolp) { nextVolp = volp->vol[RWVOL].nextp; if ((cellp == NULL || cellp->cellID == volp->cellp->cellID) && volp->vol[RWVOL].ID) { lock_ReleaseRead(&cm_volumeLock); RDR_InvalidateVolume(volp->cellp->cellID, volp->vol[RWVOL].ID, AFS_INVALIDATE_CREDS); lock_ObtainRead(&cm_volumeLock); } } for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = nextVolp) { nextVolp = volp->vol[ROVOL].nextp; if ((cellp == NULL || cellp->cellID == volp->cellp->cellID) && volp->vol[ROVOL].ID) { lock_ReleaseRead(&cm_volumeLock); RDR_InvalidateVolume(volp->cellp->cellID, volp->vol[ROVOL].ID, AFS_INVALIDATE_CREDS); lock_ObtainRead(&cm_volumeLock); } } for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = nextVolp) { nextVolp = volp->vol[BACKVOL].nextp; if ((cellp == NULL || cellp->cellID == volp->cellp->cellID) && volp->vol[BACKVOL].ID) { lock_ReleaseRead(&cm_volumeLock); RDR_InvalidateVolume(volp->cellp->cellID, volp->vol[BACKVOL].ID, AFS_INVALIDATE_CREDS); lock_ObtainRead(&cm_volumeLock); } } } lock_ReleaseRead(&cm_volumeLock); } }
/* * Invalidate ACL info for a user that has just obtained or lost tokens. */ void cm_ResetACLCache(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); } } lock_ReleaseWrite(&cm_scacheLock); }