Our intention is to use disk bus and disk target name pair
as disk id instead of name returned by PrlVmDev_GetFriendlyName.
We already have the code that extracts this pair from vzsdk
data. Let's factor it out into a function.
---
src/vz/vz_sdk.c | 89 ++++++++++++++++++++++++++++++---------------------------
1 file changed, 47 insertions(+), 42 deletions(-)
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index c006517..423b20b 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -466,6 +466,45 @@ prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
}
static int
+prlsdkGetDiskId(PRL_HANDLE disk, bool isCt, int *bus, char **dst)
+{
+ PRL_RESULT pret;
+ PRL_UINT32 pos, ifType;
+
+ pret = PrlVmDev_GetStackIndex(disk, &pos);
+ prlsdkCheckRetExit(pret, -1);
+
+ /* Let physical devices added to CT look like SATA disks */
+ if (isCt) {
+ ifType = PMS_SATA_DEVICE;
+ } else {
+ pret = PrlVmDev_GetIfaceType(disk, &ifType);
+ prlsdkCheckRetExit(pret, -1);
+ }
+
+ switch (ifType) {
+ case PMS_IDE_DEVICE:
+ *bus = VIR_DOMAIN_DISK_BUS_IDE;
+ *dst = virIndexToDiskName(pos, "hd");
+ break;
+ case PMS_SCSI_DEVICE:
+ *bus = VIR_DOMAIN_DISK_BUS_SCSI;
+ *dst = virIndexToDiskName(pos, "sd");
+ break;
+ case PMS_SATA_DEVICE:
+ *bus = VIR_DOMAIN_DISK_BUS_SATA;
+ *dst = virIndexToDiskName(pos, "sd");
+ break;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown disk bus: %X"), ifType);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
prlsdkGetDiskInfo(vzConnPtr privconn,
PRL_HANDLE prldisk,
virDomainDiskDefPtr disk,
@@ -476,9 +515,8 @@ prlsdkGetDiskInfo(vzConnPtr privconn,
PRL_UINT32 buflen = 0;
PRL_RESULT pret;
PRL_UINT32 emulatedType;
- PRL_UINT32 ifType;
- PRL_UINT32 pos;
virDomainDeviceDriveAddressPtr address;
+ int busIdx, devIdx;
int ret = -1;
pret = PrlVmDev_GetEmulatedType(prldisk, &emulatedType);
@@ -517,50 +555,17 @@ prlsdkGetDiskInfo(vzConnPtr privconn,
if (virDomainDiskSetSource(disk, buf) < 0)
goto cleanup;
- /* Let physical devices added to CT look like SATA disks */
- if (isCt) {
- ifType = PMS_SATA_DEVICE;
- } else {
- pret = PrlVmDev_GetIfaceType(prldisk, &ifType);
- prlsdkCheckRetGoto(pret, cleanup);
- }
-
- pret = PrlVmDev_GetStackIndex(prldisk, &pos);
- prlsdkCheckRetGoto(pret, cleanup);
-
- address = &disk->info.addr.drive;
- switch (ifType) {
- case PMS_IDE_DEVICE:
- disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
- disk->dst = virIndexToDiskName(pos, "hd");
- address->bus = pos / 2;
- address->target = 0;
- address->unit = pos % 2;
- break;
- case PMS_SCSI_DEVICE:
- disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
- disk->dst = virIndexToDiskName(pos, "sd");
- address->bus = 0;
- address->target = 0;
- address->unit = pos;
- break;
- case PMS_SATA_DEVICE:
- disk->bus = VIR_DOMAIN_DISK_BUS_SATA;
- disk->dst = virIndexToDiskName(pos, "sd");
- address->bus = 0;
- address->target = 0;
- address->unit = pos;
- break;
- default:
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Unknown disk bus: %X"), ifType);
+ if (prlsdkGetDiskId(prldisk, isCt, &disk->bus, &disk->dst) < 0)
goto cleanup;
- break;
- }
- if (!disk->dst)
+ if (virDiskNameToBusDeviceIndex(disk, &busIdx, &devIdx) < 0)
goto cleanup;
+ address = &disk->info.addr.drive;
+ address->bus = busIdx;
+ address->target = 0;
+ address->unit = devIdx;
+
disk->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
ret = 0;
--
1.8.3.1