]> Git Repo - linux.git/commitdiff
bcachefs: Fix fsck warnings from bkey validation
authorKent Overstreet <[email protected]>
Thu, 26 Sep 2024 20:51:19 +0000 (16:51 -0400)
committerKent Overstreet <[email protected]>
Sat, 28 Sep 2024 01:46:35 +0000 (21:46 -0400)
__bch2_fsck_err() warns if the current task has a btree_trans object and
it wasn't passed in, because if it has to prompt for user input it has
to be able to unlock it.

But plumbing the btree_trans through bkey_validate(), as well as
transaction restarts, is problematic - so instead make bkey fsck errors
FSCK_AUTOFIX, which doesn't need to warn.

Signed-off-by: Kent Overstreet <[email protected]>
fs/bcachefs/error.c
fs/bcachefs/error.h

index 95afa7bf20205c653bc2dd7cde3188d00fe2ce12..3a16b535b6c324e7ecfc84aacd943a28c0e4ae11 100644 (file)
@@ -239,7 +239,19 @@ int __bch2_fsck_err(struct bch_fs *c,
        if (!c)
                c = trans->c;
 
-       WARN_ON(!trans && bch2_current_has_btree_trans(c));
+       /*
+        * Ugly: if there's a transaction in the current task it has to be
+        * passed in to unlock if we prompt for user input.
+        *
+        * But, plumbing a transaction and transaction restarts into
+        * bkey_validate() is problematic.
+        *
+        * So:
+        * - make all bkey errors AUTOFIX, they're simple anyways (we just
+        *   delete the key)
+        * - and we don't need to warn if we're not prompting
+        */
+       WARN_ON(!(flags & FSCK_AUTOFIX) && !trans && bch2_current_has_btree_trans(c));
 
        if ((flags & FSCK_CAN_FIX) &&
            test_bit(err, c->sb.errors_silent))
index 2f1b86978f3660e1b001504b8b403e951c30e0c9..21ee7211b03e8d708166a15ac5aaf388c4bab4c5 100644 (file)
@@ -184,7 +184,7 @@ do {                                                                        \
                ret = -BCH_ERR_fsck_delete_bkey;                        \
                goto fsck_err;                                          \
        }                                                               \
-       int _ret = __bch2_bkey_fsck_err(c, k, FSCK_CAN_FIX,             \
+       int _ret = __bch2_bkey_fsck_err(c, k, FSCK_CAN_FIX|FSCK_AUTOFIX,\
                                BCH_FSCK_ERR_##_err_type,               \
                                _err_msg, ##__VA_ARGS__);               \
        if (_ret != -BCH_ERR_fsck_fix &&                                \
This page took 0.058512 seconds and 4 git commands to generate.