Merge branch 'for-4.15/block' of git://git.kernel.dk/linux-block
[sfrench/cifs-2.6.git] / drivers / md / bcache / btree.c
index 658c54b3b07a96e8f53b73b1e30eba117e2a2274..11c5503d31dc3029df2cde14f8f9e9fc48514bc2 100644 (file)
@@ -1241,6 +1241,11 @@ void bch_initial_mark_key(struct cache_set *c, int level, struct bkey *k)
        __bch_btree_mark_key(c, level, k);
 }
 
+void bch_update_bucket_in_use(struct cache_set *c, struct gc_stat *stats)
+{
+       stats->in_use = (c->nbuckets - c->avail_nbuckets) * 100 / c->nbuckets;
+}
+
 static bool btree_gc_mark_node(struct btree *b, struct gc_stat *gc)
 {
        uint8_t stale = 0;
@@ -1652,9 +1657,8 @@ static void btree_gc_start(struct cache_set *c)
        mutex_unlock(&c->bucket_lock);
 }
 
-static size_t bch_btree_gc_finish(struct cache_set *c)
+static void bch_btree_gc_finish(struct cache_set *c)
 {
-       size_t available = 0;
        struct bucket *b;
        struct cache *ca;
        unsigned i;
@@ -1691,6 +1695,7 @@ static size_t bch_btree_gc_finish(struct cache_set *c)
        }
        rcu_read_unlock();
 
+       c->avail_nbuckets = 0;
        for_each_cache(ca, c, i) {
                uint64_t *i;
 
@@ -1712,18 +1717,16 @@ static size_t bch_btree_gc_finish(struct cache_set *c)
                        BUG_ON(!GC_MARK(b) && GC_SECTORS_USED(b));
 
                        if (!GC_MARK(b) || GC_MARK(b) == GC_MARK_RECLAIMABLE)
-                               available++;
+                               c->avail_nbuckets++;
                }
        }
 
        mutex_unlock(&c->bucket_lock);
-       return available;
 }
 
 static void bch_btree_gc(struct cache_set *c)
 {
        int ret;
-       unsigned long available;
        struct gc_stat stats;
        struct closure writes;
        struct btree_op op;
@@ -1746,14 +1749,14 @@ static void bch_btree_gc(struct cache_set *c)
                        pr_warn("gc failed!");
        } while (ret);
 
-       available = bch_btree_gc_finish(c);
+       bch_btree_gc_finish(c);
        wake_up_allocators(c);
 
        bch_time_stats_update(&c->btree_gc_time, start_time);
 
        stats.key_bytes *= sizeof(uint64_t);
        stats.data      <<= 9;
-       stats.in_use    = (c->nbuckets - available) * 100 / c->nbuckets;
+       bch_update_bucket_in_use(c, &stats);
        memcpy(&c->gc_stats, &stats, sizeof(struct gc_stat));
 
        trace_bcache_gc_end(c);