From abab5130f88e45394cf96764c54e62e4ad5bcdbd Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 16 Oct 2023 16:20:27 +0200 Subject: [PATCH] qemu: Use 'format' nodename accessors for block dirty bitmap operations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In most cases the bitmap operations are relevant only on qcow2 images thus the 'format' layer will be present. Although in certain specific cases temporary bitmaps can be created on top of other images as well, thus we use the 'effective' bitmap name in all cases for bitmap operations. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_block.c | 27 ++++++++++++++------------- src/qemu/qemu_blockjob.c | 4 ++-- src/qemu/qemu_checkpoint.c | 9 +++++---- src/qemu/qemu_driver.c | 7 ++++--- src/qemu/qemu_snapshot.c | 6 ++++-- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 4c1a711dd3..edc8edcb70 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -2807,7 +2807,8 @@ qemuBlockNamedNodeDataGetBitmapByName(GHashTable *blockNamedNodeData, qemuBlockNamedNodeData *nodedata; size_t i; - if (!(nodedata = virHashLookup(blockNamedNodeData, src->nodeformat))) + if (!(nodedata = virHashLookup(blockNamedNodeData, + qemuBlockStorageSourceGetEffectiveNodename(src)))) return NULL; for (i = 0; i < nodedata->nbitmaps; i++) { @@ -2863,7 +2864,7 @@ qemuBlockGetBitmapMergeActionsGetBitmaps(virStorageSource *topsrc, /* for now it doesn't make sense to consider bitmaps which are not present * in @topsrc as we can't recreate a bitmap for a layer if it's missing */ - if (!(entry = virHashLookup(blockNamedNodeData, topsrc->nodeformat))) + if (!(entry = virHashLookup(blockNamedNodeData, qemuBlockStorageSourceGetEffectiveNodename(topsrc)))) return NULL; for (i = 0; i < entry->nbitmaps; i++) { @@ -2972,7 +2973,7 @@ qemuBlockGetBitmapMergeActions(virStorageSource *topsrc, granularity = bitmap->granularity; if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(merge, - n->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(n), bitmap->name) < 0) return -1; } @@ -2982,7 +2983,7 @@ qemuBlockGetBitmapMergeActions(virStorageSource *topsrc, target, curbitmap))) { if (qemuMonitorTransactionBitmapAdd(act, - target->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(target), mergebitmapname, mergebitmappersistent, mergebitmapdisabled, @@ -2992,18 +2993,18 @@ qemuBlockGetBitmapMergeActions(virStorageSource *topsrc, if (writebitmapsrc && qemuMonitorTransactionBitmapMergeSourceAddBitmap(merge, - writebitmapsrc->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(writebitmapsrc), "libvirt-tmp-activewrite") < 0) return -1; - if (qemuMonitorTransactionBitmapMerge(act, target->nodeformat, + if (qemuMonitorTransactionBitmapMerge(act, qemuBlockStorageSourceGetEffectiveNodename(target), mergebitmapname, &merge) < 0) return -1; } done: if (writebitmapsrc && - qemuMonitorTransactionBitmapRemove(act, writebitmapsrc->nodeformat, + qemuMonitorTransactionBitmapRemove(act, qemuBlockStorageSourceGetEffectiveNodename(writebitmapsrc), "libvirt-tmp-activewrite") < 0) return -1; @@ -3578,8 +3579,8 @@ qemuBlockCommit(virDomainObj *vm, rc = qemuMonitorBlockCommit(priv->mon, qemuDomainDiskGetTopNodename(disk), job->name, - topSource->nodeformat, - baseSource->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(topSource), + qemuBlockStorageSourceGetEffectiveNodename(baseSource), backingPath, bandwidth, autofinalize); @@ -3663,7 +3664,7 @@ qemuBlockPivot(virDomainObj *vm, bitmapactions = virJSONValueNewArray(); if (qemuMonitorTransactionBitmapAdd(bitmapactions, - disk->mirror->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(disk->mirror), "libvirt-tmp-activewrite", false, false, @@ -3684,8 +3685,8 @@ qemuBlockPivot(virDomainObj *vm, reopenactions = virJSONValueNewArray(); if (qemuMonitorTransactionSnapshotBlockdev(reopenactions, - disk->mirror->backingStore->nodeformat, - disk->mirror->nodeformat)) + qemuBlockStorageSourceGetEffectiveNodename(disk->mirror->backingStore), + qemuBlockStorageSourceGetFormatNodename(disk->mirror))) return -1; } @@ -3696,7 +3697,7 @@ qemuBlockPivot(virDomainObj *vm, bitmapactions = virJSONValueNewArray(); if (qemuMonitorTransactionBitmapAdd(bitmapactions, - job->data.commit.base->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(job->data.commit.base), "libvirt-tmp-activewrite", false, false, diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index cb9948ae2a..0913a224e3 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -1301,7 +1301,7 @@ qemuBlockJobProcessEventFailedActiveCommit(virQEMUDriver *driver, return; qemuMonitorBitmapRemove(priv->mon, - disk->mirror->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(disk->mirror), "libvirt-tmp-activewrite"); qemuDomainObjExitMonitor(vm); @@ -1388,7 +1388,7 @@ qemuBlockJobProcessEventConcludedBackup(virQEMUDriver *driver, if (job->data.backup.bitmap) qemuMonitorBitmapRemove(qemuDomainGetMonitor(vm), - job->disk->src->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(job->disk->src), job->data.backup.bitmap); qemuDomainObjExitMonitor(vm); diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c index 8449ed176a..ca58da8fcb 100644 --- a/src/qemu/qemu_checkpoint.c +++ b/src/qemu/qemu_checkpoint.c @@ -154,7 +154,7 @@ qemuCheckpointDiscardDiskBitmaps(virStorageSource *src, found = true; if (qemuMonitorTransactionBitmapRemove(actions, - n->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(n), bitmapdata->name) < 0) return -1; @@ -395,7 +395,8 @@ qemuCheckpointAddActions(virDomainObj *vm, chkdisk->type != VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) continue; - if (qemuMonitorTransactionBitmapAdd(actions, domdisk->src->nodeformat, + if (qemuMonitorTransactionBitmapAdd(actions, + qemuBlockStorageSourceGetEffectiveNodename(domdisk->src), chkdisk->bitmap, true, false, 0) < 0) return -1; } @@ -704,7 +705,7 @@ qemuCheckpointGetXMLDescUpdateSize(virDomainObj *vm, recoveractions = virJSONValueNewArray(); if (qemuMonitorTransactionBitmapRemove(recoveractions, - domdisk->src->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(domdisk->src), "libvirt-tmp-size-xml") < 0) goto endjob; } @@ -718,7 +719,7 @@ qemuCheckpointGetXMLDescUpdateSize(virDomainObj *vm, goto endjob; if (qemuMonitorTransactionBitmapRemove(cleanupactions, - domdisk->src->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(domdisk->src), "libvirt-tmp-size-xml") < 0) goto endjob; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2d1d0bb3e2..b286d94ca1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13634,7 +13634,7 @@ qemuDomainBlockPullCommon(virDomainObj *vm, goto endjob; if (baseSource) { - nodebase = baseSource->nodeformat; + nodebase = qemuBlockStorageSourceGetEffectiveNodename(baseSource); if (!backingPath && !(backingPath = qemuBlockGetBackingStoreString(baseSource, false))) goto endjob; @@ -13642,7 +13642,7 @@ qemuDomainBlockPullCommon(virDomainObj *vm, qemuDomainObjEnterMonitor(vm); ret = qemuMonitorBlockStream(priv->mon, - disk->src->nodeformat, + qemuBlockStorageSourceGetEffectiveNodename(disk->src), job->name, nodebase, backingPath, @@ -14327,7 +14327,8 @@ qemuDomainBlockCopyCommon(virDomainObj *vm, ret = qemuMonitorBlockdevMirror(priv->mon, job->name, true, qemuDomainDiskGetTopNodename(disk), - mirror->nodeformat, bandwidth, + qemuBlockStorageSourceGetEffectiveNodename(mirror), + bandwidth, granularity, buf_size, mirror_shallow, syncWrites); diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index e52d264826..1962ba4027 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -959,7 +959,8 @@ qemuSnapshotDiskBitmapsPropagate(qemuSnapshotDiskData *dd, qemuBlockNamedNodeData *entry; size_t i; - if (!(entry = virHashLookup(blockNamedNodeData, dd->disk->src->nodeformat))) + if (!(entry = virHashLookup(blockNamedNodeData, + qemuBlockStorageSourceGetEffectiveNodename(dd->disk->src)))) return 0; for (i = 0; i < entry->nbitmaps; i++) { @@ -969,7 +970,8 @@ qemuSnapshotDiskBitmapsPropagate(qemuSnapshotDiskData *dd, if (!bitmap->persistent || !bitmap->recording || bitmap->inconsistent) continue; - if (qemuMonitorTransactionBitmapAdd(actions, dd->src->nodeformat, + if (qemuMonitorTransactionBitmapAdd(actions, + qemuBlockStorageSourceGetEffectiveNodename(dd->src), bitmap->name, true, false, bitmap->granularity) < 0) return -1;