From: Christophe Saout <christophe@saout.de> 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; _