]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: hotplug: Update disk private data after hotplug
authorPeter Krempa <pkrempa@redhat.com>
Wed, 19 Apr 2023 14:49:52 +0000 (16:49 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 24 Apr 2023 10:57:56 +0000 (12:57 +0200)
The disk private data contain information about the tray and
removability of the disk. Until recently we didn't support hotplug of
removable disks thus it wasn't a problem but now when you can hotplug a
CDROM you would not be able to open its tray.

Fix it by updating the hotplugged disk the same way we do at startup.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2160435
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_hotplug.c
tests/qemuhotplugtest.c

index 53a0874556a1388592ef61351ef2331281010074..52b057b4f3738ec6e8795ede2e0376d2fa1fa46e 100644 (file)
@@ -724,12 +724,23 @@ qemuDomainAttachDiskGeneric(virDomainObj *vm,
      * As there isn't anything sane to do if this fails, let's just return
      * success.
      */
-    if (rc == 0 &&
-        qemuDiskConfigBlkdeviotuneEnabled(disk)) {
+    if (rc == 0) {
         qemuDomainDiskPrivate *diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-        if (qemuMonitorSetBlockIoThrottle(priv->mon, NULL, diskPriv->qomName,
-                                          &disk->blkdeviotune) < 0)
-            VIR_WARN("failed to set blkdeviotune for '%s' of '%s'", disk->dst, vm->def->name);
+        g_autoptr(GHashTable) blockinfo = NULL;
+
+        if (qemuDiskConfigBlkdeviotuneEnabled(disk)) {
+            if (qemuMonitorSetBlockIoThrottle(priv->mon, NULL, diskPriv->qomName,
+                                              &disk->blkdeviotune) < 0)
+                VIR_WARN("failed to set blkdeviotune for '%s' of '%s'", disk->dst, vm->def->name);
+        }
+
+        if ((blockinfo = qemuMonitorGetBlockInfo(priv->mon))) {
+            struct qemuDomainDiskInfo *diskinfo;
+
+            if ((diskinfo = virHashLookup(blockinfo, diskPriv->qomName))) {
+                qemuProcessRefreshDiskProps(disk, diskinfo);
+            }
+        }
     }
 
     qemuDomainObjExitMonitor(vm);
index 6aaccce55b391618bc2c5f94b293e06cca3260a7..9e1b5e9be9b97d5d0395d01481d765f830efa21d 100644 (file)
@@ -709,6 +709,7 @@ mymain(void)
 
 
 #define QMP_OK      "{\"return\": {}}"
+#define QMP_EMPTY_ARRAY "{\"return\": []}"
 
 #define QMP_DEVICE_DELETED(dev) \
     "{" \
@@ -747,7 +748,8 @@ mymain(void)
     DO_TEST_ATTACH("x86_64", "base-live", "disk-virtio", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "disk-virtio", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "disk-virtio", false, false,
@@ -758,7 +760,8 @@ mymain(void)
     DO_TEST_ATTACH("x86_64", "base-live", "disk-usb", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "disk-usb", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "disk-usb", false, false,
@@ -769,7 +772,8 @@ mymain(void)
     DO_TEST_ATTACH("x86_64", "base-live", "disk-scsi", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "disk-scsi", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "disk-scsi", false, false,
@@ -785,7 +789,8 @@ mymain(void)
                    "device_add", QMP_OK,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-with-scsi-controller-live", "disk-scsi-2", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-with-scsi-controller-live", "disk-scsi-2", false, false,
@@ -797,7 +802,8 @@ mymain(void)
                    "object-add", QMP_OK,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "disk-scsi-multipath", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "disk-scsi-multipath", false, false,
@@ -817,7 +823,8 @@ mymain(void)
     DO_TEST_ATTACH("s390x", "base-ccw-live", "ccw-virtio", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("s390x", "base-ccw-live", "ccw-virtio", false, false,
                    "device_del", QMP_DEVICE_DELETED("virtio-disk4") QMP_OK,
                    "blockdev-del", QMP_OK,
@@ -826,7 +833,8 @@ mymain(void)
     DO_TEST_ATTACH("s390x", "base-ccw-live-with-ccw-virtio", "ccw-virtio-2", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
 
     DO_TEST_DETACH("s390x", "base-ccw-live-with-ccw-virtio", "ccw-virtio-2", false, false,
                    "device_del", QMP_DEVICE_DELETED("virtio-disk0") QMP_OK,
@@ -836,7 +844,8 @@ mymain(void)
     DO_TEST_ATTACH("s390x", "base-ccw-live-with-ccw-virtio", "ccw-virtio-2-explicit", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
 
     DO_TEST_DETACH("s390x", "base-ccw-live-with-ccw-virtio", "ccw-virtio-2-explicit", false, false,
                    "device_del", QMP_DEVICE_DELETED("virtio-disk0") QMP_OK,
@@ -847,7 +856,8 @@ mymain(void)
     DO_TEST_ATTACH("s390x", "base-ccw-live-with-ccw-virtio", "ccw-virtio-2-explicit", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
 
     DO_TEST_DETACH("s390x", "base-ccw-live-with-2-ccw-virtio", "ccw-virtio-1-explicit", false, true,
                    "device_del", QMP_DEVICE_DELETED("virtio-disk4") QMP_OK);
@@ -855,7 +865,8 @@ mymain(void)
     DO_TEST_ATTACH("s390x", "base-ccw-live-with-2-ccw-virtio", "ccw-virtio-1-reverse", false, false,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
 
     DO_TEST_ATTACH("x86_64", "base-live", "ivshmem-plain", false, true,
                    "object-add", QMP_OK,
@@ -873,7 +884,8 @@ mymain(void)
                    "disk-scsi-duplicate-wwn", false, false,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
 
     DO_TEST_ATTACH("x86_64", "base-live", "hostdev-pci", false, true,
                    "device_add", QMP_OK);
@@ -921,7 +933,8 @@ mymain(void)
     DO_TEST_ATTACH("x86_64", "base-live", "cdrom-usb", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "cdrom-usb", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "cdrom-usb", false, false,
@@ -932,7 +945,8 @@ mymain(void)
     DO_TEST_ATTACH("x86_64", "base-live", "cdrom-scsi", false, true,
                    "blockdev-add", QMP_OK,
                    "blockdev-add", QMP_OK,
-                   "device_add", QMP_OK);
+                   "device_add", QMP_OK,
+                   "query-block", QMP_EMPTY_ARRAY);
     DO_TEST_DETACH("x86_64", "base-live", "cdrom-scsi", true, true,
                    "device_del", QMP_OK);
     DO_TEST_DETACH("x86_64", "base-live", "cdrom-scsi", false, false,