bcachefs: move root node topo checks to node_check_topology()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 7 Apr 2024 03:26:36 +0000 (23:26 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:18 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c
fs/bcachefs/btree_update_interior.c

index b86a821f388a02fb90b0166f6892d1a0df484e07..6b466b2ebebec3da4721b7d4c26d222d70b05a97 100644 (file)
@@ -996,36 +996,16 @@ static int bch2_gc_btree_init(struct btree_trans *trans,
                              enum btree_id btree_id)
 {
        struct bch_fs *c = trans->c;
-       struct btree *b;
        /*
         * We need to make sure every leaf node is readable before going RW
        unsigned target_depth = btree_node_type_needs_gc(__btree_node_type(0, btree_id)) ? 0 : 1;
        */
        unsigned target_depth = 0;
-       struct printbuf buf = PRINTBUF;
        int ret = 0;
 
-       b = bch2_btree_id_root(c, btree_id)->b;
+       struct btree *b = bch2_btree_id_root(c, btree_id)->b;
 
        six_lock_read(&b->c.lock, NULL, NULL);
-       printbuf_reset(&buf);
-       bch2_bpos_to_text(&buf, b->data->min_key);
-       if (mustfix_fsck_err_on(!bpos_eq(b->data->min_key, POS_MIN), c,
-                               btree_root_bad_min_key,
-                       "btree root with incorrect min_key: %s", buf.buf)) {
-               ret = bch2_run_explicit_recovery_pass(c, BCH_RECOVERY_PASS_check_topology);
-               goto fsck_err;
-       }
-
-       printbuf_reset(&buf);
-       bch2_bpos_to_text(&buf, b->data->max_key);
-       if (mustfix_fsck_err_on(!bpos_eq(b->data->max_key, SPOS_MAX), c,
-                               btree_root_bad_max_key,
-                       "btree root with incorrect max_key: %s", buf.buf)) {
-               ret = bch2_run_explicit_recovery_pass(c, BCH_RECOVERY_PASS_check_topology);
-               goto fsck_err;
-       }
-
        if (b->c.level >= target_depth)
                ret = bch2_gc_btree_init_recurse(trans, b, target_depth);
 
@@ -1035,11 +1015,9 @@ static int bch2_gc_btree_init(struct btree_trans *trans,
                ret = bch2_gc_mark_key(trans, b->c.btree_id, b->c.level + 1, true,
                                       &k, true);
        }
-fsck_err:
        six_unlock_read(&b->c.lock);
 
        bch_err_fn(c, ret);
-       printbuf_exit(&buf);
        return ret;
 }
 
index b4efd8cc4d1a2bfc62a9742d6f4df3e9a0f0aac5..875b1795e40867aa3b94b7e91a2d030a959f161e 100644 (file)
@@ -73,6 +73,24 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
               !bpos_eq(bkey_i_to_btree_ptr_v2(&b->key)->v.min_key,
                        b->data->min_key));
 
+       if (b == btree_node_root(c, b)) {
+               if (!bpos_eq(b->data->min_key, POS_MIN)) {
+                       printbuf_reset(&buf);
+                       bch2_bpos_to_text(&buf, b->data->min_key);
+                       need_fsck_err(c, btree_root_bad_min_key,
+                                     "btree root with incorrect min_key: %s", buf.buf);
+                       goto topology_repair;
+               }
+
+               if (!bpos_eq(b->data->max_key, SPOS_MAX)) {
+                       printbuf_reset(&buf);
+                       bch2_bpos_to_text(&buf, b->data->max_key);
+                       need_fsck_err(c, btree_root_bad_max_key,
+                                     "btree root with incorrect max_key: %s", buf.buf);
+                       goto topology_repair;
+               }
+       }
+
        if (!b->c.level)
                return 0;