summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/extents.c24
-rw-r--r--drivers/md/bcache/extents.h12
-rw-r--r--drivers/md/bcache/io.c2
-rw-r--r--drivers/md/bcache/move.c4
-rw-r--r--drivers/md/bcache/request.c2
-rw-r--r--drivers/md/bcache/writeback.c5
6 files changed, 26 insertions, 23 deletions
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c
index 49592ae70e27..d11663fa8307 100644
--- a/drivers/md/bcache/extents.c
+++ b/drivers/md/bcache/extents.c
@@ -1639,24 +1639,25 @@ bool bch_extent_normalize(struct cache_set *c, struct bkey_s k)
* as the pointers are sorted by tier, hence preferring pointers to tier 0
* rather than pointers to tier 1.
*/
-struct extent_pick_ptr
-bch_extent_pick_ptr_avoiding(struct cache_set *c, struct bkey_s_c k,
- struct cache *avoid)
+void bch_extent_pick_ptr_avoiding(struct cache_set *c, struct bkey_s_c k,
+ struct cache *avoid,
+ struct extent_pick_ptr *ret)
{
struct bkey_s_c_extent e;
const union bch_extent_crc *crc;
const struct bch_extent_ptr *ptr;
struct cache *ca;
- struct extent_pick_ptr ret = { .ca = NULL };
switch (k.k->type) {
case KEY_TYPE_DELETED:
case KEY_TYPE_DISCARD:
case KEY_TYPE_COOKIE:
- return (struct extent_pick_ptr) { .ca = NULL };
+ ret->ca = NULL;
+ return;
case KEY_TYPE_ERROR:
- return (struct extent_pick_ptr) { .ca = ERR_PTR(-EIO) };
+ ret->ca = ERR_PTR(-EIO);
+ return;
case BCH_EXTENT:
case BCH_EXTENT_CACHED:
@@ -1666,10 +1667,11 @@ bch_extent_pick_ptr_avoiding(struct cache_set *c, struct bkey_s_c k,
*/
e = bkey_s_c_to_extent(k);
rcu_read_lock();
+ ret->ca = NULL;
extent_for_each_online_device_crc(c, e, crc, ptr, ca)
if (!ptr_stale(ca, ptr)) {
- ret = (struct extent_pick_ptr) {
+ *ret = (struct extent_pick_ptr) {
.crc = crc_to_64(crc),
.ptr = *ptr,
.ca = ca,
@@ -1679,13 +1681,13 @@ bch_extent_pick_ptr_avoiding(struct cache_set *c, struct bkey_s_c k,
break;
}
- if (ret.ca)
- percpu_ref_get(&ret.ca->ref);
+ if (ret->ca)
+ percpu_ref_get(&ret->ca->ref);
else if (!bkey_extent_is_cached(e.k))
- ret.ca = ERR_PTR(-EIO);
+ ret->ca = ERR_PTR(-EIO);
rcu_read_unlock();
- return ret;
+ return;
default:
BUG();
diff --git a/drivers/md/bcache/extents.h b/drivers/md/bcache/extents.h
index 1713d3c6edc5..cc16ebdd143e 100644
--- a/drivers/md/bcache/extents.h
+++ b/drivers/md/bcache/extents.h
@@ -39,14 +39,14 @@ struct extent_pick_ptr {
struct extent_pick_ptr
bch_btree_pick_ptr(struct cache_set *, const struct btree *);
-struct extent_pick_ptr
-bch_extent_pick_ptr_avoiding(struct cache_set *, struct bkey_s_c,
- struct cache *);
+void bch_extent_pick_ptr_avoiding(struct cache_set *, struct bkey_s_c,
+ struct cache *, struct extent_pick_ptr *);
-static inline struct extent_pick_ptr
-bch_extent_pick_ptr(struct cache_set *c, struct bkey_s_c k)
+static inline void
+bch_extent_pick_ptr(struct cache_set *c, struct bkey_s_c k,
+ struct extent_pick_ptr *ret)
{
- return bch_extent_pick_ptr_avoiding(c, k, NULL);
+ bch_extent_pick_ptr_avoiding(c, k, NULL, ret);
}
bool bch_insert_fixup_extent(struct btree_iter *, struct btree *,
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c
index ea00dbbc7242..f37d81e53232 100644
--- a/drivers/md/bcache/io.c
+++ b/drivers/md/bcache/io.c
@@ -1591,7 +1591,7 @@ int bch_read(struct cache_set *c, struct bio *bio, u64 inode)
swap(bio->bi_iter.bi_size, bytes);
- pick = bch_extent_pick_ptr(c, k);
+ bch_extent_pick_ptr(c, k, &pick);
if (IS_ERR(pick.ca)) {
bcache_io_error(c, bio, "no device to read from");
bch_btree_iter_unlock(&iter);
diff --git a/drivers/md/bcache/move.c b/drivers/md/bcache/move.c
index 2f24c8f03108..76a67ec90903 100644
--- a/drivers/md/bcache/move.c
+++ b/drivers/md/bcache/move.c
@@ -471,8 +471,8 @@ static void __bch_data_move(struct closure *cl)
struct extent_pick_ptr pick;
u64 size = io->key.k.size;
- pick = bch_extent_pick_ptr_avoiding(io->op.c, bkey_i_to_s_c(&io->key),
- io->context->avoid);
+ bch_extent_pick_ptr_avoiding(io->op.c, bkey_i_to_s_c(&io->key),
+ io->context->avoid, &pick);
if (IS_ERR_OR_NULL(pick.ca))
closure_return_with_destructor(cl, moving_io_destructor);
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
index e5208f4b93b9..35f0b8631504 100644
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@ -418,7 +418,7 @@ retry:
swap(bio->bi_iter.bi_size, bytes);
- pick = bch_extent_pick_ptr(s->iop.c, k);
+ bch_extent_pick_ptr(s->iop.c, k, &pick);
if (IS_ERR(pick.ca)) {
bcache_io_error(s->iop.c, bio,
"no device to read from");
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
index e752f8f3a0a5..166d886c7818 100644
--- a/drivers/md/bcache/writeback.c
+++ b/drivers/md/bcache/writeback.c
@@ -212,8 +212,9 @@ static u64 read_dirty(struct cached_dev *dc)
while (tmp.k.k.size) {
struct extent_pick_ptr pick;
- pick = bch_extent_pick_ptr(dc->disk.c,
- bkey_i_to_s_c(&tmp.k));
+ bch_extent_pick_ptr(dc->disk.c,
+ bkey_i_to_s_c(&tmp.k),
+ &pick);
if (IS_ERR_OR_NULL(pick.ca))
break;