/* Names used before -drive supported the id= option */ static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk) { int busid, devid; int ret; char *dev_name; if (virDiskNameToBusDeviceIndex(disk, &busid, &devid) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot convert disk '%s' to bus/device index"), disk->dst); return -1; } switch (disk->bus) { case VIR_DOMAIN_DISK_BUS_IDE: if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) ret = virAsprintf(&dev_name, "ide%d-hd%d", busid, devid); else ret = virAsprintf(&dev_name, "ide%d-cd%d", busid, devid); break; case VIR_DOMAIN_DISK_BUS_SCSI: if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) ret = virAsprintf(&dev_name, "scsi%d-hd%d", busid, devid); else ret = virAsprintf(&dev_name, "scsi%d-cd%d", busid, devid); break; case VIR_DOMAIN_DISK_BUS_FDC: ret = virAsprintf(&dev_name, "floppy%d", devid); break; case VIR_DOMAIN_DISK_BUS_VIRTIO: ret = virAsprintf(&dev_name, "virtio%d", devid); break; case VIR_DOMAIN_DISK_BUS_XEN: ret = virAsprintf(&dev_name, "xenblk%d", devid); break; case VIR_DOMAIN_DISK_BUS_SD: ret = virAsprintf(&dev_name, "sd%d", devid); break; case VIR_DOMAIN_DISK_BUS_USB: ret = virAsprintf(&dev_name, "usb%d", devid); break; default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported disk name mapping for bus '%s'"), virDomainDiskBusTypeToString(disk->bus)); return -1; } if (ret == -1) return -1; disk->info.alias = dev_name; return 0; }
int vzCheckUnsupportedDisks(virDomainDefPtr def, vzCapabilitiesPtr vzCaps) { size_t i, j; virDomainDiskDefPtr disk; virStorageFileFormat diskFormat; for (i = 0; i < def->ndisks; i++) { disk = def->disks[i]; if (vzCheckDiskUnsupportedParams(disk) < 0) return -1; if (disk->src->type == VIR_STORAGE_TYPE_FILE) { if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { if (IS_CT(def)) diskFormat = vzCaps->ctDiskFormat; else diskFormat = vzCaps->vmDiskFormat; } else { diskFormat = VIR_STORAGE_FILE_RAW; } } else { diskFormat = VIR_STORAGE_FILE_RAW; } if (virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE && virDomainDiskGetFormat(disk) != diskFormat) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported format of disk %s"), disk->src->path); return -1; } for (j = 0; vzCaps->diskBuses[j] != VIR_DOMAIN_DISK_BUS_LAST; j++) { if (disk->bus == vzCaps->diskBuses[j]) break; } if (vzCaps->diskBuses[j] == VIR_DOMAIN_DISK_BUS_LAST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported disk bus type %s"), virDomainDiskBusTypeToString(disk->bus)); return -1; } } return 0; }
/* Our custom -drive naming scheme used with id= */ int qemuAssignDeviceDiskAlias(virDomainDefPtr def, virDomainDiskDefPtr disk, virQEMUCapsPtr qemuCaps) { const char *prefix = virDomainDiskBusTypeToString(disk->bus); int controllerModel = -1; if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) { controllerModel = virDomainDeviceFindControllerModel(def, &disk->info, VIR_DOMAIN_CONTROLLER_TYPE_SCSI); if ((qemuDomainSetSCSIControllerModel(def, qemuCaps, &controllerModel)) < 0) return -1; } if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI || controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) { if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix, disk->info.addr.drive.controller, disk->info.addr.drive.bus, disk->info.addr.drive.unit) < 0) return -1; } else { if (virAsprintf(&disk->info.alias, "%s%d-%d-%d-%d", prefix, disk->info.addr.drive.controller, disk->info.addr.drive.bus, disk->info.addr.drive.target, disk->info.addr.drive.unit) < 0) return -1; } } else { int idx = virDiskNameToIndex(disk->dst); if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0) return -1; } return 0; }