static struct mb2_cache_entry *__entry_find(struct mb2_cache *cache,
					    struct mb2_cache_entry *entry,
					    u32 key)
{
	struct mb2_cache_entry *old_entry = entry;
	struct hlist_bl_node *node;
	struct hlist_bl_head *head;

	if (entry)
		head = entry->e_hash_list_head;
	else
		head = &cache->c_hash[hash_32(key, cache->c_bucket_bits)];
	hlist_bl_lock(head);
	if (entry && !hlist_bl_unhashed(&entry->e_hash_list))
		node = entry->e_hash_list.next;
	else
		node = hlist_bl_first(head);
	while (node) {
		entry = hlist_bl_entry(node, struct mb2_cache_entry,
				       e_hash_list);
		if (entry->e_key == key) {
			atomic_inc(&entry->e_refcnt);
			goto out;
		}
		node = node->next;
	}
	entry = NULL;
out:
	hlist_bl_unlock(head);
	if (old_entry)
		mb2_cache_entry_put(cache, old_entry);

	return entry;
}
static struct mb2_cache_entry *__entry_find(struct mb2_cache *cache,
					    struct mb2_cache_entry *entry,
					    u32 key)
{
	struct mb2_cache_entry *old_entry = entry;
	struct hlist_bl_node *node;
	struct hlist_bl_head *head;

	if (entry)
		head = entry->e_hash_list_head;
	else
		head = &cache->c_hash[hash_32(key, cache->c_bucket_bits)];
	hlist_bl_lock(head);
	if (entry && !hlist_bl_unhashed(&entry->e_hash_list))
		node = entry->e_hash_list.next;
	else
		node = hlist_bl_first(head);
	while (node) {
		entry = hlist_bl_entry(node, struct mb2_cache_entry,
				       e_hash_list);
		if (entry->e_key == key) {
			atomic_inc(&entry->e_refcnt);
			goto out;
		}
		node = node->next;
	}
	entry = NULL;
out:
	hlist_bl_unlock(head);
	if (old_entry)
		mb2_cache_entry_put(cache, old_entry);

	return entry;
}