diff options
author | Kent Overstreet <koverstreet@google.com> | 2013-04-10 15:50:57 -0700 |
---|---|---|
committer | Kent Overstreet <koverstreet@google.com> | 2013-04-20 17:57:42 -0700 |
commit | 1545f13730be43278ce12f4af7e51b4dee5066a8 (patch) | |
tree | b1672097ddec583788cc87759b365287fa2b2fa8 | |
parent | bca97adaf522dff0e9ccf2c3f4150a1a7378932a (diff) | |
download | op-kernel-dev-1545f13730be43278ce12f4af7e51b4dee5066a8.zip op-kernel-dev-1545f13730be43278ce12f4af7e51b4dee5066a8.tar.gz |
bcache: Correctly check against BIO_MAX_PAGES
bch_bio_max_sectors() was checking against BIO_MAX_PAGES as if the limit
was for the total bytes in the bio, not the number of segments.
Signed-off-by: Kent Overstreet <koverstreet@google.com>
-rw-r--r-- | drivers/md/bcache/io.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index b4c0e28..5304eaa 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -158,8 +158,10 @@ static unsigned bch_bio_max_sectors(struct bio *bio) { unsigned ret = bio_sectors(bio); struct request_queue *q = bdev_get_queue(bio->bi_bdev); + unsigned max_segments = min_t(unsigned, BIO_MAX_PAGES, + queue_max_segments(q)); struct bio_vec *bv, *end = bio_iovec(bio) + - min_t(int, bio_segments(bio), queue_max_segments(q)); + min_t(int, bio_segments(bio), max_segments); struct bvec_merge_data bvm = { .bi_bdev = bio->bi_bdev, @@ -171,7 +173,7 @@ static unsigned bch_bio_max_sectors(struct bio *bio) if (bio->bi_rw & REQ_DISCARD) return min(ret, q->limits.max_discard_sectors); - if (bio_segments(bio) > queue_max_segments(q) || + if (bio_segments(bio) > max_segments || q->merge_bvec_fn) { ret = 0; @@ -183,9 +185,6 @@ static unsigned bch_bio_max_sectors(struct bio *bio) ret += bv->bv_len >> 9; bvm.bi_size += bv->bv_len; } - - if (ret >= (BIO_MAX_PAGES * PAGE_SIZE) >> 9) - return (BIO_MAX_PAGES * PAGE_SIZE) >> 9; } ret = min(ret, queue_max_sectors(q)); |