diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-28 16:34:55 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:08:19 +0300 |
commit | 0bc166ff564f9e2b0bfc7a0c1a92472a600f901d (patch) | |
tree | 97f1f8e59b45eae01dc412ca55ff432b2a0feb48 /fs/bcachefs/error.c | |
parent | a6d90385e6915429a891408824b8c72219a139f2 (diff) | |
download | linux-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.c | 32 |
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) |