From: Jens Axboe Date: Tue, 23 Oct 2007 07:49:25 +0000 (+0200) Subject: [BLOCK] blk_rq_map_sg: force clear termination bit X-Git-Tag: v2.6.24-rc1~34^2~14 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=7aeacf982203fb4dea2f3434eefdc268cfd5d6d9;p=linux-2.6-omap-h63xx.git [BLOCK] blk_rq_map_sg: force clear termination bit Since blk_rq_map_sg() sets the termination bit at the end of the sg table, we could see it prematurely on the next mapping unless we force drivers to do a full sg_init_table() prior to each mapping. So force clear the termination bit to avoid having to put that clear in the driver for every mapping. Signed-off-by: Jens Axboe --- diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index fb8fb8852c3..de5ba479c22 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c @@ -1351,8 +1351,20 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, new_segment: if (!sg) sg = sglist; - else + else { + /* + * If the driver previously mapped a shorter + * list, we could see a termination bit + * prematurely unless it fully inits the sg + * table on each mapping. We KNOW that there + * must be more entries here or the driver + * would be buggy, so force clear the + * termination bit to avoid doing a full + * sg_init_table() in drivers for each command. + */ + sg->page_link &= ~0x02; sg = sg_next(sg); + } sg_set_page(sg, bvec->bv_page); sg->length = nbytes;