summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/alloc_background.c28
-rw-r--r--libbcachefs/backpointers.c1
-rw-r--r--libbcachefs/btree_gc.c51
-rw-r--r--libbcachefs/btree_iter.c15
-rw-r--r--libbcachefs/move.c17
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)