summaryrefslogtreecommitdiff
path: root/libbcachefs/extents.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-11-10 22:18:52 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2017-11-10 22:18:52 -0900
commite9afb70d261e420e540b0c79a718e76b03b1182b (patch)
treeb3f0203e13db746e7e2bce02f5a98200bb70983d /libbcachefs/extents.c
parentea57dd8d48ecd10414fbdfaf4f0338d3a017d2cb (diff)
Update bcachefs sources to 6a361fb68c bcachefs: Rework btree read error handling
Diffstat (limited to 'libbcachefs/extents.c')
-rw-r--r--libbcachefs/extents.c68
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;
}