summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_io.c')
-rw-r--r--libbcachefs/btree_io.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/libbcachefs/btree_io.c b/libbcachefs/btree_io.c
index 541fffb6..18469486 100644
--- a/libbcachefs/btree_io.c
+++ b/libbcachefs/btree_io.c
@@ -1025,6 +1025,17 @@ static bool extent_contains_ptr(struct bkey_s_c_extent e,
return false;
}
+static void bch2_btree_node_read_complete(struct btree_read_bio *rb,
+ struct btree *b)
+{
+ struct bch_dev *ca = rb->pick.ca;
+
+ bio_put(&rb->bio);
+ percpu_ref_put(&ca->io_ref);
+ clear_btree_node_read_in_flight(b);
+ wake_up_bit(&b->flags, BTREE_NODE_read_in_flight);
+}
+
void bch2_btree_node_read_done(struct bch_fs *c, struct btree *b,
struct bch_dev *ca,
const struct bch_extent_ptr *ptr)
@@ -1196,8 +1207,6 @@ void bch2_btree_node_read_done(struct bch_fs *c, struct btree *b,
btree_node_reset_sib_u64s(b);
out:
- clear_btree_node_read_in_flight(b);
- wake_up_bit(&b->flags, BTREE_NODE_read_in_flight);
mempool_free(iter, &c->fill_iter);
return;
err:
@@ -1215,9 +1224,7 @@ static void btree_node_read_work(struct work_struct *work)
bch2_btree_node_read_done(rb->c, rb->bio.bi_private,
rb->pick.ca, &rb->pick.ptr);
-
- percpu_ref_put(&rb->pick.ca->io_ref);
- bio_put(&rb->bio);
+ bch2_btree_node_read_complete(rb, rb->bio.bi_private);
}
static void btree_node_read_endio(struct bio *bio)
@@ -1231,8 +1238,7 @@ static void btree_node_read_endio(struct bio *bio)
PTR_BUCKET_NR(rb->pick.ca, &rb->pick.ptr)) ||
bch2_meta_read_fault("btree")) {
set_btree_node_read_error(b);
- percpu_ref_put(&rb->pick.ca->io_ref);
- bio_put(bio);
+ bch2_btree_node_read_complete(rb, rb->bio.bi_private);
return;
}
@@ -1249,7 +1255,6 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b,
struct bio *bio;
trace_btree_read(c, b);
- set_btree_node_read_in_flight(b);
pick = bch2_btree_pick_ptr(c, b);
if (bch2_fs_fatal_err_on(!pick.ca, c,
@@ -1268,6 +1273,8 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b,
bio->bi_iter.bi_size = btree_bytes(c);
bch2_bio_map(bio, b->data);
+ set_btree_node_read_in_flight(b);
+
if (sync) {
submit_bio_wait(bio);
@@ -1282,8 +1289,7 @@ void bch2_btree_node_read(struct bch_fs *c, struct btree *b,
bch2_btree_node_read_done(c, b, pick.ca, &pick.ptr);
bch2_time_stats_update(&c->btree_read_time, start_time);
out:
- bio_put(bio);
- percpu_ref_put(&pick.ca->io_ref);
+ bch2_btree_node_read_complete(rb, b);
} else {
bio->bi_end_io = btree_node_read_endio;
bio->bi_private = b;