48 lines
1.6 KiB
Diff
48 lines
1.6 KiB
Diff
From ba91f39cd42bcfac86b9a7165d56b6964c314c81 Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Sun, 24 Nov 2024 22:28:41 -0500
|
|
Subject: [PATCH 119/233] bcachefs: Fix accounting_read when we rewind
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
If we rewind recovery to run topology repair, that causes
|
|
accounting_read to run twice.
|
|
|
|
This fixes accounting being double counted.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/disk_accounting.c | 15 +++++++++++++++
|
|
1 file changed, 15 insertions(+)
|
|
|
|
diff --git a/fs/bcachefs/disk_accounting.c b/fs/bcachefs/disk_accounting.c
|
|
index fa821d278c45..bb5dbbf71d04 100644
|
|
--- a/fs/bcachefs/disk_accounting.c
|
|
+++ b/fs/bcachefs/disk_accounting.c
|
|
@@ -700,6 +700,21 @@ int bch2_accounting_read(struct bch_fs *c)
|
|
struct btree_trans *trans = bch2_trans_get(c);
|
|
struct printbuf buf = PRINTBUF;
|
|
|
|
+ /*
|
|
+ * We might run more than once if we rewind to start topology repair or
|
|
+ * btree node scan - and those might cause us to get different results,
|
|
+ * so we can't just skip if we've already run.
|
|
+ *
|
|
+ * Instead, zero out any accounting we have:
|
|
+ */
|
|
+ percpu_down_write(&c->mark_lock);
|
|
+ darray_for_each(acc->k, e)
|
|
+ percpu_memset(e->v[0], 0, sizeof(u64) * e->nr_counters);
|
|
+ for_each_member_device(c, ca)
|
|
+ percpu_memset(ca->usage, 0, sizeof(*ca->usage));
|
|
+ percpu_memset(c->usage, 0, sizeof(*c->usage));
|
|
+ percpu_up_write(&c->mark_lock);
|
|
+
|
|
int ret = for_each_btree_key(trans, iter,
|
|
BTREE_ID_accounting, POS_MIN,
|
|
BTREE_ITER_prefetch|BTREE_ITER_all_snapshots, k, ({
|
|
--
|
|
2.45.2
|
|
|