diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-11-10 22:18:52 -0900 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-11-10 22:18:52 -0900 |
commit | e9afb70d261e420e540b0c79a718e76b03b1182b (patch) | |
tree | b3f0203e13db746e7e2bce02f5a98200bb70983d /libbcachefs/extents.c | |
parent | ea57dd8d48ecd10414fbdfaf4f0338d3a017d2cb (diff) |
Update bcachefs sources to 6a361fb68c bcachefs: Rework btree read error handling
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r-- | libbcachefs/extents.c | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c index 742a9a00..1937f4cb 100644 --- a/libbcachefs/extents.c +++ b/libbcachefs/extents.c @@ -499,52 +499,43 @@ out: return out - buf; } -void bch2_get_read_device(struct bch_fs *c, - const struct bkey *k, - const struct bch_extent_ptr *ptr, - const union bch_extent_crc *crc, - struct bch_devs_mask *avoid, - struct extent_pick_ptr *pick) +static void extent_pick_read_device(struct bch_fs *c, + struct bkey_s_c_extent e, + struct bch_devs_mask *avoid, + struct extent_pick_ptr *pick) { - struct bch_dev *ca = c->devs[ptr->dev]; - - if (ptr->cached && ptr_stale(ca, ptr)) - return; + const union bch_extent_crc *crc; + const struct bch_extent_ptr *ptr; - if (ca->mi.state == BCH_MEMBER_STATE_FAILED) - return; + extent_for_each_ptr_crc(e, ptr, crc) { + struct bch_dev *ca = c->devs[ptr->dev]; - if (avoid && test_bit(ca->dev_idx, avoid->d)) - return; + if (ptr->cached && ptr_stale(ca, ptr)) + return; - if (pick->ca && pick->ca->mi.tier < ca->mi.tier) - return; + if (ca->mi.state == BCH_MEMBER_STATE_FAILED) + return; - if (!percpu_ref_tryget(&ca->io_ref)) - return; + if (avoid && test_bit(ca->dev_idx, avoid->d)) + return; - if (pick->ca) - percpu_ref_put(&pick->ca->io_ref); + if (pick->ca && pick->ca->mi.tier < ca->mi.tier) + return; - *pick = (struct extent_pick_ptr) { - .ptr = *ptr, - .ca = ca, - }; + if (!percpu_ref_tryget(&ca->io_ref)) + return; - if (k->size) - pick->crc = crc_to_128(k, crc); -} + if (pick->ca) + percpu_ref_put(&pick->ca->io_ref); -static void extent_pick_read_device(struct bch_fs *c, - struct bkey_s_c_extent e, - struct bch_devs_mask *avoid, - struct extent_pick_ptr *pick) -{ - const union bch_extent_crc *crc; - const struct bch_extent_ptr *ptr; + *pick = (struct extent_pick_ptr) { + .ptr = *ptr, + .ca = ca, + }; - extent_for_each_ptr_crc(e, ptr, crc) - bch2_get_read_device(c, e.k, ptr, crc, avoid, pick); + if (e.k->size) + pick->crc = crc_to_128(e.k, crc); + } } /* Btree ptrs */ @@ -667,12 +658,13 @@ static void bch2_btree_ptr_to_text(struct bch_fs *c, char *buf, } struct extent_pick_ptr -bch2_btree_pick_ptr(struct bch_fs *c, const struct btree *b) +bch2_btree_pick_ptr(struct bch_fs *c, const struct btree *b, + struct bch_devs_mask *avoid) { struct extent_pick_ptr pick = { .ca = NULL }; extent_pick_read_device(c, bkey_i_to_s_c_extent(&b->key), - NULL, &pick); + avoid, &pick); return pick; } |