|
@@ -11,105 +11,6 @@
|
|
|
|
|
|
#include <linux/blkdev.h>
|
|
|
|
|
|
-static unsigned bch_bio_max_sectors(struct bio *bio)
|
|
|
-{
|
|
|
- struct request_queue *q = bdev_get_queue(bio->bi_bdev);
|
|
|
- struct bio_vec bv;
|
|
|
- struct bvec_iter iter;
|
|
|
- unsigned ret = 0, seg = 0;
|
|
|
-
|
|
|
- if (bio->bi_rw & REQ_DISCARD)
|
|
|
- return min(bio_sectors(bio), q->limits.max_discard_sectors);
|
|
|
-
|
|
|
- bio_for_each_segment(bv, bio, iter) {
|
|
|
- struct bvec_merge_data bvm = {
|
|
|
- .bi_bdev = bio->bi_bdev,
|
|
|
- .bi_sector = bio->bi_iter.bi_sector,
|
|
|
- .bi_size = ret << 9,
|
|
|
- .bi_rw = bio->bi_rw,
|
|
|
- };
|
|
|
-
|
|
|
- if (seg == min_t(unsigned, BIO_MAX_PAGES,
|
|
|
- queue_max_segments(q)))
|
|
|
- break;
|
|
|
-
|
|
|
- if (q->merge_bvec_fn &&
|
|
|
- q->merge_bvec_fn(q, &bvm, &bv) < (int) bv.bv_len)
|
|
|
- break;
|
|
|
-
|
|
|
- seg++;
|
|
|
- ret += bv.bv_len >> 9;
|
|
|
- }
|
|
|
-
|
|
|
- ret = min(ret, queue_max_sectors(q));
|
|
|
-
|
|
|
- WARN_ON(!ret);
|
|
|
- ret = max_t(int, ret, bio_iovec(bio).bv_len >> 9);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-static void bch_bio_submit_split_done(struct closure *cl)
|
|
|
-{
|
|
|
- struct bio_split_hook *s = container_of(cl, struct bio_split_hook, cl);
|
|
|
-
|
|
|
- s->bio->bi_end_io = s->bi_end_io;
|
|
|
- s->bio->bi_private = s->bi_private;
|
|
|
- bio_endio(s->bio);
|
|
|
-
|
|
|
- closure_debug_destroy(&s->cl);
|
|
|
- mempool_free(s, s->p->bio_split_hook);
|
|
|
-}
|
|
|
-
|
|
|
-static void bch_bio_submit_split_endio(struct bio *bio)
|
|
|
-{
|
|
|
- struct closure *cl = bio->bi_private;
|
|
|
- struct bio_split_hook *s = container_of(cl, struct bio_split_hook, cl);
|
|
|
-
|
|
|
- if (bio->bi_error)
|
|
|
- s->bio->bi_error = bio->bi_error;
|
|
|
-
|
|
|
- bio_put(bio);
|
|
|
- closure_put(cl);
|
|
|
-}
|
|
|
-
|
|
|
-void bch_generic_make_request(struct bio *bio, struct bio_split_pool *p)
|
|
|
-{
|
|
|
- struct bio_split_hook *s;
|
|
|
- struct bio *n;
|
|
|
-
|
|
|
- if (!bio_has_data(bio) && !(bio->bi_rw & REQ_DISCARD))
|
|
|
- goto submit;
|
|
|
-
|
|
|
- if (bio_sectors(bio) <= bch_bio_max_sectors(bio))
|
|
|
- goto submit;
|
|
|
-
|
|
|
- s = mempool_alloc(p->bio_split_hook, GFP_NOIO);
|
|
|
- closure_init(&s->cl, NULL);
|
|
|
-
|
|
|
- s->bio = bio;
|
|
|
- s->p = p;
|
|
|
- s->bi_end_io = bio->bi_end_io;
|
|
|
- s->bi_private = bio->bi_private;
|
|
|
- bio_get(bio);
|
|
|
-
|
|
|
- do {
|
|
|
- n = bio_next_split(bio, bch_bio_max_sectors(bio),
|
|
|
- GFP_NOIO, s->p->bio_split);
|
|
|
-
|
|
|
- n->bi_end_io = bch_bio_submit_split_endio;
|
|
|
- n->bi_private = &s->cl;
|
|
|
-
|
|
|
- closure_get(&s->cl);
|
|
|
- generic_make_request(n);
|
|
|
- } while (n != bio);
|
|
|
-
|
|
|
- continue_at(&s->cl, bch_bio_submit_split_done, NULL);
|
|
|
- return;
|
|
|
-submit:
|
|
|
- generic_make_request(bio);
|
|
|
-}
|
|
|
-
|
|
|
/* Bios with headers */
|
|
|
|
|
|
void bch_bbio_free(struct bio *bio, struct cache_set *c)
|
|
@@ -139,7 +40,7 @@ void __bch_submit_bbio(struct bio *bio, struct cache_set *c)
|
|
|
bio->bi_bdev = PTR_CACHE(c, &b->key, 0)->bdev;
|
|
|
|
|
|
b->submit_time_us = local_clock_us();
|
|
|
- closure_bio_submit(bio, bio->bi_private, PTR_CACHE(c, &b->key, 0));
|
|
|
+ closure_bio_submit(bio, bio->bi_private);
|
|
|
}
|
|
|
|
|
|
void bch_submit_bbio(struct bio *bio, struct cache_set *c,
|