summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-05-25 18:09:18 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-05-25 18:09:33 -0400
commit9e4f1773d7e9331bde9d96770080db08f4609d6c (patch)
treee20dd03a945ea197abcdf4f94e0dd22933ab347e
parent58c599e31315d6d730bcae6f203c283821e4e1eb (diff)
fixup! bcachefs: Add a debug mode that always reads from every btree replica
-rw-r--r--fs/bcachefs/btree_io.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c
index 758f965bbdc2..22707230b8dd 100644
--- a/fs/bcachefs/btree_io.c
+++ b/fs/bcachefs/btree_io.c
@@ -1184,6 +1184,8 @@ static void btree_node_read_all_replicas_done(struct closure *cl)
bool have_retry = false;
int ret = 0, write = READ;
unsigned i, written, written2;
+ __le64 seq = b->key.k.type == KEY_TYPE_btree_ptr_v2
+ ? bkey_i_to_btree_ptr_v2(&b->key)->v.seq : 0;
for (i = 0; i < ra->nr; i++) {
if (ra->err[i])
@@ -1195,6 +1197,15 @@ static void btree_node_read_all_replicas_done(struct closure *cl)
written = btree_node_sectors_written(c, b->data);
}
+ /* Try to get the right btree node: */
+ if (have_good_copy &&
+ seq &&
+ b->data->keys.seq != seq &&
+ ((struct btree_node *) ra->buf[i])->keys.seq == seq) {
+ memcpy(b->data, ra->buf[i], btree_bytes(c));
+ written = btree_node_sectors_written(c, b->data);
+ }
+
written2 = btree_node_sectors_written(c, ra->buf[i]);
if (btree_err_on(written2 != written, BTREE_ERR_FIXABLE, c, NULL, b, NULL,
"btree node sectors written mismatch: %u != %u",