bcachefs: Kill bch2_fs_bug()
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 4 Jan 2020 21:09:52 +0000 (16:09 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:34 +0000 (17:08 -0400)
These have all been converted to fsck/inconsistent errors

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bkey_methods.c
fs/bcachefs/error.h
fs/bcachefs/extents.c

index ed448fad83c5aba967d659d6e5ed8a647247842b..320e17d108d2660b93ecab1a119e90113ff82f1a 100644 (file)
@@ -156,7 +156,7 @@ void bch2_bkey_debugcheck(struct bch_fs *c, struct btree *b, struct bkey_s_c k)
                char buf[160];
 
                bch2_bkey_val_to_text(&PBUF(buf), c, k);
-               bch2_fs_bug(c, "invalid bkey %s: %s", buf, invalid);
+               bch2_fs_inconsistent(c, "invalid bkey %s: %s", buf, invalid);
                return;
        }
 
index 7dcb0f6552fcc9f5090d233324d33c0e429f327f..de319794ccd10b20f12219dcb0430948648fc977 100644 (file)
@@ -16,26 +16,6 @@ struct work_struct;
 
 /* Error messages: */
 
-/*
- * Very fatal logic/inconsistency errors: these indicate that we've majorly
- * screwed up at runtime, i.e. it's not likely that it was just caused by the
- * data on disk being inconsistent. These BUG():
- *
- * XXX: audit and convert to inconsistent() checks
- */
-
-#define bch2_fs_bug(c, ...)                                            \
-do {                                                                   \
-       bch_err(c, __VA_ARGS__);                                        \
-       BUG();                                                          \
-} while (0)
-
-#define bch2_fs_bug_on(cond, c, ...)                                   \
-do {                                                                   \
-       if (cond)                                                       \
-               bch2_fs_bug(c, __VA_ARGS__);                            \
-} while (0)
-
 /*
  * Inconsistency errors: The on disk data is inconsistent. If these occur during
  * initial recovery, they don't indicate a bug in the running code - we walk all
index 8322b043bdffd4519d6ef41f2077ca171b27c0e0..ce94e38c0277acfe1f22255c216263a9ad36698a 100644 (file)
@@ -171,14 +171,17 @@ void bch2_btree_ptr_debugcheck(struct bch_fs *c, struct bkey_s_c k)
        struct bucket_mark mark;
        struct bch_dev *ca;
 
-       bch2_fs_bug_on(!test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) &&
-                      !bch2_bkey_replicas_marked(c, k, false), c,
-                      "btree key bad (replicas not marked in superblock):\n%s",
-                      (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf));
-
        if (!test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags))
                return;
 
+       if (!percpu_down_read_trylock(&c->mark_lock))
+               return;
+
+       bch2_fs_inconsistent_on(!test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) &&
+               !bch2_bkey_replicas_marked(c, k, false), c,
+               "btree key bad (replicas not marked in superblock):\n%s",
+               (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf));
+
        bkey_for_each_ptr(ptrs, ptr) {
                ca = bch_dev_bkey_exists(c, ptr->dev);
 
@@ -193,13 +196,15 @@ void bch2_btree_ptr_debugcheck(struct bch_fs *c, struct bkey_s_c k)
                    mark.dirty_sectors < c->opts.btree_node_size)
                        goto err;
        }
-
+out:
+       percpu_up_read(&c->mark_lock);
        return;
 err:
-       bch2_bkey_val_to_text(&PBUF(buf), c, k);
-       bch2_fs_bug(c, "%s btree pointer %s: bucket %zi gen %i mark %08x",
-                   err, buf, PTR_BUCKET_NR(ca, ptr),
-                   mark.gen, (unsigned) mark.v.counter);
+       bch2_fs_inconsistent(c, "%s btree pointer %s: bucket %zi gen %i mark %08x",
+               err, (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf),
+               PTR_BUCKET_NR(ca, ptr),
+               mark.gen, (unsigned) mark.v.counter);
+       goto out;
 }
 
 void bch2_btree_ptr_to_text(struct printbuf *out, struct bch_fs *c,
@@ -222,29 +227,18 @@ void bch2_extent_debugcheck(struct bch_fs *c, struct bkey_s_c k)
        struct extent_ptr_decoded p;
        char buf[160];
 
-       /*
-        * XXX: we should be doing most/all of these checks at startup time,
-        * where we check bch2_bkey_invalid() in btree_node_read_done()
-        *
-        * But note that we can't check for stale pointers or incorrect gc marks
-        * until after journal replay is done (it might be an extent that's
-        * going to get overwritten during replay)
-        */
-
-       if (percpu_down_read_trylock(&c->mark_lock)) {
-               bch2_fs_bug_on(!test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) &&
-                              !bch2_bkey_replicas_marked_locked(c, e.s_c, false), c,
-                              "extent key bad (replicas not marked in superblock):\n%s",
-                              (bch2_bkey_val_to_text(&PBUF(buf), c, e.s_c), buf));
-               percpu_up_read(&c->mark_lock);
-       }
-       /*
-        * If journal replay hasn't finished, we might be seeing keys
-        * that will be overwritten by the time journal replay is done:
-        */
-       if (!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags))
+       if (!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags) ||
+           !test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags))
                return;
 
+       if (!percpu_down_read_trylock(&c->mark_lock))
+               return;
+
+       bch2_fs_inconsistent_on(!test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) &&
+               !bch2_bkey_replicas_marked_locked(c, e.s_c, false), c,
+               "extent key bad (replicas not marked in superblock):\n%s",
+               (bch2_bkey_val_to_text(&PBUF(buf), c, e.s_c), buf));
+
        extent_for_each_ptr_decode(e, p, entry) {
                struct bch_dev *ca      = bch_dev_bkey_exists(c, p.ptr.dev);
                struct bucket_mark mark = ptr_bucket_mark(ca, &p.ptr);
@@ -254,21 +248,24 @@ void bch2_extent_debugcheck(struct bch_fs *c, struct bkey_s_c k)
                        ? mark.cached_sectors
                        : mark.dirty_sectors;
 
-               bch2_fs_bug_on(stale && !p.ptr.cached, c,
-                              "stale dirty pointer (ptr gen %u bucket %u",
-                              p.ptr.gen, mark.gen);
-
-               bch2_fs_bug_on(stale > 96, c, "key too stale: %i", stale);
-
-               bch2_fs_bug_on(!stale &&
-                              (mark.data_type != BCH_DATA_USER ||
-                               mark_sectors < disk_sectors), c,
-                              "extent pointer not marked: %s:\n"
-                              "type %u sectors %u < %u",
-                              (bch2_bkey_val_to_text(&PBUF(buf), c, e.s_c), buf),
-                              mark.data_type,
-                              mark_sectors, disk_sectors);
+               bch2_fs_inconsistent_on(stale && !p.ptr.cached, c,
+                       "stale dirty pointer (ptr gen %u bucket %u",
+                       p.ptr.gen, mark.gen);
+
+               bch2_fs_inconsistent_on(stale > 96, c,
+                       "key too stale: %i", stale);
+
+               bch2_fs_inconsistent_on(!stale &&
+                       (mark.data_type != BCH_DATA_USER ||
+                        mark_sectors < disk_sectors), c,
+                       "extent pointer not marked: %s:\n"
+                       "type %u sectors %u < %u",
+                       (bch2_bkey_val_to_text(&PBUF(buf), c, e.s_c), buf),
+                       mark.data_type,
+                       mark_sectors, disk_sectors);
        }
+
+       percpu_up_read(&c->mark_lock);
 }
 
 void bch2_extent_to_text(struct printbuf *out, struct bch_fs *c,