Commit 1b4eaf3d authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcache: Fix flash_dev_cache_miss() for real this time



The code was using sectors to count the number of sectors it was zeroing... but
then it passed it to bio_advance()... after it had been set to 0. Amusing...

Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent 85cbe1f8
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -1203,22 +1203,13 @@ void bch_cached_dev_request_init(struct cached_dev *dc)
static int flash_dev_cache_miss(struct btree *b, struct search *s,
				struct bio *bio, unsigned sectors)
{
	struct bio_vec bv;
	struct bvec_iter iter;

	/* Zero fill bio */

	bio_for_each_segment(bv, bio, iter) {
		unsigned j = min(bv.bv_len >> 9, sectors);

		void *p = kmap(bv.bv_page);
		memset(p + bv.bv_offset, 0, j << 9);
		kunmap(bv.bv_page);
	unsigned bytes = min(sectors, bio_sectors(bio)) << 9;

		sectors	-= j;
	}
	swap(bio->bi_iter.bi_size, bytes);
	zero_fill_bio(bio);
	swap(bio->bi_iter.bi_size, bytes);

	bio_advance(bio, min(sectors << 9, bio->bi_iter.bi_size));
	bio_advance(bio, bytes);

	if (!bio->bi_iter.bi_size)
		return MAP_DONE;