virDomainDeviceDriveAddressPtr drive;
PRL_DEVICE_TYPE devType;
PRL_CLUSTERED_DEVICE_SUBTYPE scsiModel;
- char *dst = NULL;
const char *path = disk->src->path ? : "";
if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
prlsdkCheckRetGoto(pret, cleanup);
drive = &disk->info.addr.drive;
- if (drive->controller > 0) {
- /* We have only one controller of each type */
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only one controller."), disk->dst);
- goto cleanup;
- }
-
- if (drive->target > 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only target 0."), disk->dst);
- goto cleanup;
- }
switch (disk->bus) {
case VIR_DOMAIN_DISK_BUS_IDE:
- if (drive->unit > 1) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only units 0-1 for IDE bus."), disk->dst);
- goto cleanup;
- }
sdkbus = PMS_IDE_DEVICE;
idx = 2 * drive->bus + drive->unit;
- dst = virIndexToDiskName(idx, "hd");
break;
case VIR_DOMAIN_DISK_BUS_SCSI:
- if (drive->bus > 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only bus 0 for SCSI bus."), disk->dst);
- goto cleanup;
- }
sdkbus = PMS_SCSI_DEVICE;
idx = drive->unit;
- dst = virIndexToDiskName(idx, "sd");
break;
case VIR_DOMAIN_DISK_BUS_SATA:
- if (drive->bus > 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only bus 0 for SATA bus."), disk->dst);
- goto cleanup;
- }
sdkbus = PMS_SATA_DEVICE;
idx = drive->unit;
- dst = virIndexToDiskName(idx, "sd");
break;
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
goto cleanup;
}
- if (!dst)
- goto cleanup;
-
- if (STRNEQ(dst, disk->dst)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid drive "
- "address of disk %s, vz driver supports "
- "only defaults address to logical device name."), disk->dst);
- goto cleanup;
- }
-
if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
if (vzGetDefaultSCSIModel(driver, &scsiModel) < 0)
goto cleanup;
return 0;
cleanup:
PrlHandle_Free(sdkdisk);
- VIR_FREE(dst);
return ret;
}
return ret;
}
+static int
+vzCheckDiskAddressDriveUnsupportedParams(virDomainDiskDefPtr disk)
+{
+ virDomainDeviceDriveAddressPtr drive = &disk->info.addr.drive;
+ int devIdx, busIdx;
+
+ if (drive->controller > 0) {
+ /* We have only one controller of each type */
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Invalid drive address of disk %s, vz driver "
+ "supports only one controller."), disk->dst);
+ return -1;
+ }
+
+ if (drive->target > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Invalid drive address of disk %s, vz driver "
+ "supports only target 0."), disk->dst);
+ return -1;
+ }
+
+ switch (disk->bus) {
+ case VIR_DOMAIN_DISK_BUS_IDE:
+ if (drive->unit > 1) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Invalid drive address of disk %s, vz driver "
+ "supports only units 0-1 for IDE bus."),
+ disk->dst);
+ return -1;
+ }
+ break;
+ case VIR_DOMAIN_DISK_BUS_SCSI:
+ case VIR_DOMAIN_DISK_BUS_SATA:
+ if (drive->bus > 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Invalid drive address of disk %s, vz driver "
+ "supports only bus 0 for SATA and SCSI bus."),
+ disk->dst);
+ return -1;
+ }
+ break;
+ default:
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Specified disk bus is not supported by vz driver."));
+ return -1;
+ }
+
+ if (virDiskNameToBusDeviceIndex(disk, &busIdx, &devIdx) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("cannot convert disk '%s' to bus/device index"),
+ disk->dst);
+ return -1;
+ }
+
+ if (busIdx != drive->bus || devIdx != drive->unit) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Invalid drive address of disk %s, vz driver "
+ "does not support non default name mappings."),
+ disk->dst);
+ return -1;
+ }
+
+ return 0;
+}
+
static int
vzCheckDiskUnsupportedParams(virDomainDiskDefPtr disk)
{
}
+ if (vzCheckDiskAddressDriveUnsupportedParams(disk) < 0)
+ return -1;
+
return 0;
}