bcachefs: bkey errors are only AUTOFIX during read
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 4 Oct 2024 19:05:40 +0000 (15:05 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 5 Oct 2024 00:25:31 +0000 (20:25 -0400)
Newly generated keys, in the transaction commit path or write path,
should not be AUTOFIX; those indicate bugs that we need to fail fast
for.

Fixes: 5612daafb764 ("bcachefs: Fix fsck warnings from bkey validation")
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/error.c
fs/bcachefs/error.h

index 3a16b535b6c324e7ecfc84aacd943a28c0e4ae11..aac1960321b770d19416deaf9ec44ff83ad3dd72 100644 (file)
@@ -430,10 +430,17 @@ err:
 
 int __bch2_bkey_fsck_err(struct bch_fs *c,
                         struct bkey_s_c k,
-                        enum bch_fsck_flags flags,
+                        enum bch_validate_flags validate_flags,
                         enum bch_sb_error_id err,
                         const char *fmt, ...)
 {
+       if (validate_flags & BCH_VALIDATE_silent)
+               return -BCH_ERR_fsck_delete_bkey;
+
+       unsigned fsck_flags = 0;
+       if (!(validate_flags & (BCH_VALIDATE_write|BCH_VALIDATE_commit)))
+               fsck_flags |= FSCK_AUTOFIX|FSCK_CAN_FIX;
+
        struct printbuf buf = PRINTBUF;
        va_list args;
 
@@ -445,7 +452,7 @@ int __bch2_bkey_fsck_err(struct bch_fs *c,
        va_end(args);
        prt_str(&buf, ": delete?");
 
-       int ret = __bch2_fsck_err(c, NULL, flags, err, "%s", buf.buf);
+       int ret = __bch2_fsck_err(c, NULL, fsck_flags, err, "%s", buf.buf);
        printbuf_exit(&buf);
        return ret;
 }
index 21ee7211b03e8d708166a15ac5aaf388c4bab4c5..6551ada926b607b5d49f901402c26e314fbc45a4 100644 (file)
@@ -167,10 +167,11 @@ void bch2_flush_fsck_errs(struct bch_fs *);
 #define fsck_err_on(cond, c, _err_type, ...)                           \
        __fsck_err_on(cond, c, FSCK_CAN_FIX|FSCK_CAN_IGNORE, _err_type, __VA_ARGS__)
 
+enum bch_validate_flags;
 __printf(5, 6)
 int __bch2_bkey_fsck_err(struct bch_fs *,
                         struct bkey_s_c,
-                        enum bch_fsck_flags,
+                        enum bch_validate_flags,
                         enum bch_sb_error_id,
                         const char *, ...);
 
@@ -180,11 +181,7 @@ int __bch2_bkey_fsck_err(struct bch_fs *,
  */
 #define bkey_fsck_err(c, _err_type, _err_msg, ...)                     \
 do {                                                                   \
-       if ((flags & BCH_VALIDATE_silent)) {                            \
-               ret = -BCH_ERR_fsck_delete_bkey;                        \
-               goto fsck_err;                                          \
-       }                                                               \
-       int _ret = __bch2_bkey_fsck_err(c, k, FSCK_CAN_FIX|FSCK_AUTOFIX,\
+       int _ret = __bch2_bkey_fsck_err(c, k, flags,                    \
                                BCH_FSCK_ERR_##_err_type,               \
                                _err_msg, ##__VA_ARGS__);               \
        if (_ret != -BCH_ERR_fsck_fix &&                                \