]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Always assume support for QEMU_CAPS_BLOCKDEV_REOPEN
authorPeter Krempa <pkrempa@redhat.com>
Wed, 12 Mar 2025 15:48:53 +0000 (16:48 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 13 Mar 2025 14:38:16 +0000 (15:38 +0100)
'blockdev-reopen' is supported since qemu-6.1, thus we can now remove
the interlocks.

Document the change to 'mirror' as this patch removes the last clue why
we overwrite the mirror's readonly state to false unconditionally.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_blockjob.c
src/qemu/qemu_checkpoint.c
src/qemu/qemu_driver.c

index 3aef1ec285a2b38543dc3c005d7b525c3ec6ac57..be18f7b27366c897c45e80dbf43a95f0e277a75a 100644 (file)
@@ -968,10 +968,6 @@ qemuBlockJobProcessEventCompletedCommitBitmaps(virDomainObj *vm,
     g_autoptr(virJSONValue) actions = NULL;
     bool active = job->type == QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT;
 
-    if (!active &&
-        !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN))
-        return 0;
-
     if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, asyncJob)))
         return -1;
 
@@ -1205,9 +1201,6 @@ qemuBlockJobProcessEventCompletedCopyBitmaps(virDomainObj *vm,
     g_autoptr(virJSONValue) actions = NULL;
     bool shallow = job->jobflags & VIR_DOMAIN_BLOCK_COPY_SHALLOW;
 
-    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN))
-        return 0;
-
     if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, asyncJob)))
         return -1;
 
@@ -1237,7 +1230,6 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriver *driver,
                                            qemuBlockJobData *job,
                                            virDomainAsyncJob asyncJob)
 {
-    qemuDomainObjPrivate *priv = vm->privateData;
     g_autoptr(virStorageSource) src = NULL;
 
     VIR_DEBUG("copy job '%s' on VM '%s' pivoted", job->name, vm->def->name);
@@ -1257,8 +1249,7 @@ qemuBlockJobProcessEventConcludedCopyPivot(virQEMUDriver *driver,
         !virStorageSourceIsBacking(job->disk->mirror->backingStore))
         job->disk->mirror->backingStore = g_steal_pointer(&job->disk->src->backingStore);
 
-    if (job->disk->src->readonly &&
-        virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN))
+    if (job->disk->src->readonly)
         ignore_value(qemuBlockReopenReadOnly(vm, job->disk->mirror, asyncJob));
 
     qemuBlockJobRewriteConfigDiskSource(vm, job->disk, job->disk->mirror);
index ca58da8fcbf1a8484a7ccf73ff33ddafc0205b92..b05aaa246e09c41e3f45fed6a4effe3e98194f14 100644 (file)
@@ -225,8 +225,7 @@ qemuCheckpointDiscardBitmaps(virDomainObj *vm,
                                                false, false, false) < 0)
             goto relabel;
 
-        if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN) &&
-            qemuBlockReopenReadWrite(vm, src, VIR_ASYNC_JOB_NONE) < 0)
+        if (qemuBlockReopenReadWrite(vm, src, VIR_ASYNC_JOB_NONE) < 0)
             goto relabel;
 
         relabelimages = g_slist_prepend(relabelimages, src);
@@ -240,8 +239,7 @@ qemuCheckpointDiscardBitmaps(virDomainObj *vm,
     for (next = relabelimages; next; next = next->next) {
         virStorageSource *src = next->data;
 
-        if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN))
-            ignore_value(qemuBlockReopenReadOnly(vm, src, VIR_ASYNC_JOB_NONE));
+        ignore_value(qemuBlockReopenReadOnly(vm, src, VIR_ASYNC_JOB_NONE));
 
         ignore_value(qemuDomainStorageSourceAccessAllow(driver, vm, src,
                                                         true, false, false));
index 2364b4d312de8d04ecb62f7346bc4baec19a2320..ef731cb07262ed14eb684e2644b2a29285a35836 100644 (file)
@@ -14260,14 +14260,9 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
                                          keepParentLabel) < 0)
         goto endjob;
 
-    if (mirror->readonly) {
-        if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) {
-            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-                           _("copy of read-only disks is not supported"));
-            goto endjob;
-        }
-        mirror->readonly = false;
-    }
+    /* In case we're copying a read-only disk we need to open the mirror image
+     * as read-write for the duration of the copy job */
+    mirror->readonly = false;
 
     /* we must initialize XML-provided chain prior to detecting to keep semantics
      * with VM startup */