summaryrefslogtreecommitdiff
path: root/fs/bcachefs/error.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 16:34:55 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:19 +0300
commit0bc166ff564f9e2b0bfc7a0c1a92472a600f901d (patch)
tree97f1f8e59b45eae01dc412ca55ff432b2a0feb48 /fs/bcachefs/error.c
parenta6d90385e6915429a891408824b8c72219a139f2 (diff)
downloadlinux-0bc166ff564f9e2b0bfc7a0c1a92472a600f901d.tar.xz
bcachefs: Track whether filesystem has errors in superblock
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/error.c')
-rw-r--r--fs/bcachefs/error.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/fs/bcachefs/error.c b/fs/bcachefs/error.c
index f0a44101b7e7..1aaff44e18cf 100644
--- a/fs/bcachefs/error.c
+++ b/fs/bcachefs/error.c
@@ -72,12 +72,9 @@ enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
vprintk(fmt, args);
va_end(args);
- if (c->opts.errors == BCH_ON_ERROR_CONTINUE &&
- flags & FSCK_CAN_FIX)
- return FSCK_ERR_FIX;
-
- bch2_inconsistent_error(c);
- return FSCK_ERR_EXIT;
+ return bch2_inconsistent_error(c)
+ ? FSCK_ERR_EXIT
+ : FSCK_ERR_FIX;
}
mutex_lock(&c->fsck_error_lock);
@@ -110,11 +107,7 @@ print:
if (c->opts.fix_errors == FSCK_OPT_EXIT) {
bch_err(c, "%s, exiting", buf);
- mutex_unlock(&c->fsck_error_lock);
- return FSCK_ERR_EXIT;
- }
-
- if (flags & FSCK_CAN_FIX) {
+ } else if (flags & FSCK_CAN_FIX) {
if (c->opts.fix_errors == FSCK_OPT_ASK) {
printk(KERN_ERR "%s: fix?", buf);
fix = ask_yn();
@@ -142,13 +135,16 @@ print:
mutex_unlock(&c->fsck_error_lock);
- set_bit(fix
- ? BCH_FS_FSCK_FIXED_ERRORS
- : BCH_FS_FSCK_UNFIXED_ERRORS, &c->flags);
-
- return fix ? FSCK_ERR_FIX
- : flags & FSCK_CAN_IGNORE ? FSCK_ERR_IGNORE
- : FSCK_ERR_EXIT;
+ if (fix) {
+ set_bit(BCH_FS_ERRORS_FIXED, &c->flags);
+ return FSCK_ERR_FIX;
+ } else {
+ set_bit(BCH_FS_ERROR, &c->flags);
+ return c->opts.fix_errors == FSCK_OPT_EXIT ||
+ !(flags & FSCK_CAN_IGNORE)
+ ? FSCK_ERR_EXIT
+ : FSCK_ERR_IGNORE;
+ }
}
void bch2_flush_fsck_errs(struct bch_fs *c)