Merge branch 'akpm' (patches from Andrew)
[sfrench/cifs-2.6.git] / fs / mbcache.c
index b8b8b9ced9f81c47a1f76da3ef61c2f9d4645c78..081ccf0caee35966477d8a2b801c19051fd2faf9 100644 (file)
@@ -94,6 +94,7 @@ int mb_cache_entry_create(struct mb_cache *cache, gfp_t mask, u32 key,
        entry->e_key = key;
        entry->e_value = value;
        entry->e_reusable = reusable;
+       entry->e_referenced = 0;
        head = mb_cache_entry_head(cache, key);
        hlist_bl_lock(head);
        hlist_bl_for_each_entry(dup, dup_node, head, e_hash_list) {
@@ -238,7 +239,9 @@ void mb_cache_entry_delete(struct mb_cache *cache, u32 key, u64 value)
                        spin_lock(&cache->c_list_lock);
                        if (!list_empty(&entry->e_list)) {
                                list_del_init(&entry->e_list);
-                               cache->c_entry_count--;
+                               if (!WARN_ONCE(cache->c_entry_count == 0,
+               "mbcache: attempt to decrement c_entry_count past zero"))
+                                       cache->c_entry_count--;
                                atomic_dec(&entry->e_refcnt);
                        }
                        spin_unlock(&cache->c_list_lock);
@@ -269,9 +272,6 @@ static unsigned long mb_cache_count(struct shrinker *shrink,
        struct mb_cache *cache = container_of(shrink, struct mb_cache,
                                              c_shrink);
 
-       /* Unlikely, but not impossible */
-       if (unlikely(cache->c_entry_count < 0))
-               return 0;
        return cache->c_entry_count;
 }
 
@@ -353,8 +353,9 @@ struct mb_cache *mb_cache_create(int bucket_bits)
        cache->c_max_entries = bucket_count << 4;
        INIT_LIST_HEAD(&cache->c_list);
        spin_lock_init(&cache->c_list_lock);
-       cache->c_hash = kmalloc(bucket_count * sizeof(struct hlist_bl_head),
-                               GFP_KERNEL);
+       cache->c_hash = kmalloc_array(bucket_count,
+                                     sizeof(struct hlist_bl_head),
+                                     GFP_KERNEL);
        if (!cache->c_hash) {
                kfree(cache);
                goto err_out;