]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Re-activate block nodes before storage operations
authorPeter Krempa <pkrempa@redhat.com>
Thu, 24 Jul 2025 13:55:13 +0000 (15:55 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 21 Oct 2025 13:32:39 +0000 (15:32 +0200)
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>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_backup.c
src/qemu/qemu_checkpoint.c
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_snapshot.c

index 1f43479b5e2b2d96933a654f32cbfc643e41e58d..3b4fe54854655bf687a645daeb95d82d728428ae 100644 (file)
@@ -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
index af847cf1f20618b9c64e0f456dcc893a9ef623b6..193cf9a06aeb442d09dae8e253c9d33f3693bcbd 100644 (file)
@@ -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;
 
index d26c8997bf21e4a3620a4ae067772bf6c2cee1c1..7860f1dc89bc082264ff8e3083b784aaf99a7502 100644 (file)
@@ -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);
index 7d87b3073b7639cc18aed684808f1f23a9b9e492..a11d1d8452dedd9c8867fe8039062027ea2f2077 100644 (file)
@@ -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);
index 764aafda4d80821141481e9e8779aa08abc20046..c988de37ca781c8f544adea19f2038be7d06a7d6 100644 (file)
@@ -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;