Commit 658c82f4 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: bkey errors are only AUTOFIX during read



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: 5612daaf ("bcachefs: Fix fsck warnings from bkey validation")
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent fda7b1ff
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -430,10 +430,17 @@ int __bch2_fsck_err(struct bch_fs *c,

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;
}
+3 −6
Original line number Diff line number Diff line
@@ -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 &&				\