bcachefs: initial gc no longer needs to touch every node
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 5 Apr 2019 03:01:54 +0000 (23:01 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:20 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c

index c572391c4dad9bed29ec70cc70ea5c7da452d85e..84a0bb9202c46173ed1f229bcc3af16c76e5d1e7 100644 (file)
@@ -210,7 +210,10 @@ static int bch2_gc_btree(struct bch_fs *c, enum btree_id btree_id,
        struct btree_iter *iter;
        struct btree *b;
        struct range_checks r;
-       unsigned depth = btree_node_type_needs_gc(btree_id) ? 0 : 1;
+       unsigned depth = metadata_only                  ? 1
+               : expensive_debug_checks(c)             ? 0
+               : !btree_node_type_needs_gc(btree_id)   ? 1
+               : 0;
        u8 max_stale;
        int ret = 0;
 
@@ -218,17 +221,6 @@ static int bch2_gc_btree(struct bch_fs *c, enum btree_id btree_id,
 
        gc_pos_set(c, gc_pos_btree(btree_id, POS_MIN, 0));
 
-       /*
-        * if expensive_debug_checks is on, run range_checks on all leaf nodes:
-        *
-        * and on startup, we have to read every btree node (XXX: only if it was
-        * an unclean shutdown)
-        */
-       if (metadata_only)
-               depth = 1;
-       else if (initial || expensive_debug_checks(c))
-               depth = 0;
-
        btree_node_range_checks_init(&r, depth);
 
        __for_each_btree_node(&trans, iter, btree_id, POS_MIN,