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;

_