mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
vz: fix detach disk to use new disk id
Actually using disk PrlVmDev_GetFriendlyName as id on detaching volumes is not a problem. We can only detach hard disks and these can not have empty friendly names. But upcoming update device functionality for cdroms can not use disk source as id at all as update operation typically change this same source value. Thus we will need to use cdrom bus and cdrom target name as cdrom id. So in attempt to use same id scheme for all purpuses lets fix hard disk detach function to use new id. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
This commit is contained in:
parent
bc5f2aab6d
commit
c7ba62009d
102
src/vz/vz_sdk.c
102
src/vz/vz_sdk.c
@ -3335,6 +3335,47 @@ static int prlsdkAddDisk(vzDriverPtr driver,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PRL_HANDLE
|
||||||
|
prlsdkGetDisk(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk, bool isCt)
|
||||||
|
{
|
||||||
|
PRL_RESULT pret;
|
||||||
|
PRL_UINT32 hddCount;
|
||||||
|
size_t i;
|
||||||
|
PRL_HANDLE hdd = PRL_INVALID_HANDLE;
|
||||||
|
int bus;
|
||||||
|
char *dst = NULL;
|
||||||
|
|
||||||
|
pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount);
|
||||||
|
prlsdkCheckRetGoto(pret, error);
|
||||||
|
|
||||||
|
for (i = 0; i < hddCount; ++i) {
|
||||||
|
pret = PrlVmCfg_GetHardDisk(sdkdom, i, &hdd);
|
||||||
|
prlsdkCheckRetGoto(pret, error);
|
||||||
|
|
||||||
|
if (prlsdkGetDiskId(hdd, isCt, &bus, &dst) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (disk->bus == bus && STREQ(disk->dst, dst)) {
|
||||||
|
VIR_FREE(dst);
|
||||||
|
return hdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrlHandle_Free(hdd);
|
||||||
|
hdd = PRL_INVALID_HANDLE;
|
||||||
|
VIR_FREE(dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("No disk with bus '%s' and target '%s'"),
|
||||||
|
virDomainDiskBusTypeToString(disk->bus), disk->dst);
|
||||||
|
return PRL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(dst);
|
||||||
|
PrlHandle_Free(hdd);
|
||||||
|
return PRL_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
prlsdkAttachVolume(vzDriverPtr driver,
|
prlsdkAttachVolume(vzDriverPtr driver,
|
||||||
virDomainObjPtr dom,
|
virDomainObjPtr dom,
|
||||||
@ -3361,70 +3402,35 @@ prlsdkAttachVolume(vzDriverPtr driver,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
prlsdkGetDiskIndex(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
|
|
||||||
{
|
|
||||||
int idx = -1;
|
|
||||||
char *buf = NULL;
|
|
||||||
PRL_RESULT pret;
|
|
||||||
PRL_UINT32 hddCount;
|
|
||||||
PRL_UINT32 i;
|
|
||||||
PRL_HANDLE hdd = PRL_INVALID_HANDLE;
|
|
||||||
|
|
||||||
pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount);
|
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
|
||||||
|
|
||||||
for (i = 0; i < hddCount; ++i) {
|
|
||||||
|
|
||||||
pret = PrlVmCfg_GetHardDisk(sdkdom, i, &hdd);
|
|
||||||
prlsdkCheckRetGoto(pret, cleanup);
|
|
||||||
|
|
||||||
if (!(buf = prlsdkGetStringParamVar(PrlVmDev_GetFriendlyName, hdd)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (STRNEQ(disk->src->path, buf)) {
|
|
||||||
|
|
||||||
PrlHandle_Free(hdd);
|
|
||||||
hdd = PRL_INVALID_HANDLE;
|
|
||||||
VIR_FREE(buf);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_FREE(buf);
|
|
||||||
idx = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
PrlHandle_Free(hdd);
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
|
prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
int ret = -1, idx;
|
int ret = -1;
|
||||||
vzDomObjPtr privdom = dom->privateData;
|
vzDomObjPtr privdom = dom->privateData;
|
||||||
PRL_HANDLE job = PRL_INVALID_HANDLE;
|
PRL_HANDLE job = PRL_INVALID_HANDLE;
|
||||||
|
PRL_HANDLE sdkdisk;
|
||||||
|
PRL_RESULT pret;
|
||||||
|
|
||||||
idx = prlsdkGetDiskIndex(privdom->sdkdom, disk);
|
sdkdisk = prlsdkGetDisk(privdom->sdkdom, disk, IS_CT(dom->def));
|
||||||
if (idx < 0)
|
if (sdkdisk == PRL_INVALID_HANDLE)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
job = PrlVm_BeginEdit(privdom->sdkdom);
|
job = PrlVm_BeginEdit(privdom->sdkdom);
|
||||||
if (PRL_FAILED(waitJob(job)))
|
if (PRL_FAILED(waitJob(job)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = prlsdkDelDisk(privdom->sdkdom, idx);
|
pret = PrlVmDev_Remove(sdkdisk);
|
||||||
if (ret == 0) {
|
prlsdkCheckRetGoto(pret, cleanup);
|
||||||
|
|
||||||
job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
|
job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
|
||||||
if (PRL_FAILED(waitJob(job))) {
|
if (PRL_FAILED(waitJob(job)))
|
||||||
ret = -1;
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
|
||||||
}
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
|
PrlHandle_Free(sdkdisk);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user