[libvirt] [PATCH 05/14] qemu: hotplug: Change arguments for qemuDomainChangeEjectableMedia

Peter Krempa pkrempa at redhat.com
Fri Aug 8 14:52:33 UTC 2014


Pass the source of the changed media instead of a complete disk
definition.

Note that the @disk argument now contains what @olddisk would contain.
The new source is passed as a virStorageSource struct.
---
 src/qemu/qemu_driver.c  |  6 ++++-
 src/qemu/qemu_hotplug.c | 71 ++++++++++++++++++++++---------------------------
 src/qemu/qemu_hotplug.h |  2 +-
 3 files changed, 38 insertions(+), 41 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 03fe96f..fc345d5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6623,6 +6623,7 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn,
     virDomainDiskDefPtr orig_disk = NULL;
     virDomainDiskDefPtr tmp = NULL;
     virDomainDeviceDefPtr dev_copy = NULL;
+    virStorageSourcePtr newsrc;
     virCapsPtr caps = NULL;
     int ret = -1;

@@ -6661,7 +6662,10 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn,
         if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
             goto end;

-        ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, force);
+        newsrc = disk->src;
+        disk->src = NULL;
+
+        ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, force);
         /* 'disk' must not be accessed now - it has been freed.
          * 'orig_disk' now points to the new disk, while 'dev_copy'
          * now points to the old disk */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 5894f43..9ad06be 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -140,34 +140,33 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver,
 int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainDiskDefPtr disk,
-                                   virDomainDiskDefPtr origdisk,
+                                   virStorageSourcePtr newsrc,
                                    bool force)
 {
     int ret = -1;
     char *driveAlias = NULL;
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int retries = CHANGE_MEDIA_RETRIES;
-    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
-    const char *src = NULL;
+    const char *format = NULL;

-    if (!origdisk->info.alias) {
+    if (!disk->info.alias) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("missing disk device alias name for %s"), origdisk->dst);
+                       _("missing disk device alias name for %s"), disk->dst);
         goto cleanup;
     }

-    if (origdisk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
-        origdisk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
+    if (disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
+        disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Removable media not supported for %s device"),
                        virDomainDiskDeviceTypeToString(disk->device));
         goto cleanup;
     }

-    if (qemuDomainPrepareDisk(driver, vm, disk, NULL, false) < 0)
+    if (qemuDomainPrepareDisk(driver, vm, disk, newsrc, false) < 0)
         goto cleanup;

-    if (!(driveAlias = qemuDeviceDriveHostAlias(origdisk, priv->qemuCaps)))
+    if (!(driveAlias = qemuDeviceDriveHostAlias(disk, priv->qemuCaps)))
         goto error;

     qemuDomainObjEnterMonitor(driver, vm);
@@ -180,7 +179,7 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
     virObjectRef(vm);
     /* we don't want to report errors from media tray_open polling */
     while (retries) {
-        if (origdisk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)
+        if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)
             break;

         retries--;
@@ -198,53 +197,42 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
         goto error;
     }

-    src = virDomainDiskGetSource(disk);
-    if (src) {
-        /* deliberately don't depend on 'ret' as 'eject' may have failed the
-         * first time and we are going to check the drive state anyway */
-        const char *format = NULL;
-        int type = virDomainDiskGetType(disk);
-        int diskFormat = virDomainDiskGetFormat(disk);
-
-        if (type != VIR_STORAGE_TYPE_DIR) {
-            if (diskFormat > 0) {
-                format = virStorageFileFormatTypeToString(diskFormat);
+    if (newsrc->path) {
+        if (virStorageSourceGetActualType(newsrc) != VIR_STORAGE_TYPE_DIR) {
+            if (newsrc->format > 0) {
+                format = virStorageFileFormatTypeToString(newsrc->format);
             } else {
-                diskFormat = virDomainDiskGetFormat(origdisk);
-                if (diskFormat > 0)
-                    format = virStorageFileFormatTypeToString(diskFormat);
+                if (disk->src->format > 0)
+                    format = virStorageFileFormatTypeToString(disk->src->format);
             }
         }
         qemuDomainObjEnterMonitor(driver, vm);
         ret = qemuMonitorChangeMedia(priv->mon,
                                      driveAlias,
-                                     src, format);
+                                     newsrc->path,
+                                     format);
         qemuDomainObjExitMonitor(driver, vm);
     }

-    virDomainAuditDisk(vm, origdisk->src, disk->src, "update", ret >= 0);
+    virDomainAuditDisk(vm, disk->src, newsrc, "update", ret >= 0);

     if (ret < 0)
         goto error;

-    ignore_value(qemuDomainPrepareDisk(driver, vm, origdisk, NULL, true));
-
-    if (virDomainDiskSetSource(origdisk, src) < 0)
-        goto error;
-    virDomainDiskSetType(origdisk, virDomainDiskGetType(disk));
+    ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true));

-    virDomainDiskDefFree(disk);
+    virStorageSourceFree(disk->src);
+    disk->src = newsrc;
+    newsrc = NULL;

  cleanup:
+    virStorageSourceFree(newsrc);
     VIR_FREE(driveAlias);
-    virObjectUnref(cfg);
     return ret;

  error:
-    virDomainAuditDisk(vm, origdisk->src, disk->src, "update", false);
-
-    ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true));
-
+    virDomainAuditDisk(vm, disk->src, newsrc, "update", false);
+    ignore_value(qemuDomainPrepareDisk(driver, vm, disk, newsrc, true));
     goto cleanup;
 }

@@ -746,6 +734,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
     virDomainDiskDefPtr disk = dev->data.disk;
     virDomainDiskDefPtr orig_disk = NULL;
     virDomainDeviceDefPtr dev_copy = NULL;
+    virStorageSourcePtr newsrc;
     virDomainDiskDefPtr tmp = NULL;
     virCapsPtr caps = NULL;
     int ret = -1;
@@ -788,6 +777,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
         if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
             goto end;

+
         tmp = dev->data.disk;
         dev->data.disk = orig_disk;

@@ -798,8 +788,11 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
         }
         dev->data.disk = tmp;

-        ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, false);
-        /* 'disk' must not be accessed now - it has been free'd.
+        newsrc = disk->src;
+        disk->src = NULL;
+
+        ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, false);
+        /* 'newsrc' must not be accessed now - it has been free'd.
          * 'orig_disk' now points to the new disk, while 'dev_copy'
          * now points to the old disk */

diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
index 6192973..5ce8f0a 100644
--- a/src/qemu/qemu_hotplug.h
+++ b/src/qemu/qemu_hotplug.h
@@ -31,7 +31,7 @@
 int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
                                    virDomainObjPtr vm,
                                    virDomainDiskDefPtr disk,
-                                   virDomainDiskDefPtr orig_disk,
+                                   virStorageSourcePtr newsrc,
                                    bool force);
 int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
                                   virDomainObjPtr vm,
-- 
2.0.2




More information about the libvir-list mailing list