summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-04-25 18:02:35 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:36:21 -0800
commit59e80ba6080182a854ed47ac9089348459c7a990 (patch)
treeddcc369accab3309ebfc9a4b5b97d93da69e80d7
parenta671023bafbcd2355812c8e7ad1978f4787a2217 (diff)
bcache: fix disk reservations + gc
-rw-r--r--drivers/md/bcache/buckets.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/md/bcache/buckets.c b/drivers/md/bcache/buckets.c
index fff3577075a6..61abd50ffd63 100644
--- a/drivers/md/bcache/buckets.c
+++ b/drivers/md/bcache/buckets.c
@@ -167,6 +167,11 @@ void bch_cache_set_stats_apply(struct cache_set *c,
}
lg_local_lock(&c->bucket_stats_lock);
+ /* sectors_online_reserved not subject to gc: */
+ this_cpu_ptr(c->bucket_stats_percpu)->sectors_online_reserved +=
+ stats->sectors_online_reserved;
+ stats->sectors_online_reserved = 0;
+
if (!gc_will_visit(c, gc_pos))
bucket_stats_add(this_cpu_ptr(c->bucket_stats_percpu), stats);
lg_local_unlock(&c->bucket_stats_lock);
@@ -513,7 +518,7 @@ void bch_recalc_sectors_available(struct cache_set *c)
lg_global_lock(&c->bucket_stats_lock);
for_each_possible_cpu(cpu)
- this_cpu_ptr(c->bucket_stats_percpu)->sectors_available_cache = 0;
+ per_cpu_ptr(c->bucket_stats_percpu, cpu)->sectors_available_cache = 0;
atomic64_set(&c->sectors_available,
__recalc_sectors_available(c));
@@ -524,9 +529,14 @@ void bch_recalc_sectors_available(struct cache_set *c)
void bch_disk_reservation_put(struct cache_set *c,
struct disk_reservation *res)
{
- this_cpu_sub(c->bucket_stats_percpu->sectors_online_reserved,
- res->sectors);
- res->sectors = 0;
+ if (res->sectors) {
+ lg_local_lock(&c->bucket_stats_lock);
+ this_cpu_sub(c->bucket_stats_percpu->sectors_online_reserved,
+ res->sectors);
+ lg_local_unlock(&c->bucket_stats_lock);
+
+ res->sectors = 0;
+ }
}
#define SECTORS_CACHE 1024