summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-05-16 18:14:43 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-06-09 15:37:03 -0400
commitdda802eeadeb40f82ffe9d76ff930afa4ba09416 (patch)
tree4b70e7de56f84544a0a761f20d965a9a984539ff
parent9f9c5648e334804172defe1f89e200ef9ecb1d9c (diff)
bcachefs: Improve bch2_backpointer_get_key() error message
We need to include the alloc pos for grepping through the journal. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/backpointers.c14
-rw-r--r--fs/bcachefs/backpointers.h4
-rw-r--r--fs/bcachefs/move.c3
3 files changed, 15 insertions, 6 deletions
diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c
index bafb6baee122..17bd9fef3c1a 100644
--- a/fs/bcachefs/backpointers.c
+++ b/fs/bcachefs/backpointers.c
@@ -465,6 +465,9 @@ struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans,
}
prt_printf(&buf, "backpointer doesn't match extent it points to:\n ");
+ prt_printf(&buf, "bucket: ");
+ bch2_bpos_to_text(&buf, alloc_pos);
+ prt_printf(&buf, "\n ");
bch2_backpointer_to_text(&buf, &bp);
prt_printf(&buf, "\n ");
bch2_bkey_val_to_text(&buf, c, k);
@@ -481,6 +484,7 @@ struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans,
struct btree *bch2_backpointer_get_node(struct btree_trans *trans,
struct btree_iter *iter,
+ struct bpos alloc_pos,
struct bch_backpointer bp)
{
struct bch_fs *c = trans->c;
@@ -509,12 +513,13 @@ struct btree *bch2_backpointer_get_node(struct btree_trans *trans,
k = bkey_i_to_s_c(&b->key);
ptrs = bch2_bkey_ptrs_c(k);
bkey_for_each_ptr_decode(k.k, ptrs, p, entry) {
- struct bpos bucket_pos;
+ struct bpos alloc_pos2;
struct bch_backpointer bp2;
bch2_pointer_to_bucket_and_backpointer(c, bp.btree_id, bp.level,
- k, p, &bucket_pos, &bp2);
- if (!memcmp(&bp, &bp2, sizeof(bp)))
+ k, p, &alloc_pos2, &bp2);
+ if (!bpos_cmp(alloc_pos, alloc_pos2) &&
+ !memcmp(&bp, &bp2, sizeof(bp)))
return b;
}
@@ -522,6 +527,9 @@ struct btree *bch2_backpointer_get_node(struct btree_trans *trans,
goto out;
prt_printf(&buf, "backpointer doesn't match btree node it points to:\n ");
+ prt_printf(&buf, "bucket: ");
+ bch2_bpos_to_text(&buf, alloc_pos);
+ prt_printf(&buf, "\n ");
bch2_backpointer_to_text(&buf, &bp);
prt_printf(&buf, "\n ");
bch2_bkey_val_to_text(&buf, c, k);
diff --git a/fs/bcachefs/backpointers.h b/fs/bcachefs/backpointers.h
index e175dfbcf025..beb40fdac602 100644
--- a/fs/bcachefs/backpointers.h
+++ b/fs/bcachefs/backpointers.h
@@ -28,8 +28,8 @@ int bch2_get_next_backpointer(struct btree_trans *, unsigned, u64, int,
u64 *, struct bch_backpointer *);
struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct btree_iter *,
struct bpos, struct bch_backpointer);
-struct btree *bch2_backpointer_get_node(struct btree_trans *,
- struct btree_iter *, struct bch_backpointer);
+struct btree *bch2_backpointer_get_node(struct btree_trans *, struct btree_iter *,
+ struct bpos, struct bch_backpointer);
int bch2_check_backpointers(struct bch_fs *);
int bch2_check_extents_to_backpointers(struct bch_fs *);
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c
index 6092919125aa..aeba91ad65a8 100644
--- a/fs/bcachefs/move.c
+++ b/fs/bcachefs/move.c
@@ -961,7 +961,8 @@ int bch2_evacuate_bucket(struct bch_fs *c,
} else {
struct btree *b;
- b = bch2_backpointer_get_node(&trans, &iter, bp);
+ b = bch2_backpointer_get_node(&trans, &iter,
+ POS(ca->dev_idx, bucket), bp);
ret = PTR_ERR_OR_ZERO(b);
if (ret == -EINTR)
continue;