From: Peter Krempa <pkrempa@redhat.com>
Upcoming patches will modify how we treat inactive block nodes so that
we can properly deactivate nodes for 'manual' disk snapshot mode.
Re-activate the nodes before operations requiring them. This includes
also query operations where we e.g. probe bitmaps.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
src/qemu/qemu_backup.c | 3 +++
src/qemu/qemu_checkpoint.c | 12 ++++++++++++
src/qemu/qemu_driver.c | 9 +++++++++
src/qemu/qemu_migration.c | 3 +++
src/qemu/qemu_snapshot.c | 6 ++++++
5 files changed, 33 insertions(+)
diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
index 1f43479b5e..3b4fe54854 100644
--- a/src/qemu/qemu_backup.c
+++ b/src/qemu/qemu_backup.c
@@ -823,6 +823,9 @@ qemuBackupBegin(virDomainObj *vm,
if (qemuBackupBeginPrepareTLS(vm, cfg, def, &tlsProps, &tlsSecretProps) < 0)
goto endjob;
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_BACKUP) < 0)
+ goto endjob;
+
actions = virJSONValueNewArray();
/* The 'chk' checkpoint must be rolled back if the transaction command
diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c
index af847cf1f2..193cf9a06a 100644
--- a/src/qemu/qemu_checkpoint.c
+++ b/src/qemu/qemu_checkpoint.c
@@ -189,6 +189,9 @@ qemuCheckpointDiscardBitmaps(virDomainObj *vm,
actions = virJSONValueNewArray();
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ return -1;
+
if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, VIR_ASYNC_JOB_NONE)))
return -1;
@@ -411,6 +414,9 @@ qemuCheckpointRedefineValidateBitmaps(virDomainObj *vm,
if (virDomainObjCheckActive(vm) < 0)
return -1;
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ return -1;
+
if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, VIR_ASYNC_JOB_NONE)))
return -1;
@@ -516,6 +522,9 @@ qemuCheckpointCreate(virQEMUDriver *driver,
if (qemuCheckpointCreateCommon(driver, vm, def, &actions, &chk) < 0)
return NULL;
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ return NULL;
+
qemuDomainObjEnterMonitor(vm);
rc = qemuMonitorTransaction(qemuDomainGetMonitor(vm), &actions);
qemuDomainObjExitMonitor(vm);
@@ -651,6 +660,9 @@ qemuCheckpointGetXMLDescUpdateSize(virDomainObj *vm,
if (virDomainObjCheckActive(vm) < 0)
goto endjob;
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ goto endjob;
+
if (!(nodedataMerge = qemuBlockGetNamedNodeData(vm, VIR_ASYNC_JOB_NONE)))
goto endjob;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ac72ea5cb0..3954857512 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13820,6 +13820,9 @@ qemuDomainBlockPullCommon(virDomainObj *vm,
speed <<= 20;
}
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ goto endjob;
+
if (!(job = qemuBlockJobDiskNewPull(vm, disk, baseSource, flags)))
goto endjob;
@@ -14390,6 +14393,9 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
goto endjob;
}
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ goto endjob;
+
/* pre-create the image file. This is required so that libvirt can properly
* label the image for access by qemu */
if (!existing) {
@@ -14796,6 +14802,9 @@ qemuDomainBlockCommit(virDomainPtr dom,
base, disk->dst, NULL)))
goto endjob;
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_NONE) < 0)
+ goto endjob;
+
job = qemuBlockCommit(vm, disk, baseSource, topSource, top_parent,
speed, VIR_ASYNC_JOB_NONE, VIR_TRISTATE_BOOL_YES,
flags);
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 7d87b3073b..a11d1d8452 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2919,6 +2919,9 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver,
vm->newDef && !qemuDomainVcpuHotplugIsInOrder(vm->newDef)))
cookieFlags |= QEMU_MIGRATION_COOKIE_CPU_HOTPLUG;
+ if (qemuBlockNodesEnsureActive(vm, vm->job->asyncJob) < 0)
+ return NULL;
+
return qemuMigrationSrcBeginXML(vm, xmlin,
cookieout, cookieoutlen, cookieFlags,
migrate_disks, flags);
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index 764aafda4d..c988de37ca 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -2066,6 +2066,9 @@ qemuSnapshotCreate(virDomainObj *vm,
/* actually do the snapshot */
if (virDomainObjIsActive(vm)) {
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0)
+ goto error;
+
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY ||
virDomainSnapshotObjGetDef(snap)->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
/* external full system or disk snapshot */
@@ -4094,6 +4097,9 @@ qemuSnapshotDiscardImpl(virDomainObj *vm,
return -1;
}
} else {
+ if (qemuBlockNodesEnsureActive(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0)
+ return -1;
+
if (virDomainSnapshotIsExternal(snap)) {
if (qemuSnapshotDiscardExternal(vm, snap, externalData) < 0)
return -1;
--
2.51.0