Beispiel #1
0
/*
 * 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);
    }
}
Beispiel #2
0
/*
 * 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);
}