__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 <kent.overstreet@linux.dev>
        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))
 
                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 &&                                \