aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2007-10-17 13:34:11 -0400
committerJens Axboe <jens.axboe@oracle.com>2007-10-17 13:34:11 -0400
commitba951841ceb7fa5b06ad48caa5270cc2ae17941e (patch)
treefda194f4506fb2af93895d3aac1902051678e8e0
parenta3bec5c5aea0da263111c4d8f8eabc1f8560d7bf (diff)
[BLOCK] blk_rq_map_sg() next_sg fixup
Don't ever use sg_next() on the last entry, it may not be valid! Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--block/ll_rw_blk.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 9e3f3cc85d0d..3935469e3662 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -1322,8 +1322,8 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
1322 struct scatterlist *sglist) 1322 struct scatterlist *sglist)
1323{ 1323{
1324 struct bio_vec *bvec, *bvprv; 1324 struct bio_vec *bvec, *bvprv;
1325 struct scatterlist *next_sg, *sg;
1326 struct req_iterator iter; 1325 struct req_iterator iter;
1326 struct scatterlist *sg;
1327 int nsegs, cluster; 1327 int nsegs, cluster;
1328 1328
1329 nsegs = 0; 1329 nsegs = 0;
@@ -1333,7 +1333,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
1333 * for each bio in rq 1333 * for each bio in rq
1334 */ 1334 */
1335 bvprv = NULL; 1335 bvprv = NULL;
1336 sg = next_sg = &sglist[0]; 1336 sg = NULL;
1337 rq_for_each_segment(bvec, rq, iter) { 1337 rq_for_each_segment(bvec, rq, iter) {
1338 int nbytes = bvec->bv_len; 1338 int nbytes = bvec->bv_len;
1339 1339
@@ -1349,8 +1349,10 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
1349 sg->length += nbytes; 1349 sg->length += nbytes;
1350 } else { 1350 } else {
1351new_segment: 1351new_segment:
1352 sg = next_sg; 1352 if (!sg)
1353 next_sg = sg_next(sg); 1353 sg = sglist;
1354 else
1355 sg = sg_next(sg);
1354 1356
1355 memset(sg, 0, sizeof(*sg)); 1357 memset(sg, 0, sizeof(*sg));
1356 sg->page = bvec->bv_page; 1358 sg->page = bvec->bv_page;