summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 04:51:50 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-04-30 17:17:03 -0400
commit63f13e5d1073e1d61b8bfbc9053210d93bacbf78 (patch)
tree668cb78c9cd4a66042badaead1f3588cbd15d143
parent0b1aaaf32dfb382ac07f999f681633ca3edc7788 (diff)
die noisily after gc
-rw-r--r--fs/bcachefs/btree_gc.c17
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;
}