diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-05-25 18:09:18 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-05-25 18:09:33 -0400 |
commit | 9e4f1773d7e9331bde9d96770080db08f4609d6c (patch) | |
tree | e20dd03a945ea197abcdf4f94e0dd22933ab347e | |
parent | 58c599e31315d6d730bcae6f203c283821e4e1eb (diff) |
fixup! bcachefs: Add a debug mode that always reads from every btree replica
-rw-r--r-- | fs/bcachefs/btree_io.c | 11 |
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", |