aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap2
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:56 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:56 +0000
commit5db8a5259c8d4bba3d99761785f2444c6b3dd5ef (patch)
tree8219e471ad5e9ec19b79e2e904d1b75d43009250 /tools/blktap2
parentbc51449693eeac8a85e9ffabb366cf5b61e1d6af (diff)
downloadxen-5db8a5259c8d4bba3d99761785f2444c6b3dd5ef.tar.gz
xen-5db8a5259c8d4bba3d99761785f2444c6b3dd5ef.tar.bz2
xen-5db8a5259c8d4bba3d99761785f2444c6b3dd5ef.zip
Request re-coalescing for qcow disks. qcow driver had the habit of breaking each
(4K) block read into 8 (512 bytes) sector reads. This is inefficient, but also prevents sharing detector from working, as it is based on page-size reads. Signed-off-by: Grzegorz Milos <Grzegorz.Milos@citrix.com>
Diffstat (limited to 'tools/blktap2')
-rw-r--r--tools/blktap2/drivers/block-qcow.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/tools/blktap2/drivers/block-qcow.c b/tools/blktap2/drivers/block-qcow.c
index e0590ae59b..13d6c324ea 100644
--- a/tools/blktap2/drivers/block-qcow.c
+++ b/tools/blktap2/drivers/block-qcow.c
@@ -1035,6 +1035,17 @@ void tdqcow_queue_read(td_driver_t *driver, td_request_t treq)
}
if(!cluster_offset) {
+ int i;
+ /* Forward entire request if possible. */
+ for(i=0; i<nb_sectors; i++)
+ if(get_cluster_offset(s, (sector+i) << 9, 0, 0, 0, 0))
+ goto coalesce_failed;
+ treq.buf = buf;
+ treq.sec = sector;
+ treq.secs = nb_sectors;
+ td_forward_request(treq);
+ return;
+coalesce_failed:
treq.buf = buf;
treq.sec = sector;
treq.secs = n;