[PATCH 5/5] qemu: blockcopy: Allow late opening of the backing chain of a shallow copy
Eric Blake
eblake at redhat.com
Wed Mar 11 16:09:40 UTC 2020
On 3/10/20 10:54 AM, Peter Krempa wrote:
> oVirt used a quirk in the pre-blockdev semantics of drive-mirror which
> opened the backing chain of the mirror destination only once
> 'block-job-complete' was called.
>
> Our introduction of blockdev made qemu open the backing chain images
> right at the start of the job. This broke oVirt's usage of this API
> because they copy the data into the backing chain during the time the
> block copy job is running.
>
> Re-introduce late open of the backing chain if qemu allows to use
reminder: "allows to ${verb}" is not idiomatic; I'd suggest either
"allows us to use" or "allows the use of"
> blockdev-snapshot on write-only nodes as it can be used to install the
> backing chain even for an existing image now.
>
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
> src/qemu/qemu_driver.c | 57 +++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 53 insertions(+), 4 deletions(-)
>
> @@ -17273,6 +17276,27 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
> blockNamedNodeData,
> shallow, &actions) < 0)
> return -1;
> +
> + /* Open and install the backing chain of 'mirror' late if we can use
> + * blockdev-snapshot to do it. This is to appease oVirt that wants
> + * to copy data into the backing chain while the top image is being
> + * copied shallow */
> + if (reuse && shallow &&
> + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_SNAPSHOT_ALLOW_WRITE_ONLY) &&
> + virStorageSourceHasBacking(disk->mirror)) {
> +
> + if (!(chainattachdata = qemuBuildStorageSourceChainAttachPrepareBlockdev(disk->mirror->backingStore,
> + priv->qemuCaps)))
> + return -1;
Long lines, but I'm not sure how to improve the situation.
The comments are good at explaining the situation - we have a window of
qemu releases that regress when using -blockdev, but as long as oVirt
can force either the old -drive behavior or insist on new-enough libvirt
coupled with new-enough qemu that restores the write-only-reopen feature
that we need, then oVirt won't hit the regression. I'm not sure how you
plan to advertise to oVirt if this is a new-enough libvirt + detection
of new-enough qemu to tell oVirt they don't need to cobble libvirt into
using -drive rather than -blockdev (they might solve that by minimum
required versions, rather than having to ask libvirt), but answering
that question doesn't interfere with the validity of this patch.
Reviewed-by: Eric Blake <eblake at redhat.com>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
More information about the libvir-list
mailing list