From: Christophe Saout We should copy the bvec array for read requests so that we still have the unmodified bvec array to decrypt the data afterwards. (as discussed earlier this day for highmem bounces) --- 25-akpm/drivers/md/dm-crypt.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-) diff -puN drivers/md/dm-crypt.c~dm-crypt-end_io-bv_offset-fix drivers/md/dm-crypt.c --- 25/drivers/md/dm-crypt.c~dm-crypt-end_io-bv_offset-fix Thu Feb 26 14:14:33 2004 +++ 25-akpm/drivers/md/dm-crypt.c Thu Feb 26 14:14:33 2004 @@ -593,8 +593,21 @@ crypt_clone(struct crypt_config *cc, str return NULL; } } - } else - clone = bio_clone(bio, GFP_NOIO); + } else { + /* + * The block layer might modify the bvec array, so always + * copy the required bvecs because we need the original + * one in order to decrypt the whole bio data *afterwards*. + */ + clone = bio_alloc(GFP_NOIO, bio_segments(bio)); + if (clone) { + clone->bi_idx = 0; + clone->bi_vcnt = bio_segments(bio); + clone->bi_size = bio->bi_size; + memcpy(clone->bi_io_vec, bio_iovec(bio), + sizeof(struct bio_vec) * clone->bi_vcnt); + } + } if (!clone) return NULL; _