On Wed, Jul 24, 2019 at 11:07:36PM +0200, Peter Krempa wrote:
Introduce the handler for finalizing a block commit and active bloc
commit job which will allow to use it with blockdev.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_blockjob.c | 212 ++++++++++++++++++
src/qemu/qemu_blockjob.h | 18 ++
src/qemu/qemu_domain.c | 32 +++
src/qemu/qemu_driver.c | 50 +++--
.../blockjob-blockdev-in.xml | 15 ++
5 files changed, 311 insertions(+), 16 deletions(-)
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index a29af7ec48..4cbdc34b66 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -237,6 +237,43 @@ qemuBlockJobDiskNewPull(virDomainObjPtr vm,
}
+qemuBlockJobDataPtr
+qemuBlockJobDiskNewCommit(virDomainObjPtr vm,
+ virDomainDiskDefPtr disk,
+ virStorageSourcePtr topparent,
+ virStorageSourcePtr top,
+ virStorageSourcePtr base)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ VIR_AUTOUNREF(qemuBlockJobDataPtr) job = NULL;
+ VIR_AUTOFREE(char *) jobname = NULL;
+ qemuBlockJobType jobtype = QEMU_BLOCKJOB_TYPE_COMMIT;
+
+ if (topparent == NULL)
+ jobtype = QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT;
+
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
+ if (virAsprintf(&jobname, "commit-%s-%s", disk->dst,
top->nodeformat) < 0)
+ return NULL;
+ } else {
+ if (!(jobname = qemuAliasDiskDriveFromDisk(disk)))
+ return NULL;
+ }
+
+ if (!(job = qemuBlockJobDataNew(jobtype, jobname)))
+ return NULL;
+
+ job->data.commit.topparent = topparent;
/me considers making
World's Top Parent
T-shirts
+ job->data.commit.top = top;
+ job->data.commit.base = base;
+
+ if (qemuBlockJobRegister(job, vm, disk, true) < 0)
+ return NULL;
+
+ VIR_RETURN_PTR(job);
+}
+
+
/**
* qemuBlockJobDiskRegisterMirror:
* @job: block job to register 'mirror' chain on
@@ -18107,15 +18106,34 @@ qemuDomainBlockCommit(virDomainPtr dom,
* depending on whether the input was specified as relative or
* absolute (that is, our absolute top_canon may do the wrong
* thing if the user specified a relative name). */
+
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
if (blockdev)
+ persistjob = true;
+ jobname = job->name;
+ nodetop = topSource->nodeformat;
+ nodebase = baseSource->nodeformat;
+ device = disk->src->nodeformat;
+ if (!backingPath && top_parent &&
+ !(backingPath = qemuBlockGetBackingStoreString(baseSource)))
+ goto endjob;
+ } else {
+ device = job->name;
+ }
+
qemuDomainObjEnterMonitor(driver, vm);
- basePath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
- baseSource);
- topPath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
- topSource);
- if (basePath && topPath)
- ret = qemuMonitorBlockCommit(priv->mon, device, NULL, false,
- topPath, NULL, basePath, NULL, backingPath,
- speed);
+
+ if (!jobname) {
+ basePath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
+ baseSource);
+ topPath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
+ topSource);
+ }
+
+ if ((basePath && topPath) || jobname)
This is option a) I proposed in the previous patch.
+ ret = qemuMonitorBlockCommit(priv->mon, device, jobname,
persistjob,
+ topPath, nodetop, basePath, nodebase,
+ backingPath, speed);
+
Reviewed-by: Ján Tomko <jtomko(a)redhat.com>
Jano