diff options
-rw-r--r-- | fs/bcachefs/alloc_background.c | 18 | ||||
-rw-r--r-- | fs/bcachefs/alloc_background.h | 9 | ||||
-rw-r--r-- | fs/bcachefs/alloc_foreground.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/error.c | 15 | ||||
-rw-r--r-- | fs/bcachefs/sb-errors_format.h | 1 |
5 files changed, 28 insertions, 17 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 66de46318620..d64839c756bc 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -1381,7 +1381,7 @@ static int bch2_recheck_discard_freespace_key(struct btree_trans *trans, struct u8 gen; ret = k.k->type != KEY_TYPE_set - ? bch2_check_discard_freespace_key(trans, &iter, &gen, false) + ? __bch2_check_discard_freespace_key(trans, &iter, &gen, FSCK_ERR_SILENT) : 0; bch2_trans_iter_exit(trans, &iter); return ret; @@ -1397,8 +1397,8 @@ static void check_discard_freespace_key_work(struct work_struct *work) kfree(w); } -int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_iter *iter, u8 *gen, - bool async_repair) +int __bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_iter *iter, u8 *gen, + enum bch_fsck_flags fsck_flags) { struct bch_fs *c = trans->c; enum bch_data_type state = iter->btree_id == BTREE_ID_need_discard @@ -1406,8 +1406,8 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite : BCH_DATA_free; struct printbuf buf = PRINTBUF; - unsigned fsck_flags = (async_repair ? FSCK_ERR_NO_LOG : 0)| - FSCK_CAN_FIX|FSCK_CAN_IGNORE; + bool async_repair = fsck_flags & FSCK_ERR_NO_LOG; + fsck_flags |= FSCK_CAN_FIX|FSCK_CAN_IGNORE; struct bpos bucket = iter->pos; bucket.offset &= ~(~0ULL << 56); @@ -1490,10 +1490,10 @@ delete: } } -static int bch2_check_discard_freespace_key_fsck(struct btree_trans *trans, struct btree_iter *iter) +static int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_iter *iter) { u8 gen; - int ret = bch2_check_discard_freespace_key(trans, iter, &gen, false); + int ret = __bch2_check_discard_freespace_key(trans, iter, &gen, 0); return ret < 0 ? ret : 0; } @@ -1651,7 +1651,7 @@ bkey_err: ret = for_each_btree_key(trans, iter, BTREE_ID_need_discard, POS_MIN, BTREE_ITER_prefetch, k, - bch2_check_discard_freespace_key_fsck(trans, &iter)); + bch2_check_discard_freespace_key(trans, &iter)); if (ret) goto err; @@ -1664,7 +1664,7 @@ bkey_err: break; ret = bkey_err(k) ?: - bch2_check_discard_freespace_key_fsck(trans, &iter); + bch2_check_discard_freespace_key(trans, &iter); if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) { ret = 0; continue; diff --git a/fs/bcachefs/alloc_background.h b/fs/bcachefs/alloc_background.h index 0cc5adc55b6f..c2e8482fbbe6 100644 --- a/fs/bcachefs/alloc_background.h +++ b/fs/bcachefs/alloc_background.h @@ -309,7 +309,14 @@ int bch2_trigger_alloc(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_s, enum btree_iter_update_trigger_flags); -int bch2_check_discard_freespace_key(struct btree_trans *, struct btree_iter *, u8 *, bool); +int __bch2_check_discard_freespace_key(struct btree_trans *, struct btree_iter *, u8 *, + enum bch_fsck_flags); + +static inline int bch2_check_discard_freespace_key_async(struct btree_trans *trans, struct btree_iter *iter, u8 *gen) +{ + return __bch2_check_discard_freespace_key(trans, iter, gen, FSCK_ERR_NO_LOG); +} + int bch2_check_alloc_info(struct bch_fs *); int bch2_check_alloc_to_lru_refs(struct bch_fs *); void bch2_dev_do_discards(struct bch_dev *); diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c index b375ad610acd..23a9fbb36f49 100644 --- a/fs/bcachefs/alloc_foreground.c +++ b/fs/bcachefs/alloc_foreground.c @@ -269,7 +269,7 @@ static struct open_bucket *try_alloc_bucket(struct btree_trans *trans, return NULL; u8 gen; - int ret = bch2_check_discard_freespace_key(trans, freespace_iter, &gen, true); + int ret = bch2_check_discard_freespace_key_async(trans, freespace_iter, &gen); if (ret < 0) return ERR_PTR(ret); if (ret) diff --git a/fs/bcachefs/error.c b/fs/bcachefs/error.c index b2a6c041e165..27caa06225d1 100644 --- a/fs/bcachefs/error.c +++ b/fs/bcachefs/error.c @@ -472,10 +472,13 @@ int __bch2_fsck_err(struct bch_fs *c, !trans && bch2_current_has_btree_trans(c)); - if (test_bit(err, c->sb.errors_silent)) - return flags & FSCK_CAN_FIX + if ((flags & FSCK_ERR_SILENT) || + test_bit(err, c->sb.errors_silent)) { + ret = flags & FSCK_CAN_FIX ? bch_err_throw(c, fsck_fix) : bch_err_throw(c, fsck_ignore); + goto err; + } printbuf_indent_add_nextline(out, 2); @@ -620,14 +623,14 @@ print: if (s) s->ret = ret; - +err_unlock: + mutex_unlock(&c->fsck_error_msgs_lock); +err: if (trans && !(flags & FSCK_ERR_NO_LOG) && ret == -BCH_ERR_fsck_fix) ret = bch2_trans_log_str(trans, bch2_sb_error_strs[err]) ?: ret; -err_unlock: - mutex_unlock(&c->fsck_error_msgs_lock); -err: + /* * We don't yet track whether the filesystem currently has errors, for * log_fsck_err()s: that would require us to track for every error type diff --git a/fs/bcachefs/sb-errors_format.h b/fs/bcachefs/sb-errors_format.h index 6cdb07a721e9..3ecac2524118 100644 --- a/fs/bcachefs/sb-errors_format.h +++ b/fs/bcachefs/sb-errors_format.h @@ -7,6 +7,7 @@ enum bch_fsck_flags { FSCK_CAN_IGNORE = BIT(1), FSCK_AUTOFIX = BIT(2), FSCK_ERR_NO_LOG = BIT(3), + FSCK_ERR_SILENT = BIT(4), }; #define BCH_SB_ERRS() \ |