diff options
Diffstat (limited to 'block/blk-merge.c')
-rw-r--r-- | block/blk-merge.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index d3b84bbb776a..7506c4fe0264 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
@@ -220,7 +220,10 @@ new_segment: | |||
220 | bvprv = bvec; | 220 | bvprv = bvec; |
221 | } /* segments in rq */ | 221 | } /* segments in rq */ |
222 | 222 | ||
223 | if (q->dma_drain_size) { | 223 | if (q->dma_drain_size && q->dma_drain_needed(rq)) { |
224 | if (rq->cmd_flags & REQ_RW) | ||
225 | memset(q->dma_drain_buffer, 0, q->dma_drain_size); | ||
226 | |||
224 | sg->page_link &= ~0x02; | 227 | sg->page_link &= ~0x02; |
225 | sg = sg_next(sg); | 228 | sg = sg_next(sg); |
226 | sg_set_page(sg, virt_to_page(q->dma_drain_buffer), | 229 | sg_set_page(sg, virt_to_page(q->dma_drain_buffer), |
@@ -228,6 +231,7 @@ new_segment: | |||
228 | ((unsigned long)q->dma_drain_buffer) & | 231 | ((unsigned long)q->dma_drain_buffer) & |
229 | (PAGE_SIZE - 1)); | 232 | (PAGE_SIZE - 1)); |
230 | nsegs++; | 233 | nsegs++; |
234 | rq->data_len += q->dma_drain_size; | ||
231 | } | 235 | } |
232 | 236 | ||
233 | if (sg) | 237 | if (sg) |