diff options
-rw-r--r-- | drivers/md/bcache/extents.c | 24 | ||||
-rw-r--r-- | drivers/md/bcache/extents.h | 12 | ||||
-rw-r--r-- | drivers/md/bcache/io.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/move.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/request.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/writeback.c | 5 |
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; |