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"));
return ret;
}
-static int prlsdkAddDisk(PRL_HANDLE sdkdom,
+static int prlsdkAddDisk(vzConnPtr privconn,
+ PRL_HANDLE sdkdom,
virDomainDiskDefPtr disk,
bool bootDisk,
bool isCt)
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)
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);
}
int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
+prlsdkAttachVolume(vzConnPtr privconn,
+ virDomainObjPtr dom,
+ virDomainDiskDefPtr disk)
{
int ret = -1;
vzDomObjPtr privdom = dom->privateData;
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))) {
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;
}
int
prlsdkDomainManagedSaveRemove(virDomainObjPtr dom);
int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
+prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk);
int
prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
int
}
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;
+}
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") \