]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuValidateDomainDeviceDefDiskTransient: Validate that qemu doesn't terminate early
authorMasayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Mon, 30 Aug 2021 04:30:43 +0000 (00:30 -0400)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 Sep 2021 09:13:06 +0000 (11:13 +0200)
Setup of a disk with <transient shareBacking='yes'/> option issues a
reset of qemu. In cases when QEMU didn't yet support the 'set-action'
QMP libvirt would in certain cases setup the commandline without
'-no-shutdown' which caused qemu to exit during startup. Forbid this
specific scenario.

Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_validate.c

index 8906aa52d9e14ebaf6f8802506371102a70618cb..1a470f1ff56b8e147bcb282367d968660bce67e2 100644 (file)
@@ -24,6 +24,7 @@
 #include "qemu_block.h"
 #include "qemu_command.h"
 #include "qemu_domain.h"
+#include "qemu_process.h"
 #include "domain_conf.h"
 #include "virlog.h"
 #include "virutil.h"
@@ -2991,6 +2992,7 @@ qemuValidateDomainDeviceDefDiskBlkdeviotune(const virDomainDiskDef *disk,
 
 static int
 qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
+                                         const virDomainDef *def,
                                          virQEMUCaps *qemuCaps)
 
 {
@@ -3033,6 +3035,13 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
     }
 
     if (disk->transientShareBacking == VIR_TRISTATE_BOOL_YES) {
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SET_ACTION) &&
+            !qemuProcessRebootAllowed(def)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("transient disk backing image sharing with destroy action of lifecycle isn't supported by this QEMU binary"));
+            return -1;
+        }
+
         /* sharing the backing file requires hotplug of the disk in the qemu driver */
         switch (disk->bus) {
         case VIR_DOMAIN_DISK_BUS_USB:
@@ -3077,7 +3086,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
     if (qemuValidateDomainDeviceDefDiskBlkdeviotune(disk, def) < 0)
         return -1;
 
-    if (qemuValidateDomainDeviceDefDiskTransient(disk, qemuCaps) < 0)
+    if (qemuValidateDomainDeviceDefDiskTransient(disk, def, qemuCaps) < 0)
         return -1;
 
     if (disk->src->shared && !disk->src->readonly &&