summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/error.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2022-10-09 06:54:36 +0200
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 23:09:42 +0200
commit22f516213358379732d63367432d334157cbbe4d (patch)
treed3cdfc8471af44ceec21cbc3bd9bbc9092a3f909 /fs/bcachefs/error.c
parentbcachefs: Fix a deadlock in btree_update_nodes_written() (diff)
downloadlinux-22f516213358379732d63367432d334157cbbe4d.tar.xz
linux-22f516213358379732d63367432d334157cbbe4d.zip
bcachefs: Ensure fsck error is printed before panic
When errors=panic, we want to make sure we print the error before calling bch2_inconsistent_error(). Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/error.c')
-rw-r--r--fs/bcachefs/error.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/bcachefs/error.c b/fs/bcachefs/error.c
index 762abdf2f283..2fb5102ee31d 100644
--- a/fs/bcachefs/error.c
+++ b/fs/bcachefs/error.c
@@ -104,7 +104,7 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
{
struct fsck_err_state *s = NULL;
va_list args;
- bool print = true, suppressing = false;
+ bool print = true, suppressing = false, inconsistent = false;
struct printbuf buf = PRINTBUF, *out = &buf;
int ret = -BCH_ERR_fsck_ignore;
@@ -136,7 +136,7 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
if (c->opts.errors != BCH_ON_ERROR_continue ||
!(flags & (FSCK_CAN_FIX|FSCK_CAN_IGNORE))) {
prt_str(out, ", shutting down");
- bch2_inconsistent_error(c);
+ inconsistent = true;
ret = -BCH_ERR_fsck_errors_not_fixed;
} else if (flags & FSCK_CAN_FIX) {
prt_str(out, ", fixing");
@@ -189,6 +189,9 @@ int bch2_fsck_err(struct bch_fs *c, unsigned flags, const char *fmt, ...)
printbuf_exit(&buf);
+ if (inconsistent)
+ bch2_inconsistent_error(c);
+
if (ret == -BCH_ERR_fsck_fix) {
set_bit(BCH_FS_ERRORS_FIXED, &c->flags);
} else {