]> git.proxmox.com Git - mirror_qemu.git/commit - blockdev.c
mirror: perform COW if the cluster size is bigger than the granularity
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 21 Jan 2013 16:09:43 +0000 (17:09 +0100)
committerKevin Wolf <kwolf@redhat.com>
Fri, 25 Jan 2013 17:18:33 +0000 (18:18 +0100)
commitb812f6719c21921a819709098dc018ed151c999b
tree7ba53b619b76a1faff44994b59d069c0d57ccd9d
parent343bded4ecfc467012e2ab675da75749f1d90f70
mirror: perform COW if the cluster size is bigger than the granularity

When mirroring runs, the backing files for the target may not yet be
ready.  However, this means that a copy-on-write operation on the target
would fill the missing sectors with zeros.  Copy-on-write only happens
if the granularity of the dirty bitmap is smaller than the cluster size
(and only for clusters that are allocated in the source after the job
has started copying).  So far, the granularity was fixed to 1MB; to avoid
the problem we detected the situation and required the backing files to
be available in that case only.

However, we want to lower the granularity for efficiency, so we need
a better solution.  The solution is to always copy a whole cluster the
first time it is touched.  The code keeps a bitmap of clusters that
have already been allocated by the mirroring job, and only does "manual"
copy-on-write if the chunk being copied is zero in the bitmap.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block/mirror.c
blockdev.c
tests/qemu-iotests/041
tests/qemu-iotests/041.out
trace-events