示例#1
0
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);
}