Co-authored-by: Sri Ramanujam <sramanujam@xxxxxxxxx> Signed-off-by: Matt Coleman <matt@xxxxxxxxx> --- src/hyperv/hyperv_driver.c | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index 559b60d3df..1ad52e598a 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -327,6 +327,53 @@ hypervGetDeviceParentRasdFromDeviceId(const char *parentDeviceId, } +static int +hypervDomainCreateSCSIController(virDomainPtr domain) +{ + g_autoptr(GHashTable) scsiResource = NULL; + g_autofree char *resourceType = NULL; + + resourceType = g_strdup_printf("%d", MSVM_RASD_RESOURCETYPE_PARALLEL_SCSI_HBA); + + VIR_DEBUG("Attaching SCSI Controller"); + + /* prepare embedded param */ + scsiResource = hypervCreateEmbeddedParam(Msvm_ResourceAllocationSettingData_WmiInfo); + if (!scsiResource) + return -1; + + if (hypervSetEmbeddedProperty(scsiResource, "ResourceType", resourceType) < 0) + return -1; + + if (hypervSetEmbeddedProperty(scsiResource, "ResourceSubType", + "Microsoft:Hyper-V:Synthetic SCSI Controller") < 0) + return -1; + + /* perform the settings change */ + if (hypervMsvmVSMSAddResourceSettings(domain, &scsiResource, + Msvm_ResourceAllocationSettingData_WmiInfo, NULL) < 0) + return -1; + + return 0; +} + + +static int +hypervDomainAttachStorage(virDomainPtr domain, virDomainDefPtr def) +{ + size_t i = 0; + + for (i = 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->type != VIR_DOMAIN_CONTROLLER_TYPE_SCSI) + continue; + + if (hypervDomainCreateSCSIController(domain) < 0) + return -1; + } + + return 0; +} + /* * Functions for deserializing device entries @@ -2003,6 +2050,10 @@ hypervDomainDefineXML(virConnectPtr conn, const char *xml) if (def->mem.cur_balloon > 0 && hypervDomainSetMemory(domain, def->mem.cur_balloon) < 0) goto error; + /* attach all storage */ + if (hypervDomainAttachStorage(domain, def) < 0) + goto error; + return domain; error: -- 2.27.0