[libvirt] [PATCH 10/12] qemu: Introduce code for blockdev-create

Ján Tomko jtomko at redhat.com
Thu Aug 15 12:02:25 UTC 2019


On Thu, Aug 08, 2019 at 06:00:40PM +0200, Peter Krempa wrote:
>QEMU finally exposes an interface which allows us to instruct it to
>format or create arbitrary images. This is required for blockdev
>integration of block copy and snapshots as we need to pre-format images
>prior to use with blockdev-add.
>
>This path introduces job handling and also helpers for formatting and
>attaching a whole image described by a virStorageSource.
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/qemu/qemu_block.c                         | 250 ++++++++++++++++++
> src/qemu/qemu_block.h                         |  14 +
> src/qemu/qemu_blockjob.c                      |  88 +++++-
> src/qemu/qemu_blockjob.h                      |  17 ++
> src/qemu/qemu_domain.c                        |  34 ++-
> src/qemu/qemu_driver.c                        |   1 +
> .../blockjob-blockdev-in.xml                  |  45 ++++
> 7 files changed, 446 insertions(+), 3 deletions(-)
>
>diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
>index 47661fb8bd..cb9a085e5d 100644
>--- a/src/qemu/qemu_block.c
>+++ b/src/qemu/qemu_block.c

[...]

>+static int
>+qemuBlockStorageSourceCreateStorage(virDomainObjPtr vm,
>+                                    virStorageSourcePtr src,
>+                                    virStorageSourcePtr chain,
>+                                    qemuDomainAsyncJob asyncJob)
>+{
>+    int actualType = virStorageSourceGetActualType(src);
>+    VIR_AUTOPTR(virJSONValue) createstorageprops = NULL;
>+    int ret;
>+
>+    /* we need to do stuff only for remote storage and local raw files */

Rather than rewording the following condition, it would be better to say
why we do not need to do it.

>+    if (actualType != VIR_STORAGE_TYPE_NETWORK &&
>+        !(actualType == VIR_STORAGE_TYPE_FILE && src->format == VIR_STORAGE_FILE_RAW))
>+        return 0;
>+
>+    if (qemuBlockStorageSourceCreateGetStorageProps(src, &createstorageprops) < 0)
>+        return -1;
>+
>+    if (!createstorageprops) {
>+        /* we can always try opening it to see whether it was existing */
>+        return 0;
>+    }
>+
>+    ret = qemuBlockStorageSourceCreateGeneric(vm, createstorageprops, src, chain,
>+                                              true, asyncJob);
>+    createstorageprops = NULL;
>+
>+    return ret;
>+}
>+
>+
>+static int
>+qemuBlockStorageSourceCreateFormat(virDomainObjPtr vm,
>+                                   virStorageSourcePtr src,
>+                                   virStorageSourcePtr backingStore,
>+                                   virStorageSourcePtr chain,
>+                                   qemuDomainAsyncJob asyncJob)
>+{
>+    VIR_AUTOPTR(virJSONValue) createformatprops = NULL;
>+    int ret;
>+
>+    if (src->format == VIR_STORAGE_FILE_RAW)
>+        return 0;
>+
>+    if (qemuBlockStorageSourceCreateGetFormatProps(src, backingStore,
>+                                                   &createformatprops) < 0)
>+        return -1;
>+
>+    if (!createformatprops) {
>+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
>+                       _("can't create storage format '%s'"),
>+                       virStorageFileFormatTypeToString(src->format));
>+        return -1;
>+    }
>+
>+    ret = qemuBlockStorageSourceCreateGeneric(vm, createformatprops, src, chain,
>+                                              false, asyncJob);
>+    createformatprops = NULL;
>+
>+    return ret;
>+}
>+
>+
>+/**
>+ * qemuBlockStorageSourceCreate:
>+ * @vm: domain object
>+ * @src: storage source definition to create
>+ * @backingStore: backingStore of the new image (used only in image metadata)
>+ * @chain: backing chain to unplug in case of a long-running job failure
>+ * @data: qemuBlockStorageSourceAttachData for @src so that it can be attached
>+ * @asyncJob: qemu asynchronous job type
>+ *
>+ * Creates and formats a storage volume according to @src and attaches it to @vm.
>+ * @data must provide attachment data as if @src was existing. @src is attached
>+ * after successful return of this function. If libvirtd is restarted during
>+ * the create job @chain is unplugged, otherwise it's left for the caller.
>+ * If @backingStore is provided, the new image will refer to it as it's backing

*its

>+ * store.
>+ */

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190815/22de05be/attachment-0001.sig>


More information about the libvir-list mailing list