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