Lines Matching refs:mcc
197 static uint32_t sss_mc_hash(struct sss_mc_ctx *mcc,
200 return murmurhash3(key, len, mcc->seed) % MC_HT_ELEMS(mcc->ht_size);
203 static void sss_mc_add_rec_to_chain(struct sss_mc_ctx *mcc,
210 if (hash > MC_HT_ELEMS(mcc->ht_size)) {
216 slot = mcc->hash_table[hash];
219 mcc->hash_table[hash] = MC_PTR_TO_SLOT(mcc->data_table, rec);
224 cur = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
233 slot = MC_PTR_TO_SLOT(mcc->data_table, rec);
237 static void sss_mc_rm_rec_from_chain(struct sss_mc_ctx *mcc,
245 if (hash > MC_HT_ELEMS(mcc->ht_size)) {
253 slot = mcc->hash_table[hash];
260 cur = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
262 mcc->hash_table[hash] = sss_mc_next_slot_with_hash(rec, hash);
267 cur = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
280 static void sss_mc_free_slots(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec)
286 slot = MC_PTR_TO_SLOT(mcc->data_table, rec);
289 MC_CLEAR_BIT(mcc->free_table, slot + i);
293 static void sss_mc_invalidate_rec(struct sss_mc_ctx *mcc,
303 sss_mc_rm_rec_from_chain(mcc, rec, rec->hash1);
305 sss_mc_rm_rec_from_chain(mcc, rec, rec->hash2);
308 sss_mc_free_slots(mcc, rec);
323 static bool sss_mc_is_valid_rec(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec)
328 if (((uint8_t *)rec < mcc->data_table) ||
329 ((uint8_t *)rec > (mcc->data_table + mcc->dt_size - MC_SLOT_SIZE))) {
338 if (!MC_CHECK_RECORD_LENGTH(mcc, rec)) {
352 slot = mcc->hash_table[rec->hash1];
354 self = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
363 slot = mcc->hash_table[rec->hash2];
365 self = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
380 static errno_t sss_mc_find_free_slots(struct sss_mc_ctx *mcc,
390 tot_slots = mcc->ft_size * 8;
395 if ((mcc->next_slot + num_slots) > tot_slots) {
398 cur = mcc->next_slot;
403 for (i = 0; i < mcc->ft_size; i++) {
406 if (mcc->free_table[t] == 0xff) {
416 MC_PROBE_BIT(mcc->free_table, cur, used);
428 MC_PROBE_BIT(mcc->free_table, cur, used);
439 if ((mcc->next_slot + num_slots) > tot_slots) {
442 cur = mcc->next_slot;
445 MC_PROBE_BIT(mcc->free_table, cur + i, used);
449 rec = MC_SLOT_TO_PTR(mcc->data_table, cur + i, struct sss_mc_rec);
450 if (!sss_mc_is_valid_rec(mcc, rec)) {
459 sss_mc_invalidate_rec(mcc, rec);
463 mcc->next_slot = cur + num_slots;
468 static errno_t sss_mc_get_strs_offset(struct sss_mc_ctx *mcc,
471 switch (mcc->type) {
487 static errno_t sss_mc_get_strs_len(struct sss_mc_ctx *mcc,
491 switch (mcc->type) {
507 static struct sss_mc_rec *sss_mc_find_record(struct sss_mc_ctx *mcc,
520 hash = sss_mc_hash(mcc, key->str, key->len);
522 slot = mcc->hash_table[hash];
523 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
528 max_addr = mcc->data_table + mcc->dt_size;
530 ret = sss_mc_get_strs_offset(mcc, &strs_offset);
536 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
539 sss_mc_save_corrupted(mcc);
540 sss_mmap_cache_reset(mcc);
544 rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
545 ret = sss_mc_get_strs_len(mcc, rec, &strs_len);
571 sss_mc_save_corrupted(mcc);
572 sss_mmap_cache_reset(mcc);
595 struct sss_mc_ctx *mcc = *_mcc;
606 old_rec = sss_mc_find_record(mcc, key);
617 sss_mc_invalidate_rec(mcc, old_rec);
621 ret = sss_mc_find_free_slots(mcc, num_slots, &base_slot);
626 (void)sss_mmap_cache_reinit(talloc_parent(mcc), -1, -1, _mcc);
631 rec = MC_SLOT_TO_PTR(mcc->data_table, base_slot, struct sss_mc_rec);
643 MC_SET_BIT(mcc->free_table, base_slot + i);
650 static inline void sss_mmap_set_rec_header(struct sss_mc_ctx *mcc,
658 rec->hash1 = sss_mc_hash(mcc, key1, key1_len);
659 rec->hash2 = sss_mc_hash(mcc, key2, key2_len);
662 static inline void sss_mmap_chain_in_rec(struct sss_mc_ctx *mcc,
666 sss_mc_add_rec_to_chain(mcc, rec, rec->hash1);
668 sss_mc_add_rec_to_chain(mcc, rec, rec->hash2);
675 static errno_t sss_mmap_cache_invalidate(struct sss_mc_ctx *mcc,
680 if (mcc == NULL) {
685 rec = sss_mc_find_record(mcc, key);
691 sss_mc_invalidate_rec(mcc, rec);
708 struct sss_mc_ctx *mcc = *_mcc;
718 if (mcc == NULL) {
733 if (rec_len > mcc->dt_size) {
748 sss_mmap_set_rec_header(mcc, rec, rec_len, mcc->valid_time_slot,
770 sss_mmap_chain_in_rec(mcc, rec);
775 errno_t sss_mmap_cache_pw_invalidate(struct sss_mc_ctx *mcc,
778 return sss_mmap_cache_invalidate(mcc, name);
781 errno_t sss_mmap_cache_pw_invalidate_uid(struct sss_mc_ctx *mcc, uid_t uid)
790 if (mcc == NULL) {
800 hash = sss_mc_hash(mcc, uidstr, strlen(uidstr) + 1);
802 slot = mcc->hash_table[hash];
803 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
809 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
811 sss_mc_save_corrupted(mcc);
812 sss_mmap_cache_reset(mcc);
817 rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
832 sss_mc_invalidate_rec(mcc, rec);
851 struct sss_mc_ctx *mcc = *_mcc;
861 if (mcc == NULL) {
876 if (rec_len > mcc->dt_size) {
891 sss_mmap_set_rec_header(mcc, rec, rec_len, mcc->valid_time_slot,
909 sss_mmap_chain_in_rec(mcc, rec);
914 errno_t sss_mmap_cache_gr_invalidate(struct sss_mc_ctx *mcc,
917 return sss_mmap_cache_invalidate(mcc, name);
920 errno_t sss_mmap_cache_gr_invalidate_gid(struct sss_mc_ctx *mcc, gid_t gid)
929 if (mcc == NULL) {
939 hash = sss_mc_hash(mcc, gidstr, strlen(gidstr) + 1);
941 slot = mcc->hash_table[hash];
942 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
948 if (!MC_SLOT_WITHIN_BOUNDS(slot, mcc->dt_size)) {
950 sss_mc_save_corrupted(mcc);
951 sss_mmap_cache_reset(mcc);
956 rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec);
971 sss_mc_invalidate_rec(mcc, rec);
986 struct sss_mc_ctx *mcc = *_mcc;
994 if (mcc == NULL) {
1003 if (rec_len > mcc->dt_size) {
1021 sss_mmap_set_rec_header(mcc, rec, rec_len, mcc->valid_time_slot,
1042 sss_mmap_chain_in_rec(mcc, rec);
1047 errno_t sss_mmap_cache_initgr_invalidate(struct sss_mc_ctx *mcc,
1050 return sss_mmap_cache_invalidate(mcc, name);
1228 time_t timeout, struct sss_mc_ctx **mcc)
1350 *mcc = mc_ctx;