diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-06-06 22:09:11 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-06-20 22:52:05 -0400 |
commit | 308d0ba76d41ac9f8cfaf5c68e1754e0d8298f26 (patch) | |
tree | c8dbb652f09c885b56e869c55647094bfe5486e0 | |
parent | 1b532bd8d290feb8c18c39946f989afb0eeddd35 (diff) |
bcachefs: Fix btree node read error path
We were forgetting to clear the read_in_flight flag - oops. This also
fixes it to not call bch2_fatal_error() before topology repair has had a
chance to do its thing.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/btree_io.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index 0d6871a68736..2cce01eef176 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1489,23 +1489,32 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b, struct btree_read_bio *rb; struct bch_dev *ca; struct bio *bio; - struct printbuf buf = PRINTBUF; int ret; - btree_pos_to_text(&buf, c, b); trace_btree_read(c, b); if (bch2_verify_all_btree_replicas && !btree_node_read_all_replicas(c, b, sync)) - goto out; + return; ret = bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key), NULL, &pick); - if (bch2_fs_fatal_err_on(ret <= 0, c, - "btree node read error: no device to read from\n" - " at %s", buf.buf)) { + + if (ret <= 0) { + struct printbuf buf = PRINTBUF; + + pr_buf(&buf, "btree node read error: no device to read from\n at "); + btree_pos_to_text(&buf, c, b); + bch_err(c, "%s", buf.buf); + + if (test_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags)) + bch2_fatal_error(c); + set_btree_node_read_error(b); - goto out; + clear_btree_node_read_in_flight(b); + wake_up_bit(&b->flags, BTREE_NODE_read_in_flight); + printbuf_exit(&buf); + return; } ca = bch_dev_bkey_exists(c, pick.ptr.dev); @@ -1547,8 +1556,6 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b, else queue_work(c->io_complete_wq, &rb->work); } -out: - printbuf_exit(&buf); } int bch2_btree_root_read(struct bch_fs *c, enum btree_id id, |