
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