diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-03-28 04:51:50 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-30 17:17:03 -0400 |
commit | 63f13e5d1073e1d61b8bfbc9053210d93bacbf78 (patch) | |
tree | 668cb78c9cd4a66042badaead1f3588cbd15d143 | |
parent | 0b1aaaf32dfb382ac07f999f681633ca3edc7788 (diff) |
die noisily after gc
-rw-r--r-- | fs/bcachefs/btree_gc.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index 9f0de5cd25ab..a294ed8c9318 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -503,32 +503,41 @@ static int bch2_gc_done(struct bch_fs *c, bool verify = !metadata_only && (!initial || (c->sb.compat & (1ULL << BCH_COMPAT_FEAT_ALLOC_INFO))); + bool wrong = false; unsigned i; int ret = 0; + c->opts.fix_errors = FSCK_OPT_YES; + #define copy_field(_f, _msg, ...) \ if (dst->_f != src->_f) { \ - if (verify) \ + if (verify) { \ fsck_err(c, _msg ": got %llu, should be %llu" \ , ##__VA_ARGS__, dst->_f, src->_f); \ + wrong = true; \ + } \ dst->_f = src->_f; \ } #define copy_stripe_field(_f, _msg, ...) \ if (dst->_f != src->_f) { \ - if (verify) \ + if (verify) { \ fsck_err(c, "stripe %zu has wrong "_msg \ ": got %u, should be %u", \ dst_iter.pos, ##__VA_ARGS__, \ dst->_f, src->_f); \ + wrong = true; \ + } \ dst->_f = src->_f; \ dst->dirty = true; \ } #define copy_bucket_field(_f) \ if (dst->b[b].mark._f != src->b[b].mark._f) { \ - if (verify) \ + if (verify) { \ fsck_err(c, "dev %u bucket %zu has wrong " #_f \ ": got %u, should be %u", i, b, \ dst->b[b].mark._f, src->b[b].mark._f); \ + wrong = true; \ + } \ dst->b[b]._mark._f = src->b[b].mark._f; \ dst->b[b]._mark.dirty = true; \ } @@ -636,6 +645,8 @@ static int bch2_gc_done(struct bch_fs *c, #undef copy_stripe_field #undef copy_field fsck_err: + if (ret || wrong) + panic("gc error\n"); return ret; } |