]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemuMigrationSrcNBDCopyCancel: Use qemuBlockStorageSourceAttachRollback to detach...
authorPeter Krempa <pkrempa@redhat.com>
Tue, 14 Nov 2023 16:07:44 +0000 (17:07 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 27 Nov 2023 09:14:20 +0000 (10:14 +0100)
Rewrite the code to use the common tooling for removing blockdevs
instead of the ad-hoc qemuBlockStorageSourceDetachOneBlockdev helper.

Use of the common infrastructure will properly handle cases when the raw
driver is ommited from the block graph.

Since the TLS data object is shared for all migration QMP commands and
objects we need to strip its alias from the definition of the storage
source before attempting to detach it.

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

index ac58aa1a8ce296076a4c052937523f357ef46b30..0f4c6dbe98f4c2aae39b60f3481b675c5a66d7e0 100644 (file)
@@ -938,12 +938,26 @@ qemuMigrationSrcNBDCopyCancel(virDomainObj *vm,
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDef *disk = vm->def->disks[i];
         qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
+        g_autoptr(qemuBlockStorageSourceAttachData) data = NULL;
 
         if (!diskPriv->migrSource)
             continue;
 
-        qemuBlockStorageSourceDetachOneBlockdev(vm, asyncJob,
-                                                diskPriv->migrSource);
+        /* remove the alias of the TLS object when we're about to detach the
+         * migration NBD blockdev as the TLS object is shared for the migration
+         * and we don't want to detach it. The alias is not needed after
+         * the JSON object of the blockdev props is formatted */
+        g_clear_pointer(&diskPriv->migrSource->tlsAlias, g_free);
+
+        data = qemuBlockStorageSourceDetachPrepare(diskPriv->migrSource);
+
+        if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+            goto cleanup;
+
+        qemuBlockStorageSourceAttachRollback(qemuDomainGetMonitor(vm), data);
+
+        qemuDomainObjExitMonitor(vm);
+
         g_clear_pointer(&diskPriv->migrSource, virObjectUnref);
     }