diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-12-17 06:27:56 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-12-17 06:27:56 +0000 |
commit | 5db8a5259c8d4bba3d99761785f2444c6b3dd5ef (patch) | |
tree | 8219e471ad5e9ec19b79e2e904d1b75d43009250 /tools/blktap2 | |
parent | bc51449693eeac8a85e9ffabb366cf5b61e1d6af (diff) | |
download | xen-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.c | 11 |
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; |