forked from luck/tmp_suning_uos_patched
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>
This commit is contained in:
parent
bca97adaf5
commit
1545f13730
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue
Block a user