summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2008-12-23 12:44:19 +0100
committerJens Axboe <jens.axboe@oracle.com>2008-12-29 08:29:52 +0100
commitf735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f (patch)
tree2d260f45b150f8dbf56242bd58372769e6478205
parenta0ea8622918019ed76c0b85f5d0247809ba05a7c (diff)
downloadlinux-f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f.tar.gz
linux-f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f.tar.bz2
linux-f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f.zip
bounce: don't rely on a zeroed bio_vec list
__blk_queue_bounce() relies on a zeroed bio_vec list, since it looks up arbitrary indexes in the allocated bio. The block layer only guarentees that added entries are valid, so clear memory after alloc. Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--mm/bounce.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/mm/bounce.c b/mm/bounce.c
index bf0cf7c8387b..e590272fe7a8 100644
--- a/mm/bounce.c
+++ b/mm/bounce.c
@@ -198,8 +198,13 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
/*
* irk, bounce it
*/
- if (!bio)
- bio = bio_alloc(GFP_NOIO, (*bio_orig)->bi_vcnt);
+ if (!bio) {
+ unsigned int cnt = (*bio_orig)->bi_vcnt;
+
+ bio = bio_alloc(GFP_NOIO, cnt);
+ memset(bio->bi_io_vec, 0, cnt * sizeof(struct bio_vec));
+ }
+
to = bio->bi_io_vec + i;