diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-12-23 06:44:19 -0500 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-12-29 02:29:52 -0500 |
commit | f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f (patch) | |
tree | 2d260f45b150f8dbf56242bd58372769e6478205 /mm/bounce.c | |
parent | a0ea8622918019ed76c0b85f5d0247809ba05a7c (diff) |
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>
Diffstat (limited to 'mm/bounce.c')
-rw-r--r-- | mm/bounce.c | 9 |
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, | |||
198 | /* | 198 | /* |
199 | * irk, bounce it | 199 | * irk, bounce it |
200 | */ | 200 | */ |
201 | if (!bio) | 201 | if (!bio) { |
202 | bio = bio_alloc(GFP_NOIO, (*bio_orig)->bi_vcnt); | 202 | unsigned int cnt = (*bio_orig)->bi_vcnt; |
203 | |||
204 | bio = bio_alloc(GFP_NOIO, cnt); | ||
205 | memset(bio->bi_io_vec, 0, cnt * sizeof(struct bio_vec)); | ||
206 | } | ||
207 | |||
203 | 208 | ||
204 | to = bio->bi_io_vec + i; | 209 | to = bio->bi_io_vec + i; |
205 | 210 | ||