提交 8c9252aa 编写于 作者: M Maxim Nestratov

vz: report disks either as disks or filesystems depending on original xml

Virtuozzo SDK interface doesn't differ filesystems from disks and sees them as disks.
Before, we always mistakenly presented disks based on files as filesystems, which is
not completely correct. Now we are going to show either disks or filesystems depending
on a hint, which uses boot device section of VZ config. Though this information
doesn't change booting order of a CT, it is used by vz libvirt interface as a hint
for libvirt representation of disks. Since now, if we have filesystems in input xml,
then we add them to VZ booting devices list and rely on this information to show
corresponding libvirt xml.
Signed-off-by: NMaxim Nestratov <mnestratov@virtuozzo.com>
上级 1abc8b39
...@@ -50,6 +50,9 @@ static PRL_HANDLE ...@@ -50,6 +50,9 @@ static PRL_HANDLE
prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac); prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac);
static PRL_HANDLE static PRL_HANDLE
prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk); prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk);
static bool
prlsdkInBootList(PRL_HANDLE sdkdom,
PRL_HANDLE sdktargetdev);
/* /*
* Log error description * Log error description
...@@ -758,7 +761,8 @@ prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDef ...@@ -758,7 +761,8 @@ prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDef
pret = PrlVmDev_GetEmulatedType(hdd, &emulatedType); pret = PrlVmDev_GetEmulatedType(hdd, &emulatedType);
prlsdkCheckRetGoto(pret, error); prlsdkCheckRetGoto(pret, error);
if (PDT_USE_REAL_DEVICE != emulatedType && IS_CT(def)) { if (IS_CT(def) &&
prlsdkInBootList(sdkdom, hdd)) {
if (!(fs = virDomainFSDefNew())) if (!(fs = virDomainFSDefNew()))
goto error; goto error;
...@@ -1555,6 +1559,60 @@ virFindDiskBootIndex(virDomainDefPtr def, virDomainDiskDevice type, int index) ...@@ -1555,6 +1559,60 @@ virFindDiskBootIndex(virDomainDefPtr def, virDomainDiskDevice type, int index)
return NULL; return NULL;
} }
static bool
prlsdkInBootList(PRL_HANDLE sdkdom,
PRL_HANDLE sdktargetdev)
{
bool ret = false;
PRL_RESULT pret;
PRL_UINT32 bootNum;
PRL_HANDLE bootDev = PRL_INVALID_HANDLE;
PRL_BOOL inUse;
PRL_DEVICE_TYPE sdkType, targetType;
PRL_UINT32 sdkIndex, targetIndex;
size_t i;
pret = PrlVmDev_GetType(sdktargetdev, &targetType);
prlsdkCheckRetExit(pret, -1);
pret = PrlVmDev_GetIndex(sdktargetdev, &targetIndex);
prlsdkCheckRetExit(pret, -1);
pret = PrlVmCfg_GetBootDevCount(sdkdom, &bootNum);
prlsdkCheckRetExit(pret, -1);
for (i = 0; i < bootNum; ++i) {
pret = PrlVmCfg_GetBootDev(sdkdom, i, &bootDev);
prlsdkCheckRetGoto(pret, cleanup);
pret = PrlBootDev_IsInUse(bootDev, &inUse);
prlsdkCheckRetGoto(pret, cleanup);
if (!inUse) {
PrlHandle_Free(bootDev);
bootDev = PRL_INVALID_HANDLE;
continue;
}
pret = PrlBootDev_GetType(bootDev, &sdkType);
prlsdkCheckRetGoto(pret, cleanup);
pret = PrlBootDev_GetIndex(bootDev, &sdkIndex);
prlsdkCheckRetGoto(pret, cleanup);
PrlHandle_Free(bootDev);
bootDev = PRL_INVALID_HANDLE;
if (sdkIndex == targetIndex && sdkType == targetType) {
ret = true;
break;
}
}
cleanup:
PrlHandle_Free(bootDev);
return ret;
}
static int static int
prlsdkBootOrderCheck(PRL_HANDLE sdkdom, PRL_DEVICE_TYPE sdkType, int sdkIndex, prlsdkBootOrderCheck(PRL_HANDLE sdkdom, PRL_DEVICE_TYPE sdkType, int sdkIndex,
virDomainDefPtr def, int bootIndex) virDomainDefPtr def, int bootIndex)
...@@ -3740,23 +3798,26 @@ prlsdkSetBootOrderCt(PRL_HANDLE sdkdom, virDomainDefPtr def) ...@@ -3740,23 +3798,26 @@ prlsdkSetBootOrderCt(PRL_HANDLE sdkdom, virDomainDefPtr def)
size_t i; size_t i;
PRL_HANDLE hdd = PRL_INVALID_HANDLE; PRL_HANDLE hdd = PRL_INVALID_HANDLE;
PRL_RESULT pret; PRL_RESULT pret;
bool rootfs = false;
int ret = -1; int ret = -1;
/* if we have root mounted we don't need to explicitly set boot order */
for (i = 0; i < def->nfss; i++) { for (i = 0; i < def->nfss; i++) {
pret = prlsdkAddDeviceToBootList(sdkdom, i, PDE_HARD_DISK, i + 1);
prlsdkCheckRetExit(pret, -1);
if (STREQ(def->fss[i]->dst, "/")) if (STREQ(def->fss[i]->dst, "/"))
return 0; rootfs = true;
} }
/* else set first hard disk as boot device */ if (!rootfs) {
pret = prlsdkAddDeviceToBootList(sdkdom, 0, PDE_HARD_DISK, 0); /* if we have root mounted we don't need to explicitly set boot order */
prlsdkCheckRetExit(pret, -1); pret = PrlVmCfg_GetHardDisk(sdkdom, def->nfss, &hdd);
prlsdkCheckRetExit(pret, -1);
pret = PrlVmCfg_GetHardDisk(sdkdom, 0, &hdd);
prlsdkCheckRetExit(pret, -1);
PrlVmDevHd_SetMountPoint(hdd, "/"); PrlVmDevHd_SetMountPoint(hdd, "/");
prlsdkCheckRetGoto(pret, cleanup); prlsdkCheckRetGoto(pret, cleanup);
}
ret = 0; ret = 0;
...@@ -3926,11 +3987,15 @@ prlsdkDoApplyConfig(vzDriverPtr driver, ...@@ -3926,11 +3987,15 @@ prlsdkDoApplyConfig(vzDriverPtr driver,
goto error; goto error;
} }
/* It is important that we add filesystems first and then disks as we rely
* on this information in prlsdkSetBootOrderCt */
for (i = 0; i < def->nfss; i++) { for (i = 0; i < def->nfss; i++) {
if (prlsdkAddFS(sdkdom, def->fss[i]) < 0) if (prlsdkAddFS(sdkdom, def->fss[i]) < 0)
goto error; goto error;
} }
/* filesystems first, disks go after them as we rely on this order in
* prlsdkSetBootOrderCt */
for (i = 0; i < def->ndisks; i++) { for (i = 0; i < def->ndisks; i++) {
if (prlsdkConfigureDisk(driver, sdkdom, def->disks[i], if (prlsdkConfigureDisk(driver, sdkdom, def->disks[i],
true) < 0) true) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册