Commit a09ded8e authored by Kent Overstreet's avatar Kent Overstreet

bcache: Fix merge_bvec_fn usage for when it modifies the bvm

Stacked md devices reuse the bvm for the subordinate device, causing
problems...
Reported-by: default avatarMichael Balser <michael.balser@profitbricks.com>
Signed-off-by: default avatarKent Overstreet <koverstreet@google.com>
parent 1545f137
...@@ -163,13 +163,6 @@ static unsigned bch_bio_max_sectors(struct bio *bio) ...@@ -163,13 +163,6 @@ static unsigned bch_bio_max_sectors(struct bio *bio)
struct bio_vec *bv, *end = bio_iovec(bio) + struct bio_vec *bv, *end = bio_iovec(bio) +
min_t(int, bio_segments(bio), max_segments); min_t(int, bio_segments(bio), max_segments);
struct bvec_merge_data bvm = {
.bi_bdev = bio->bi_bdev,
.bi_sector = bio->bi_sector,
.bi_size = 0,
.bi_rw = bio->bi_rw,
};
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);
...@@ -178,12 +171,18 @@ static unsigned bch_bio_max_sectors(struct bio *bio) ...@@ -178,12 +171,18 @@ static unsigned bch_bio_max_sectors(struct bio *bio)
ret = 0; ret = 0;
for (bv = bio_iovec(bio); bv < end; bv++) { for (bv = bio_iovec(bio); bv < end; bv++) {
struct bvec_merge_data bvm = {
.bi_bdev = bio->bi_bdev,
.bi_sector = bio->bi_sector,
.bi_size = ret << 9,
.bi_rw = bio->bi_rw,
};
if (q->merge_bvec_fn && if (q->merge_bvec_fn &&
q->merge_bvec_fn(q, &bvm, bv) < (int) bv->bv_len) q->merge_bvec_fn(q, &bvm, bv) < (int) bv->bv_len)
break; break;
ret += bv->bv_len >> 9; ret += bv->bv_len >> 9;
bvm.bi_size += bv->bv_len;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment