struct auth_domain * auth_domain_lookup(struct auth_domain *item, int set) { struct auth_domain *tmp = NULL; struct cache_head **hp, **head; head = &auth_domain_cache.hash_table[auth_domain_hash(item)]; if (set) write_lock(&auth_domain_cache.hash_lock); else read_lock(&auth_domain_cache.hash_lock); for (hp=head; *hp != NULL; hp = &tmp->h.next) { tmp = container_of(*hp, struct auth_domain, h); if (!auth_domain_match(tmp, item)) continue; cache_get(&tmp->h); if (!set) goto out_noset; *hp = tmp->h.next; tmp->h.next = NULL; clear_bit(CACHE_HASHED, &tmp->h.flags); auth_domain_drop(&tmp->h, &auth_domain_cache); goto out_set; } /* Didn't find anything */ if (!set) goto out_nada; auth_domain_cache.entries++; out_set: set_bit(CACHE_HASHED, &item->h.flags); item->h.next = *head; *head = &item->h; write_unlock(&auth_domain_cache.hash_lock); cache_fresh(&auth_domain_cache, &item->h, item->h.expiry_time); cache_get(&item->h); return item; out_nada: tmp = NULL; out_noset: read_unlock(&auth_domain_cache.hash_lock); return tmp; }
void auth_domain_put(struct auth_domain *dom) { auth_domain_drop(&dom->h, &auth_domain_cache); }