[PATCH 3/7] qemu: Re-activate block nodes before storage operations

Peter Krempa via Devel posted 7 patches 2 weeks ago
[PATCH 3/7] qemu: Re-activate block nodes before storage operations
Posted by Peter Krempa via Devel 2 weeks ago
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