diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 74e1f5dc334d3d8f454170370004316d3b8498ef..b02e59fb8809b03109d16f28eb29ec9d381c7348 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1080,7 +1080,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret = prlsdkAttachVolume(privdom, dev->data.disk); + ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk); if (ret) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("disk attach failed")); diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index eac6fb79fb4f688919eb4baa0ecdd01f41e26537..14738660d21f61fd9d2fcb9c9b58fba8a2c1aa80 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -2989,7 +2989,8 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx) return ret; } -static int prlsdkAddDisk(PRL_HANDLE sdkdom, +static int prlsdkAddDisk(vzConnPtr privconn, + PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool bootDisk, bool isCt) @@ -3003,6 +3004,7 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, virDomainDeviceDriveAddressPtr drive; PRL_UINT32 devIndex; PRL_DEVICE_TYPE devType; + PRL_CLUSTERED_DEVICE_SUBTYPE scsiModel; char *dst = NULL; if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) @@ -3100,6 +3102,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, goto cleanup; } + if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + if (vzGetDefaultSCSIModel(privconn, &scsiModel) < 0) + goto cleanup; + pret = PrlVmDev_SetSubType(sdkdisk, scsiModel); + prlsdkCheckRetGoto(pret, cleanup); + } + pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus); prlsdkCheckRetGoto(pret, cleanup); @@ -3147,7 +3156,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom, } int -prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) +prlsdkAttachVolume(vzConnPtr privconn, + virDomainObjPtr dom, + virDomainDiskDefPtr disk) { int ret = -1; vzDomObjPtr privdom = dom->privateData; @@ -3157,7 +3168,11 @@ prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk) if (PRL_FAILED(waitJob(job))) goto cleanup; - ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def)); + ret = prlsdkAddDisk(privconn, + privdom->sdkdom, + disk, + false, + IS_CT(dom->def)); if (ret == 0) { job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE); if (PRL_FAILED(waitJob(job))) { @@ -3388,7 +3403,11 @@ prlsdkDoApplyConfig(virConnectPtr conn, needBoot = false; bootDisk = true; } - if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk, IS_CT(def)) < 0) + if (prlsdkAddDisk(conn->privateData, + sdkdom, + def->disks[i], + bootDisk, + IS_CT(def)) < 0) goto error; } diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index c2d9cb46971b9dc02bca8094f7e1a8d7bbd36e85..8a38797272a76482f5db6c2e6c08f693cb9ec5ba 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -63,7 +63,7 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int fla int prlsdkDomainManagedSaveRemove(virDomainObjPtr dom); int -prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); +prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk); int prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk); int diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index cca58ec764bd45b07c300ecae42d39a309ec2819..fed48a5b406a1228c2cfbd24931fe3ae3bd63eae 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -475,3 +475,23 @@ vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps) } return 0; } + +int vzGetDefaultSCSIModel(vzConnPtr privconn, + PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel) +{ + switch (privconn->vzCaps.scsiControllerModel) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: + *scsiModel = PCD_VIRTIO_SCSI; + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: + *scsiModel = PCD_BUSLOGIC; + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown SCSI controller model %s"), + virDomainControllerModelSCSITypeToString( + privconn->vzCaps.scsiControllerModel)); + return -1; + } + return 0; +} diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 88e74fc58267cf2289d36acbe7842ce53e76c172..f3738502cc6af065a757a57d4417bb28bbcdf314 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -118,6 +118,9 @@ vzCheckUnsupportedDisks(virDomainDefPtr def, int vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps); +int +vzGetDefaultSCSIModel(vzConnPtr privconn, + PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel); # define PARALLELS_BLOCK_STATS_FOREACH(OP) \ OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests") \