[PATCH 20/21] bcachefs: bch2_fs_accounting_to_text()

From: Kent Overstreet
Date: Sat Feb 24 2024 - 21:42:36 EST


Helper to show raw accounting in sysfs, mainly for debugging.

Signed-off-by: Kent Overstreet <kent.overstreet@xxxxxxxxx>
---
fs/bcachefs/disk_accounting.c | 26 ++++++++++++++++++++++++++
fs/bcachefs/disk_accounting.h | 1 +
fs/bcachefs/sysfs.c | 5 +++++
3 files changed, 32 insertions(+)

diff --git a/fs/bcachefs/disk_accounting.c b/fs/bcachefs/disk_accounting.c
index dc020d651d0a..9d6ca2ea307b 100644
--- a/fs/bcachefs/disk_accounting.c
+++ b/fs/bcachefs/disk_accounting.c
@@ -286,6 +286,32 @@ int bch2_fs_replicas_usage_read(struct bch_fs *c, darray_char *usage)
return ret;
}

+void bch2_fs_accounting_to_text(struct printbuf *out, struct bch_fs *c)
+{
+ struct bch_accounting_mem *acc = &c->accounting[0];
+
+ percpu_down_read(&c->mark_lock);
+ out->atomic++;
+
+ eytzinger0_for_each(i, acc->k.nr) {
+ struct disk_accounting_key acc_k;
+ bpos_to_disk_accounting_key(&acc_k, acc->k.data[i].pos);
+
+ bch2_accounting_key_to_text(out, &acc_k);
+
+ u64 v[BCH_ACCOUNTING_MAX_COUNTERS];
+ bch2_accounting_mem_read_counters(c, i, v, ARRAY_SIZE(v), false);
+
+ prt_str(out, ":");
+ for (unsigned j = 0; j < acc->k.data[i].nr_counters; j++)
+ prt_printf(out, " %llu", v[j]);
+ prt_newline(out);
+ }
+
+ --out->atomic;
+ percpu_up_read(&c->mark_lock);
+}
+
static int accounting_write_key(struct btree_trans *trans, struct bpos pos, u64 *v, unsigned nr_counters)
{
struct bkey_i_accounting *a = bch2_trans_kmalloc(trans, sizeof(*a) + sizeof(*v) * nr_counters);
diff --git a/fs/bcachefs/disk_accounting.h b/fs/bcachefs/disk_accounting.h
index a0cf7a0b84a7..c4a8b9cce6ba 100644
--- a/fs/bcachefs/disk_accounting.h
+++ b/fs/bcachefs/disk_accounting.h
@@ -186,6 +186,7 @@ static inline void bch2_accounting_mem_read(struct bch_fs *c, struct bpos p,
}

int bch2_fs_replicas_usage_read(struct bch_fs *, darray_char *);
+void bch2_fs_accounting_to_text(struct printbuf *, struct bch_fs *);

int bch2_accounting_gc_done(struct bch_fs *);

diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c
index 287a0bf920db..10470cef30f0 100644
--- a/fs/bcachefs/sysfs.c
+++ b/fs/bcachefs/sysfs.c
@@ -204,6 +204,7 @@ read_attribute(disk_groups);

read_attribute(has_data);
read_attribute(alloc_debug);
+read_attribute(accounting);

#define x(t, n, ...) read_attribute(t);
BCH_PERSISTENT_COUNTERS()
@@ -413,6 +414,9 @@ SHOW(bch2_fs)
if (attr == &sysfs_disk_groups)
bch2_disk_groups_to_text(out, c);

+ if (attr == &sysfs_accounting)
+ bch2_fs_accounting_to_text(out, c);
+
return 0;
}

@@ -625,6 +629,7 @@ struct attribute *bch2_fs_internal_files[] = {
&sysfs_internal_uuid,

&sysfs_disk_groups,
+ &sysfs_accounting,
NULL
};

--
2.43.0