diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-12-23 12:44:19 +0100 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-12-29 08:29:52 +0100 |
commit | f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f (patch) | |
tree | 2d260f45b150f8dbf56242bd58372769e6478205 /mm | |
parent | a0ea8622918019ed76c0b85f5d0247809ba05a7c (diff) | |
download | op-kernel-dev-f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f.zip op-kernel-dev-f735b5eeb9fcbb001e0cf2a5296b19c4bbaec55f.tar.gz |
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')
-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 bf0cf7c..e590272 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; |