diff options
Diffstat (limited to 'fs/bcachefs/buckets.c')
-rw-r--r-- | fs/bcachefs/buckets.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c index ba2fe909cb0a..4fa131a113eb 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -131,6 +131,8 @@ void bch2_fs_usage_initialize(struct bch_fs *c) switch (e->data_type) { case BCH_DATA_BTREE: + usage->btree += usage->replicas[i]; + break; case BCH_DATA_USER: usage->data += usage->replicas[i]; break; @@ -225,6 +227,7 @@ static u64 avail_factor(u64 r) u64 bch2_fs_sectors_used(struct bch_fs *c, struct bch_fs_usage *fs_usage) { return min(fs_usage->hidden + + fs_usage->btree + fs_usage->data + reserve_factor(fs_usage->reserved + fs_usage->online_reserved), @@ -240,7 +243,8 @@ __bch2_fs_usage_read_short(struct bch_fs *c) ret.capacity = c->capacity - percpu_u64_get(&c->usage[0]->hidden); - data = percpu_u64_get(&c->usage[0]->data); + data = percpu_u64_get(&c->usage[0]->data) + + percpu_u64_get(&c->usage[0]->btree); reserved = percpu_u64_get(&c->usage[0]->reserved) + percpu_u64_get(&c->usage[0]->online_reserved); @@ -383,21 +387,32 @@ static void bch2_dev_usage_update(struct bch_fs *c, struct bch_dev *ca, bch2_wake_allocator(ca); } -void bch2_dev_usage_from_buckets(struct bch_fs *c, struct bch_dev *ca) +void bch2_dev_usage_from_buckets(struct bch_fs *c) { + struct bch_dev *ca; struct bucket_mark old = { .v.counter = 0 }; struct bch_fs_usage *fs_usage; struct bucket_array *buckets; struct bucket *g; + unsigned i; + int cpu; - percpu_down_read_preempt_disable(&c->mark_lock); - fs_usage = this_cpu_ptr(c->usage[0]); - buckets = bucket_array(ca); + percpu_u64_set(&c->usage[0]->hidden, 0); - for_each_bucket(g, buckets) - if (g->mark.data_type) - bch2_dev_usage_update(c, ca, fs_usage, old, g->mark, false); - percpu_up_read_preempt_enable(&c->mark_lock); + for_each_member_device(ca, c, i) { + for_each_possible_cpu(cpu) + memset(per_cpu_ptr(ca->usage[0], cpu), 0, + sizeof(*ca->usage[0])); + + preempt_disable(); + fs_usage = this_cpu_ptr(c->usage[0]); + buckets = bucket_array(ca); + + for_each_bucket(g, buckets) + bch2_dev_usage_update(c, ca, fs_usage, + old, g->mark, false); + preempt_enable(); + } } #define bucket_data_cmpxchg(c, ca, fs_usage, g, new, expr) \ @@ -418,10 +433,17 @@ static inline void update_replicas(struct bch_fs *c, BUG_ON(idx < 0); BUG_ON(!sectors); - if (r->data_type == BCH_DATA_CACHED) - fs_usage->cached += sectors; - else + switch (r->data_type) { + case BCH_DATA_BTREE: + fs_usage->btree += sectors; + break; + case BCH_DATA_USER: fs_usage->data += sectors; + break; + case BCH_DATA_CACHED: + fs_usage->cached += sectors; + break; + } fs_usage->replicas[idx] += sectors; } |