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 | |
| 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>
| -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 | ||
