79c4324644
Change-Id: I2d302dda68298877c65c99147f5bf22186a59aac
73 lines
2.8 KiB
Diff
73 lines
2.8 KiB
Diff
From 19d06bcb3c64662d5c131a035146d2caa8c5a437 Mon Sep 17 00:00:00 2001
|
|
From: Michal Privoznik <mprivozn@redhat.com>
|
|
Date: Tue, 14 Apr 2020 11:18:02 +0200
|
|
Subject: [PATCH 4/8] qemu: Revoke access to mirror on failed blockcopy
|
|
|
|
When preparing to do a blockcopy, the mirror image is modified so
|
|
that QEMU can access it. For instance, the mirror has seclabels
|
|
set, if it is a NVMe disk it is detached from the host and so on.
|
|
And usually, the restore is done upon successful finish of the
|
|
blockcopy operation. But, if something fails then we need to
|
|
explicitly revoke the access to the mirror image (and thus
|
|
reattach NVMe disk back to the host).
|
|
|
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1822538
|
|
|
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
Reviewed-by: Pavel Mores <pmores@redhat.com>
|
|
(cherry-picked from commit 67e19fc9)
|
|
Signed-off-by: AlexChen <alex.chen@huawei.com>
|
|
---
|
|
src/qemu/qemu_driver.c | 21 +++++++++++++--------
|
|
1 file changed, 13 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
index 8bc5368b2f..7162875492 100644
|
|
--- a/src/qemu/qemu_driver.c
|
|
+++ b/src/qemu/qemu_driver.c
|
|
@@ -17972,6 +17972,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|
virDomainDiskDefPtr disk = NULL;
|
|
int ret = -1;
|
|
bool need_unlink = false;
|
|
+ bool need_revoke = false;
|
|
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
|
const char *format = NULL;
|
|
bool mirror_reuse = !!(flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT);
|
|
@@ -18146,6 +18147,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|
|
|
if (qemuDomainStorageSourceChainAccessAllow(driver, vm, mirror) < 0)
|
|
goto endjob;
|
|
+ need_revoke = true;
|
|
|
|
if (blockdev) {
|
|
if (mirror_reuse) {
|
|
@@ -18254,14 +18256,17 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|
|
|
endjob:
|
|
if (ret < 0 &&
|
|
- virDomainObjIsActive(vm) &&
|
|
- (data || crdata)) {
|
|
- qemuDomainObjEnterMonitor(driver, vm);
|
|
- if (data)
|
|
- qemuBlockStorageSourceChainDetach(priv->mon, data);
|
|
- if (crdata)
|
|
- qemuBlockStorageSourceAttachRollback(priv->mon, crdata->srcdata[0]);
|
|
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
+ virDomainObjIsActive(vm)) {
|
|
+ if (data || crdata) {
|
|
+ qemuDomainObjEnterMonitor(driver, vm);
|
|
+ if (data)
|
|
+ qemuBlockStorageSourceChainDetach(priv->mon, data);
|
|
+ if (crdata)
|
|
+ qemuBlockStorageSourceAttachRollback(priv->mon, crdata->srcdata[0]);
|
|
+ ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
+ }
|
|
+ if (need_revoke)
|
|
+ qemuDomainStorageSourceChainAccessRevoke(driver, vm, mirror);
|
|
}
|
|
if (need_unlink && virStorageFileUnlink(mirror) < 0)
|
|
VIR_WARN("%s", _("unable to remove just-created copy target"));
|
|
--
|
|
2.23.0
|
|
|