From b733739416390d36da37e73bf2e5187b90031608 Mon Sep 17 00:00:00 2001 From: Maxim Nestratov Date: Tue, 22 Dec 2015 18:29:38 +0300 Subject: [PATCH] vz: delete domains when undefine is called Currently vz driver unregisters domains when undefine is called, which is wrong because it contradicts with expected behavior. All vz domains are persistent, which means that when one is defined a new bundle directory containing meta data is created. Undefining domains in a way we do now leaves those directories undeleted, which prevents subsequent define call for the same domain xml. I.e. the following sequence define->undefine->define doesn't work now. The patch fixes the problem by calling PrlVm_Delete instead of PrlVm_Unreg detaching all disks prior actually doing this to prevent images deletion. Signed-off-by: Maxim Nestratov --- src/vz/vz_sdk.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 2b031c96bd..12c8be9be3 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3718,6 +3718,46 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def) return ret; } +/** + * prlsdkDetachDomainHardDisks: + * + * @sdkdom: domain handle + * + * Returns 0 if hard disks were successfully detached or not detected. + */ +static int +prlsdkDetachDomainHardDisks(PRL_HANDLE sdkdom) +{ + int ret = -1; + PRL_RESULT pret; + PRL_UINT32 hddCount; + PRL_UINT32 i; + PRL_HANDLE job; + + job = PrlVm_BeginEdit(sdkdom); + if (PRL_FAILED(waitJob(job))) + goto cleanup; + + pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount); + prlsdkCheckRetGoto(pret, cleanup); + + for (i = 0; i < hddCount; ++i) { + ret = prlsdkDelDisk(sdkdom, i); + if (ret) + goto cleanup; + } + + job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE); + if (PRL_FAILED(waitJob(job))) + ret = -1; + + cleanup: + + return ret; +} + + + int prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom) { @@ -3728,7 +3768,10 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom) for (i = 0; i < dom->def->nnets; i++) prlsdkCleanupBridgedNet(privconn, dom->def->nets[i]); - job = PrlVm_Unreg(privdom->sdkdom); + if (prlsdkDetachDomainHardDisks(privdom->sdkdom)) + return -1; + + job = PrlVm_Delete(privdom->sdkdom, PRL_INVALID_HANDLE); if (PRL_FAILED(waitJob(job))) return -1; -- 2.39.5