summaryrefslogtreecommitdiff
path: root/fs/bcachefs/buckets.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/buckets.c')
-rw-r--r--fs/bcachefs/buckets.c46
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;
}