diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-19 08:03:02 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-19 08:03:02 -0800 |
commit | f6c427663a158056cd8ca71c01f30653e4b313f7 (patch) | |
tree | 7756753c37db84c1dd6cde1c99487f10e8a63878 /block/blk-merge.c | |
parent | 9ef38eaf4289a99beb3bc13d1ded220a68cc8877 (diff) | |
parent | fa2fc7f4813bfec1ae3232d49e3befbd601e8a6f (diff) |
Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
* 'for-linus' of git://git.kernel.dk/linux-2.6-block:
libata: implement drain buffers
libata: eliminate the home grown dma padding in favour of
block: clear drain buffer if draining for write command
block: implement request_queue->dma_drain_needed
block: add request->raw_data_len
block: update bio according to DMA alignment padding
libata: update ATAPI overflow draining
elevator: make elevator_get() attempt to load the appropriate module
cfq-iosched: add hlist for browsing parallel to the radix tree
block: make blk_rq_map_user() clear ->bio if it unmaps it
fs/block_dev.c: remove #if 0'ed code
make struct def_blk_aops static
make blk_settings_init() static
make blk_ioc_init() static
make blk-core.c:request_cachep static again
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 d3b84bbb776..7506c4fe026 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -220,7 +220,10 @@ new_segment: bvprv = bvec; } /* segments in rq */ - if (q->dma_drain_size) { + if (q->dma_drain_size && q->dma_drain_needed(rq)) { + if (rq->cmd_flags & REQ_RW) + memset(q->dma_drain_buffer, 0, q->dma_drain_size); + sg->page_link &= ~0x02; sg = sg_next(sg); sg_set_page(sg, virt_to_page(q->dma_drain_buffer), @@ -228,6 +231,7 @@ new_segment: ((unsigned long)q->dma_drain_buffer) & (PAGE_SIZE - 1)); nsegs++; + rq->data_len += q->dma_drain_size; } if (sg) |