From: Michal Privoznik <mprivozn@redhat.com> Currently, the VMX driver ignores SCSI controllers without disks plugged in (even though they are present in the .vmx file) and adds some "random" ones after SCSI disks are parsed. Well, those controllers from the file are visible to the guest so add those to the domain definition instead. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/vmx/vmx.c | 51 +++++++++++------------- tests/vmx2xmldata/esx-in-the-wild-16.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-1.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-2.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-3.xml | 1 + tests/vmx2xmldata/gsx-in-the-wild-4.xml | 1 + 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 72ec1454aa..c438f2720c 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -584,8 +584,11 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, ); static int virVMXParseVNC(virConf *conf, virDomainGraphicsDef **def); -static int virVMXParseSCSIController(virConf *conf, int controller, bool *present, - int *virtualDev); +static int +virVMXParseSCSIController(virDomainDef *def, + virConf *conf, + int controllerIdx, + bool *present); static int virVMXParseSATAController(virConf *conf, int controller, bool *present); static int virVMXParseNVMEController(virConf *conf, int controller, bool *present); static int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOption *xmlopt, @@ -1408,7 +1411,6 @@ virVMXParseConfig(virVMXContext *ctx, int bus; int port; bool present; - int scsi_virtualDev[4] = { -1, -1, -1, -1 }; int unit; bool hgfs_disabled = true; long long sharedFolder_maxNum = 0; @@ -1739,8 +1741,7 @@ virVMXParseConfig(virVMXContext *ctx, /* def:disks (scsi) */ for (controller = 0; controller < 4; ++controller) { - if (virVMXParseSCSIController(conf, controller, &present, - &scsi_virtualDev[controller]) < 0) { + if (virVMXParseSCSIController(def, conf, controller, &present) < 0) { goto cleanup; } @@ -1781,11 +1782,6 @@ virVMXParseConfig(virVMXContext *ctx, /* add all the SCSI controllers we've seen, up until the last one that is * currently used by a disk */ if (def->ndisks != 0) { - virDomainDeviceInfo *info = &def->disks[def->ndisks - 1]->info; - for (controller = 0; controller <= info->addr.drive.controller; controller++) { - virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, - controller, scsi_virtualDev[controller]); - } saved_ndisks = def->ndisks; } @@ -2142,30 +2138,28 @@ virVMXParseVNC(virConf *conf, virDomainGraphicsDef **def) static int -virVMXParseSCSIController(virConf *conf, int controller, bool *present, - int *virtualDev) +virVMXParseSCSIController(virDomainDef *def, + virConf *conf, + int controllerIdx, + bool *present) { int result = -1; char present_name[32]; char virtualDev_name[32]; char *virtualDev_string = NULL; char *tmp; + int virtualDev = -1; - if (virtualDev == NULL || *virtualDev != -1) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - return -1; - } - - if (controller < 0 || controller > 3) { + if (controllerIdx < 0 || controllerIdx > 3) { virReportError(VIR_ERR_INTERNAL_ERROR, _("SCSI controller index %1$d out of [0..3] range"), - controller); + controllerIdx); return -1; } - g_snprintf(present_name, sizeof(present_name), "scsi%d.present", controller); + g_snprintf(present_name, sizeof(present_name), "scsi%d.present", controllerIdx); g_snprintf(virtualDev_name, sizeof(virtualDev_name), "scsi%d.virtualDev", - controller); + controllerIdx); if (virVMXGetConfigBoolean(conf, present_name, present, false, true) < 0) goto cleanup; @@ -2186,13 +2180,13 @@ virVMXParseSCSIController(virConf *conf, int controller, bool *present, for (; *tmp != '\0'; ++tmp) *tmp = g_ascii_tolower(*tmp); - *virtualDev = virVMXControllerModelSCSITypeFromString(virtualDev_string); + virtualDev = virVMXControllerModelSCSITypeFromString(virtualDev_string); - if (*virtualDev == -1 || - (*virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC && - *virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC && - *virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068 && - *virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI)) { + if (virtualDev == -1 || + (virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC && + virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC && + virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068 && + virtualDev != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%1$s' to be 'buslogic' or 'lsilogic' or 'lsisas1068' or 'pvscsi' but found '%2$s'"), virtualDev_name, virtualDev_string); @@ -2200,6 +2194,9 @@ virVMXParseSCSIController(virConf *conf, int controller, bool *present, } } + virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, + controllerIdx, virtualDev); + result = 0; cleanup: diff --git a/tests/vmx2xmldata/esx-in-the-wild-16.xml b/tests/vmx2xmldata/esx-in-the-wild-16.xml index ab8497ba2d..77c4a10c1c 100644 --- a/tests/vmx2xmldata/esx-in-the-wild-16.xml +++ b/tests/vmx2xmldata/esx-in-the-wild-16.xml @@ -26,6 +26,7 @@ <target dev='nvme0n1' bus='nvme'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='scsi' index='0' model='vmpvscsi'/> <controller type='nvme' index='0'/> <interface type='bridge'> <mac address='00:50:56:a0:a6:7e' type='generated'/> diff --git a/tests/vmx2xmldata/gsx-in-the-wild-1.xml b/tests/vmx2xmldata/gsx-in-the-wild-1.xml index 4618e574a9..c314d1e4f8 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-1.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-1.xml @@ -19,6 +19,7 @@ <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='scsi' index='0' model='lsilogic'/> <controller type='ide' index='0'/> <interface type='bridge'> <mac address='00:0c:29:d6:2b:d3' type='generated'/> diff --git a/tests/vmx2xmldata/gsx-in-the-wild-2.xml b/tests/vmx2xmldata/gsx-in-the-wild-2.xml index 8841bc5fdd..fbcbf7ed06 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-2.xml @@ -19,6 +19,7 @@ <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='scsi' index='0' model='lsilogic'/> <controller type='ide' index='0'/> <interface type='bridge'> <mac address='00:0c:29:d6:cb:a4' type='generated'/> diff --git a/tests/vmx2xmldata/gsx-in-the-wild-3.xml b/tests/vmx2xmldata/gsx-in-the-wild-3.xml index 181036a126..834731f7df 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-3.xml @@ -19,6 +19,7 @@ <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='scsi' index='0' model='lsilogic'/> <controller type='ide' index='0'/> <interface type='bridge'> <mac address='00:0c:29:c4:be:5a' type='generated'/> diff --git a/tests/vmx2xmldata/gsx-in-the-wild-4.xml b/tests/vmx2xmldata/gsx-in-the-wild-4.xml index f66afe35bd..f91d389aa8 100644 --- a/tests/vmx2xmldata/gsx-in-the-wild-4.xml +++ b/tests/vmx2xmldata/gsx-in-the-wild-4.xml @@ -19,6 +19,7 @@ <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> + <controller type='scsi' index='0' model='lsilogic'/> <controller type='ide' index='0'/> <interface type='bridge'> <mac address='00:0c:29:c5:e3:5d' type='generated'/> -- 2.54.0