From dce1de5426edaeca8350810f8707eafdb4dd36c2 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 11 Jul 2022 23:07:34 -0400 Subject: [PATCH] Update bcachefs sources to a059319fee bcachefs: Put some repair messages behind opts->verbose --- .bcachefs_revision | 2 +- libbcachefs/alloc_background.c | 28 ++++++++++--------- libbcachefs/backpointers.c | 1 + libbcachefs/btree_gc.c | 51 ++++++++++++++++++---------------- libbcachefs/btree_iter.c | 15 +++++----- libbcachefs/move.c | 17 +++++++----- 6 files changed, 62 insertions(+), 52 deletions(-) diff --git a/.bcachefs_revision b/.bcachefs_revision index ac802857..5c0f7956 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -95ff72a6c1291f6838e5cfa81a7426aaff482cde +a059319fee8038f4e7fc9cf92595341f3d5d7a79 diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index 73856717..4b38fbd9 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -731,12 +731,13 @@ static int bch2_check_alloc_key(struct btree_trans *trans, if (ret) goto err; - if (fsck_err_on(k.k->type != discard_key_type, c, - "incorrect key in need_discard btree (got %s should be %s)\n" - " %s", - bch2_bkey_types[k.k->type], - bch2_bkey_types[discard_key_type], - (bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) { + if (k.k->type != discard_key_type && + (c->opts.reconstruct_alloc || + fsck_err(c, "incorrect key in need_discard btree (got %s should be %s)\n" + " %s", + bch2_bkey_types[k.k->type], + bch2_bkey_types[discard_key_type], + (bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf)))) { struct bkey_i *update = bch2_trans_kmalloc(trans, sizeof(*update)); @@ -758,13 +759,14 @@ static int bch2_check_alloc_key(struct btree_trans *trans, if (ret) goto err; - if (fsck_err_on(k.k->type != freespace_key_type, c, - "incorrect key in freespace btree (got %s should be %s)\n" - " %s", - bch2_bkey_types[k.k->type], - bch2_bkey_types[freespace_key_type], - (printbuf_reset(&buf), - bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) { + if (k.k->type != freespace_key_type && + (c->opts.reconstruct_alloc || + fsck_err(c, "incorrect key in freespace btree (got %s should be %s)\n" + " %s", + bch2_bkey_types[k.k->type], + bch2_bkey_types[freespace_key_type], + (printbuf_reset(&buf), + bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf)))) { struct bkey_i *update = bch2_trans_kmalloc(trans, sizeof(*update)); diff --git a/libbcachefs/backpointers.c b/libbcachefs/backpointers.c index f3260bbe..6c74b3a5 100644 --- a/libbcachefs/backpointers.c +++ b/libbcachefs/backpointers.c @@ -700,6 +700,7 @@ missing: bch2_bkey_val_to_text(&buf, c, alloc_k); if (c->sb.version < bcachefs_metadata_version_backpointers || + c->opts.reconstruct_alloc || fsck_err(c, "%s", buf.buf)) { struct bkey_i_alloc_v4 *a = bch2_alloc_to_v4_mut(trans, alloc_k); diff --git a/libbcachefs/btree_gc.c b/libbcachefs/btree_gc.c index 0e2c8745..9556b053 100644 --- a/libbcachefs/btree_gc.c +++ b/libbcachefs/btree_gc.c @@ -564,7 +564,8 @@ static int bch2_check_fix_ptrs(struct bch_fs *c, enum btree_id btree_id, struct bucket *g = PTR_GC_BUCKET(ca, &p.ptr); enum bch_data_type data_type = bch2_bkey_ptr_data_type(*k, &entry->ptr); - if (fsck_err_on(!g->gen_valid, c, + if (c->opts.reconstruct_alloc || + fsck_err_on(!g->gen_valid, c, "bucket %u:%zu data type %s ptr gen %u missing in alloc btree\n" "while marking %s", p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr), @@ -748,13 +749,15 @@ found: if (level) bch2_btree_node_update_key_early(c, btree_id, level - 1, *k, new); - printbuf_reset(&buf); - bch2_bkey_val_to_text(&buf, c, *k); - bch_info(c, "updated %s", buf.buf); + if (c->opts.verbose) { + printbuf_reset(&buf); + bch2_bkey_val_to_text(&buf, c, *k); + bch_info(c, "updated %s", buf.buf); - printbuf_reset(&buf); - bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(new)); - bch_info(c, "new key %s", buf.buf); + printbuf_reset(&buf); + bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(new)); + bch_info(c, "new key %s", buf.buf); + } *k = bkey_i_to_s_c(new); } @@ -1177,29 +1180,28 @@ static int bch2_gc_done(struct bch_fs *c, { struct bch_dev *ca = NULL; struct printbuf buf = PRINTBUF; - bool verify = !metadata_only && (!initial || - (c->sb.compat & (1ULL << BCH_COMPAT_alloc_info))); + bool verify = !metadata_only && + !c->opts.reconstruct_alloc && + (!initial || (c->sb.compat & (1ULL << BCH_COMPAT_alloc_info))); unsigned i, dev; int ret = 0; percpu_down_write(&c->mark_lock); #define copy_field(_f, _msg, ...) \ - if (dst->_f != src->_f) { \ - if (verify) \ - fsck_err(c, _msg ": got %llu, should be %llu" \ - , ##__VA_ARGS__, dst->_f, src->_f); \ - dst->_f = src->_f; \ - } + if (dst->_f != src->_f && \ + (!verify || \ + fsck_err(c, _msg ": got %llu, should be %llu" \ + , ##__VA_ARGS__, dst->_f, src->_f))) \ + dst->_f = src->_f #define copy_stripe_field(_f, _msg, ...) \ - if (dst->_f != src->_f) { \ - if (verify) \ - fsck_err(c, "stripe %zu has wrong "_msg \ - ": got %u, should be %u", \ - iter.pos, ##__VA_ARGS__, \ - dst->_f, src->_f); \ - dst->_f = src->_f; \ - } + if (dst->_f != src->_f && \ + (!verify || \ + fsck_err(c, "stripe %zu has wrong "_msg \ + ": got %u, should be %u", \ + iter.pos, ##__VA_ARGS__, \ + dst->_f, src->_f))) \ + dst->_f = src->_f #define copy_dev_field(_f, _msg, ...) \ copy_field(_f, "dev %u has wrong " _msg, dev, ##__VA_ARGS__) #define copy_fs_field(_f, _msg, ...) \ @@ -1377,7 +1379,8 @@ static int bch2_alloc_write_key(struct btree_trans *trans, return 0; #define copy_bucket_field(_f) \ - if (fsck_err_on(new._f != gc._f, c, \ + if (c->opts.reconstruct_alloc || \ + fsck_err_on(new._f != gc._f, c, \ "bucket %llu:%llu gen %u data type %s has wrong " #_f \ ": got %u, should be %u", \ iter->pos.inode, iter->pos.offset, \ diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index a1512eb0..05bd0d60 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -193,12 +193,14 @@ bool __bch2_btree_node_relock(struct btree_trans *trans, return true; } fail: - trace_btree_node_relock_fail(trans->fn, _RET_IP_, - path->btree_id, - &path->pos, - (unsigned long) b, - path->l[level].lock_seq, - is_btree_node(path, level) ? b->c.lock.state.seq : 0); + if (b != BTREE_ITER_NO_NODE_CACHED && + b != BTREE_ITER_NO_NODE_INIT) + trace_btree_node_relock_fail(trans->fn, _RET_IP_, + path->btree_id, + &path->pos, + (unsigned long) b, + path->l[level].lock_seq, + is_btree_node(path, level) ? b->c.lock.state.seq : 0); return false; } @@ -363,7 +365,6 @@ bool __bch2_btree_node_lock(struct btree_trans *trans, if (btree_node_locked(linked, level) && bpos_cmp(pos, btree_node_pos((void *) linked->l[level].b, linked->cached)) <= 0) { - BUG_ON(trans->in_traverse_all); reason = 7; goto deadlock; } diff --git a/libbcachefs/move.c b/libbcachefs/move.c index 093efb09..9748b865 100644 --- a/libbcachefs/move.c +++ b/libbcachefs/move.c @@ -148,13 +148,15 @@ void bch2_moving_ctxt_exit(struct moving_context *ctxt) { move_ctxt_wait_event(ctxt, NULL, list_empty(&ctxt->reads)); closure_sync(&ctxt->cl); - progress_list_del(ctxt->c, ctxt->stats); - EBUG_ON(atomic_read(&ctxt->write_sectors)); - trace_move_data(ctxt->c, - atomic64_read(&ctxt->stats->sectors_moved), - atomic64_read(&ctxt->stats->keys_moved)); + if (ctxt->stats) { + progress_list_del(ctxt->c, ctxt->stats); + + trace_move_data(ctxt->c, + atomic64_read(&ctxt->stats->sectors_moved), + atomic64_read(&ctxt->stats->keys_moved)); + } } void bch2_moving_ctxt_init(struct moving_context *ctxt, @@ -172,13 +174,14 @@ void bch2_moving_ctxt_init(struct moving_context *ctxt, ctxt->wp = wp; ctxt->wait_on_copygc = wait_on_copygc; - progress_list_add(c, stats); closure_init_stack(&ctxt->cl); INIT_LIST_HEAD(&ctxt->reads); init_waitqueue_head(&ctxt->wait); - if (stats) + if (stats) { + progress_list_add(c, stats); stats->data_type = BCH_DATA_user; + } } void bch_move_stats_init(struct bch_move_stats *stats, char *name)