[libvirt] [PATCH 0/2] qemu: block: Fix two bugs related to usage of blockdev (blockdev-add saga)

Peter Krempa (2): qemu: blockjob: Transfer 'readonly' state of images after active layer block commit qemu: snapshot: Fix inactive external snapshots when backing chain is present src/qemu/qemu_blockjob.c | 2 ++ src/qemu/qemu_driver.c | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) -- 2.23.0

When commiting a different image becomes the disk source. Since we store the readonly flag per-image we must update it to the same state the original image had. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_blockjob.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 2dddb1e408..5c294f8024 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -1106,6 +1106,7 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, cfgbase = cfgbaseparent->backingStore; cfgbaseparent->backingStore = NULL; cfgdisk->src = cfgbase; + cfgdisk->src->readonly = cfgtop->readonly; virObjectUnref(cfgtop); } @@ -1115,6 +1116,7 @@ qemuBlockJobProcessEventCompletedActiveCommit(virQEMUDriverPtr driver, baseparent->backingStore = NULL; job->disk->src = job->data.commit.base; + job->disk->src->readonly = job->data.commit.top->readonly; qemuBlockJobEventProcessConcludedRemoveChain(driver, vm, asyncJob, job->data.commit.top); virObjectUnref(job->data.commit.top); -- 2.23.0

The inactive external snapshot code replaced the file name in the virStorageSource but did not touch the backing files. This meant that after an inactive snapshot the backing chain recorded in the inactive XML (which is used with -blockdev) would be incorrect. Fix it by adding a new layer if there is an existing chain and replacing the virStorageSource struct fully when there is no chain. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c969a3d463..c1b404adfa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14613,19 +14613,32 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver, /* update disk definitions */ for (i = 0; i < snapdef->ndisks; i++) { + g_autoptr(virStorageSource) newsrc = NULL; + snapdisk = &(snapdef->disks[i]); defdisk = vm->def->disks[snapdisk->idx]; - if (snapdisk->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) { - VIR_FREE(defdisk->src->path); - defdisk->src->path = g_strdup(snapdisk->src->path); - defdisk->src->format = snapdisk->src->format; + if (snapdisk->snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) + continue; - if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->def) < 0) - goto cleanup; + if (!(newsrc = virStorageSourceCopy(snapdisk->src, false))) + goto cleanup; + + if (virStorageSourceInitChainElement(newsrc, defdisk->src, false) < 0) + goto cleanup; + + if (virStorageSourceHasBacking(defdisk->src)) { + newsrc->backingStore = g_steal_pointer(&defdisk->src); + } else { + virObjectUnref(defdisk->src); } + + defdisk->src = g_steal_pointer(&newsrc); } + if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->def) < 0) + goto cleanup; + ret = 0; cleanup: -- 2.23.0

On Wed, Nov 13, 2019 at 03:22:10PM +0100, Peter Krempa wrote:
Peter Krempa (2): qemu: blockjob: Transfer 'readonly' state of images after active layer block commit qemu: snapshot: Fix inactive external snapshots when backing chain is present
src/qemu/qemu_blockjob.c | 2 ++ src/qemu/qemu_driver.c | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa