For copy on write (this includes any cluster allocations that don't fill the whole cluster with one request), what qcow2 does looks like this:
1. Allocate new clusters (increase refcounts) 2. bdrv_flush 3. Copy sectors before the first touched one 4. bdrv_flush 5. Copy sectors after the last touched one 6. bdrv_flush 7. Update the L2 table to point to the new clusters Step 2 and 4 are not necessary. This series moves flushes around to get all of these three bdrv_flush calls merged into one. Kevin Wolf (4): qcow2: Move sync out of write_refcount_block_entries qcow2: Move sync out of update_refcount qcow2: Move sync out of qcow2_alloc_clusters qcow2: Get rid of additional sync on COW block/qcow2-cluster.c | 11 ++++++++++- block/qcow2-refcount.c | 13 ++++++++++++- block/qcow2-snapshot.c | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) -- 1.7.2.2