From: Nikita Ofitserov <himi...@gmail.com>

Also, consider the metadata_replicas option when better
accounting is not available.

Signed-off-by: Nikita Ofitserov <himi...@gmail.com>
---
 fs/bcachefs/progress.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/fs/bcachefs/progress.c b/fs/bcachefs/progress.c
index 
541ee951d1c9fc3f11b5a5ac40f1d366829a5c97..8181f6d2ca3808f57bef179383bd969d9a375d5f
 100644
--- a/fs/bcachefs/progress.c
+++ b/fs/bcachefs/progress.c
@@ -12,6 +12,10 @@ void bch2_progress_init(struct progress_indicator_state *s,
 
        s->next_print = jiffies + HZ * 10;
 
+       /* This is only an estimation: nodes can have different replica counts 
*/
+       const u32 expected_node_disk_sectors =
+               READ_ONCE(c->opts.metadata_replicas) * btree_sectors(c);
+
        for (unsigned i = 0; i < btree_id_nr_alive(c); i++) {
                if (!(btree_id_mask & BIT_ULL(i)))
                        continue;
@@ -19,9 +23,23 @@ void bch2_progress_init(struct progress_indicator_state *s,
                struct disk_accounting_pos acc;
                disk_accounting_key_init(acc, btree, .id = i);
 
-               u64 v;
-               bch2_accounting_mem_read(c, disk_accounting_pos_to_bpos(&acc), 
&v, 1);
-               s->nodes_total += div64_ul(v, btree_sectors(c));
+               struct {
+                       u64 disk_sectors;
+                       u64 total_nodes;
+                       u64 inner_nodes;
+               } v = {0};
+               bch2_accounting_mem_read(c, disk_accounting_pos_to_bpos(&acc),
+                       (u64 *)&v, sizeof(v) / sizeof(u64));
+
+               /*
+                * We check for zeros to degrade gracefully when run
+                * with un-upgraded accounting info (missing some counters).
+                */
+
+               if (v.total_nodes != 0)
+                       s->nodes_total += v.total_nodes - v.inner_nodes;
+               else
+                       s->nodes_total += div_u64(v.disk_sectors, 
expected_node_disk_sectors);
        }
 }
 

-- 
2.50.1



Reply via email to