]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: btree_root_unreadable_and_scan_found_nothing autofix for non data btrees
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 29 Apr 2025 00:12:01 +0000 (20:12 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 29 Apr 2025 02:42:17 +0000 (22:42 -0400)
If loosing a btree won't cause data loss - i.e. it's an alloc btree, or
we can easily reconstruct it - we shouldn't require user action to
continue repair.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c

index 7b98ba2dec64725b0b77e42af3fbd62e275771e2..37b69d89341f4ff9bfb223196551ef711ea2ed90 100644 (file)
 #define DROP_PREV_NODE         11
 #define DID_FILL_FROM_SCAN     12
 
+/*
+ * Returns true if it's a btree we can easily reconstruct, or otherwise won't
+ * cause data loss if it's missing:
+ */
+static bool btree_id_important(enum btree_id btree)
+{
+       if (btree_id_is_alloc(btree))
+               return false;
+
+       switch (btree) {
+       case BTREE_ID_quotas:
+       case BTREE_ID_snapshot_trees:
+       case BTREE_ID_logged_ops:
+       case BTREE_ID_rebalance_work:
+       case BTREE_ID_subvolume_children:
+               return false;
+       default:
+               return true;
+       }
+}
+
 static const char * const bch2_gc_phase_strs[] = {
 #define x(n)   #n,
        GC_PHASES()
@@ -534,8 +555,10 @@ reconstruct_root:
                        r->error = 0;
 
                        if (!bch2_btree_has_scanned_nodes(c, i)) {
-                               mustfix_fsck_err(trans, btree_root_unreadable_and_scan_found_nothing,
-                                                "no nodes found for btree %s, continue?", buf.buf);
+                               __fsck_err(trans,
+                                          FSCK_CAN_FIX|(!btree_id_important(i) ? FSCK_AUTOFIX : 0),
+                                          btree_root_unreadable_and_scan_found_nothing,
+                                          "no nodes found for btree %s, continue?", buf.buf);
                                bch2_btree_root_alloc_fake_trans(trans, i, 0);
                        } else {
                                bch2_btree_root_alloc_fake_trans(trans, i, 1);