Create qemuBuildCommandLineValidate to make some checks before trying
to build the command. This will move some logic from much later to much
earlier - we shouldn't be adjusting any data so that shouldn't matter.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_command.c | 174 ++++++++++++++++++++++++++++--------------------
1 file changed, 102 insertions(+), 72 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 7c1a457..f68509d 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6608,6 +6608,98 @@ qemuBuildTPMCommandLine(virDomainDefPtr def,
}
+/*
+ * qemuBuildCommandLineValidate:
+ *
+ * Prior to taking the plunge and building a long command line only
+ * to find some configuration option isn't valid, let's do a couple
+ * of checks and fail early.
+ *
+ * Returns 0 on success, returns -1 and messages what the issue is.
+ */
+static int
+qemuBuildCommandLineValidate(virQEMUDriverPtr driver,
+ const virDomainDef *def)
+{
+ size_t i;
+ int sdl = 0;
+ int vnc = 0;
+ int spice = 0;
+
+ if (!virQEMUDriverIsPrivileged(driver)) {
+ /* If we have no cgroups then we can have no tunings that
+ * require them */
+
+ if (virMemoryLimitIsSet(def->mem.hard_limit) ||
+ virMemoryLimitIsSet(def->mem.soft_limit) ||
+ def->mem.min_guarantee ||
+ virMemoryLimitIsSet(def->mem.swap_hard_limit)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Memory tuning is not available in session
mode"));
+ return -1;
+ }
+
+ if (def->blkio.weight) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Block I/O tuning is not available in session
mode"));
+ return -1;
+ }
+
+ if (def->cputune.sharesSpecified || def->cputune.period ||
+ def->cputune.quota || def->cputune.emulator_period ||
+ def->cputune.emulator_quota) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("CPU tuning is not available in session mode"));
+ return -1;
+ }
+ }
+
+ for (i = 0; i < def->ngraphics; ++i) {
+ switch (def->graphics[i]->type) {
+ case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+ ++sdl;
+ break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ ++vnc;
+ break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
+ ++spice;
+ break;
+ }
+ }
+
+ if (sdl > 1 || vnc > 1 || spice > 1) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("only 1 graphics device of each type "
+ "(sdl, vnc, spice) is supported"));
+ return -1;
+ }
+
+ if (def->virtType == VIR_DOMAIN_VIRT_XEN ||
+ def->os.type == VIR_DOMAIN_OSTYPE_XEN ||
+ def->os.type == VIR_DOMAIN_OSTYPE_LINUX) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("qemu emulator '%s' does not support xen"),
+ def->emulator);
+ return -1;
+ }
+
+ for (i = 0; i < def->ndisks; i++) {
+ virDomainDiskDefPtr disk = def->disks[i];
+
+ if (disk->src->driverName != NULL &&
+ STRNEQ(disk->src->driverName, "qemu")) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unsupported driver name '%s' for disk
'%s'"),
+ disk->src->driverName, disk->src->path);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
qemuBuildCommandLineCallbacks buildCommandLineCallbacks = {
.qemuGetSCSIDeviceSgName = virSCSIDeviceGetSgName,
};
@@ -6641,14 +6733,12 @@ qemuBuildCommandLine(virConnectPtr conn,
char uuid[VIR_UUID_STRING_BUFLEN];
char *cpu;
char *smp;
+ bool havespice = false;
int last_good_net = -1;
bool hasHwVirt = false;
virCommandPtr cmd = NULL;
bool allowReboot = true;
bool emitBootindex = false;
- int sdl = 0;
- int vnc = 0;
- int spice = 0;
int usbcontroller = 0;
int actualSerials = 0;
bool usblegacy = false;
@@ -6692,47 +6782,8 @@ qemuBuildCommandLine(virConnectPtr conn,
virUUIDFormat(def->uuid, uuid);
- if (!virQEMUDriverIsPrivileged(driver)) {
- /* If we have no cgroups then we can have no tunings that
- * require them */
-
- if (virMemoryLimitIsSet(def->mem.hard_limit) ||
- virMemoryLimitIsSet(def->mem.soft_limit) ||
- def->mem.min_guarantee ||
- virMemoryLimitIsSet(def->mem.swap_hard_limit)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Memory tuning is not available in session
mode"));
- goto error;
- }
-
- if (def->blkio.weight) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("Block I/O tuning is not available in session
mode"));
- goto error;
- }
-
- if (def->cputune.sharesSpecified || def->cputune.period ||
- def->cputune.quota || def->cputune.emulator_period ||
- def->cputune.emulator_quota) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("CPU tuning is not available in session mode"));
- goto error;
- }
- }
-
- for (i = 0; i < def->ngraphics; ++i) {
- switch (def->graphics[i]->type) {
- case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
- ++sdl;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- ++vnc;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
- ++spice;
- break;
- }
- }
+ if (qemuBuildCommandLineValidate(driver, def) < 0)
+ goto error;
/*
* do not use boot=on for drives when not using KVM since this
@@ -6872,14 +6923,6 @@ qemuBuildCommandLine(virConnectPtr conn,
}
virCommandAddArgList(cmd, "-uuid", uuid, NULL);
- if (def->virtType == VIR_DOMAIN_VIRT_XEN ||
- def->os.type == VIR_DOMAIN_OSTYPE_XEN ||
- def->os.type == VIR_DOMAIN_OSTYPE_LINUX) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("qemu emulator '%s' does not support xen"),
- def->emulator);
- goto error;
- }
if ((def->os.smbios_mode != VIR_DOMAIN_SMBIOS_NONE) &&
(def->os.smbios_mode != VIR_DOMAIN_SMBIOS_EMULATE)) {
@@ -7394,18 +7437,6 @@ qemuBuildCommandLine(virConnectPtr conn,
}
}
- for (i = 0; i < def->ndisks; i++) {
- virDomainDiskDefPtr disk = def->disks[i];
-
- if (disk->src->driverName != NULL &&
- STRNEQ(disk->src->driverName, "qemu")) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unsupported driver name '%s' for disk
'%s'"),
- disk->src->driverName, disk->src->path);
- goto error;
- }
- }
-
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
for (j = 0; j < ARRAY_CARDINALITY(contOrder); j++) {
for (i = 0; i < def->ncontrollers; i++) {
@@ -7814,11 +7845,17 @@ qemuBuildCommandLine(virConnectPtr conn,
virCommandAddArgBuffer(cmd, &opt);
}
+ if (def->nserials) {
+ for (i = 0; i < def->ngraphics && !havespice; i++) {
+ if (def->graphics[i]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE)
+ havespice = true;
+ }
+ }
for (i = 0; i < def->nserials; i++) {
virDomainChrDefPtr serial = def->serials[i];
char *devstr;
- if (serial->source.type == VIR_DOMAIN_CHR_TYPE_SPICEPORT && !spice)
+ if (serial->source.type == VIR_DOMAIN_CHR_TYPE_SPICEPORT &&
!havespice)
continue;
/* Use -chardev with -device if they are available */
@@ -8052,13 +8089,6 @@ qemuBuildCommandLine(virConnectPtr conn,
}
}
- if (sdl > 1 || vnc > 1 || spice > 1) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("only 1 graphics device of each type "
- "(sdl, vnc, spice) is supported"));
- goto error;
- }
-
for (i = 0; i < def->ngraphics; ++i) {
if (qemuBuildGraphicsCommandLine(cfg, cmd, def, qemuCaps,
def->graphics[i]) < 0)
--
2.5.0