From d9fc08d103ff3b6346fa663ca2ca13d5ea6f5e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Mon, 21 Aug 2017 16:44:42 +0200 Subject: [PATCH] vmx: do not treat controllers as implicit devices When parsing the config, we look for the SCSI controllers one by one, remembering their models, then let virDomainDefAddImplicitDevices add them if any SCSI disk is using them. Since these controllers are not really implicit (they are present in the source config), add them explicitly. This patch maintains the behavior of not adding a controller if it was present in the config, but no disk was using it. This also resolves the memory leak of virVMXParseConfig overwriting the video device added by calling virDomainDefAddImplicitDevices before the parsing is finished. Reported-by: Michal Privoznik --- src/vmx/vmx.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 3e2f4c3e1b..d1d8184c56 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -1650,6 +1650,18 @@ virVMXParseConfig(virVMXContext *ctx, if (def->disks[def->ndisks] != NULL) ++def->ndisks; } + + } + + /* add all the SCSI controllers we've seen, up until the last one that is + * currently used by a disk */ + if (def->ndisks != 0) { + virDomainDeviceInfoPtr info = &def->disks[def->ndisks - 1]->info; + for (controller = 0; controller <= info->addr.drive.controller; controller++) { + if (!virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, + controller, scsi_virtualDev[controller])) + goto cleanup; + } } /* def:disks (ide) */ @@ -1689,26 +1701,6 @@ virVMXParseConfig(virVMXContext *ctx, ++def->ndisks; } - /* def:controllers */ - if (virDomainDefAddImplicitDevices(def) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not add controllers")); - goto cleanup; - } - - for (controller = 0; controller < def->ncontrollers; ++controller) { - if (def->controllers[controller]->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) { - if (def->controllers[controller]->idx > 3) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("SCSI controller index %d out of [0..3] range"), - def->controllers[controller]->idx); - goto cleanup; - } - - def->controllers[controller]->model = - scsi_virtualDev[def->controllers[controller]->idx]; - } - } - /* def:fss */ if (virVMXGetConfigBoolean(conf, "isolation.tools.hgfs.disable", &hgfs_disabled, true, true) < 0) { -- GitLab