Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1545f137 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <koverstreet@google.com>
parent bca97ada
Loading
Loading
Loading
Loading
+4 −5
Original line number Original line Diff line number Diff line
@@ -158,8 +158,10 @@ static unsigned bch_bio_max_sectors(struct bio *bio)
{
{
	unsigned ret = bio_sectors(bio);
	unsigned ret = bio_sectors(bio);
	struct request_queue *q = bdev_get_queue(bio->bi_bdev);
	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) +
	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 = {
	struct bvec_merge_data bvm = {
		.bi_bdev	= bio->bi_bdev,
		.bi_bdev	= bio->bi_bdev,
@@ -171,7 +173,7 @@ static unsigned bch_bio_max_sectors(struct bio *bio)
	if (bio->bi_rw & REQ_DISCARD)
	if (bio->bi_rw & REQ_DISCARD)
		return min(ret, q->limits.max_discard_sectors);
		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) {
	    q->merge_bvec_fn) {
		ret = 0;
		ret = 0;


@@ -183,9 +185,6 @@ static unsigned bch_bio_max_sectors(struct bio *bio)
			ret		+= bv->bv_len >> 9;
			ret		+= bv->bv_len >> 9;
			bvm.bi_size	+= bv->bv_len;
			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));
	ret = min(ret, queue_max_sectors(q));