diff options
Diffstat (limited to 'fs/bcachefs/btree_node_scan.c')
-rw-r--r-- | fs/bcachefs/btree_node_scan.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/fs/bcachefs/btree_node_scan.c b/fs/bcachefs/btree_node_scan.c index 682898fb82b1..4b7b5ca74ba1 100644 --- a/fs/bcachefs/btree_node_scan.c +++ b/fs/bcachefs/btree_node_scan.c @@ -155,13 +155,8 @@ static void try_read_btree_node(struct find_btree_nodes *f, struct bch_dev *ca, if (BTREE_NODE_LEVEL(bn) >= BTREE_MAX_DEPTH) return; - bio_reset(bio, ca->disk_sb.bdev, REQ_OP_READ); - bio->bi_iter.bi_sector = offset; - bch2_bio_map(bio, b->data, c->opts.btree_node_size); - - submit_time = local_clock(); - submit_bio_wait(bio); - bch2_account_io_completion(ca, BCH_MEMBER_ERROR_read, submit_time, !bio->bi_status); + if (BTREE_NODE_ID(bn) >= BTREE_ID_NR_MAX) + return; rcu_read_lock(); struct found_btree_node n = { @@ -179,17 +174,18 @@ static void try_read_btree_node(struct find_btree_nodes *f, struct bch_dev *ca, }; rcu_read_unlock(); - found_btree_node_to_key(&b->key, &n); - - CLASS(printbuf, buf)(); - bool can_read = !bch2_btree_node_read_done(c, ca, b, NULL, &buf); + bio_reset(bio, ca->disk_sb.bdev, REQ_OP_READ); + bio->bi_iter.bi_sector = offset; + bch2_bio_map(bio, b->data, c->opts.btree_node_size); - printbuf_reset(&buf); - found_btree_node_to_text(&buf, c, &n); + submit_time = local_clock(); + submit_bio_wait(bio); + bch2_account_io_completion(ca, BCH_MEMBER_ERROR_read, submit_time, !bio->bi_status); - bch_verbose(ca, "found %sreadable node %s", can_read ? "" : "un", buf.buf); + found_btree_node_to_key(&b->key, &n); - if (can_read) { + CLASS(printbuf, buf)(); + if (!bch2_btree_node_read_done(c, ca, b, NULL, &buf)) { /* read_done will swap out b->data for another buffer */ bn = b->data; /* |