/* @cache: the cache to search @index: the number of the additonal index to search (0<=index<indexes_count) @bdev: the device the cache entry should belong to @key: the key in the index  */
struct mb_cache_entry* mb_cache_entry_find_first(struct mb_cache *cache, int index, struct block_device *bdev, unsigned int key)
/* @cache: the cache to search @index: the number of the additonal index to search (0<=index<indexes_count) @bdev: the device the cache entry should belong to @key: the key in the index  */
struct mb_cache_entry* mb_cache_entry_find_first(struct mb_cache *cache, int index, struct block_device *bdev, unsigned int key)
{
	unsigned int bucket = hash_long(key, cache->c_bucket_bits);
	struct list_head *l;
	struct mb_cache_entry *ce;
	mb_assert(index < mb_cache_indexes(cache));
	spin_lock(&mb_cache_spinlock);
	l = cache->c_indexes_hash[index][bucket].next;
	ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket],
	                           index, bdev, key);
	spin_unlock(&mb_cache_spinlock);
	return ce;
}