* Mon Sep 28 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 5.1.0-10.el8
- kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch [bz#1877209] - Resolves: bz#1877209 ('qemu-img bitmaps --merge' failed when trying to merge top volume bitmap to base volume bitmap)
This commit is contained in:
parent
127b33070a
commit
a318bb58b7
203
kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch
Normal file
203
kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
From a768aa960a2e9e3b8dd72dfc7135a7e7d0814d3f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eric Blake <eblake@redhat.com>
|
||||||
|
Date: Wed, 23 Sep 2020 17:49:40 -0400
|
||||||
|
Subject: [PATCH] qemu-img: Support bitmap --merge into backing image
|
||||||
|
|
||||||
|
RH-Author: Eric Blake <eblake@redhat.com>
|
||||||
|
Message-id: <20200923174940.704681-2-eblake@redhat.com>
|
||||||
|
Patchwork-id: 98487
|
||||||
|
O-Subject: [RHEL-AV-8.3.0 qemu-kvm PATCH 1/1] qemu-img: Support bitmap --merge into backing image
|
||||||
|
Bugzilla: 1877209
|
||||||
|
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||||
|
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||||
|
|
||||||
|
If you have the chain 'base.qcow2 <- top.qcow2' and want to merge a
|
||||||
|
bitmap from top into base, qemu-img was failing with:
|
||||||
|
|
||||||
|
qemu-img: Could not open 'top.qcow2': Could not open backing file: Failed to get shared "write" lock
|
||||||
|
Is another process using the image [base.qcow2]?
|
||||||
|
|
||||||
|
The easiest fix is to not open the entire backing chain of either
|
||||||
|
image (source or destination); after all, the point of 'qemu-img
|
||||||
|
bitmap' is solely to manipulate bitmaps directly within a single qcow2
|
||||||
|
image, and this is made more precise if we don't pay attention to
|
||||||
|
other images in the chain that may happen to have a bitmap by the same
|
||||||
|
name.
|
||||||
|
|
||||||
|
However, note that on a case-by-case analysis, there _are_ times where
|
||||||
|
we treat it as a feature that we can access a bitmap from a backing
|
||||||
|
layer in association with an overlay BDS. A demonstration of this is
|
||||||
|
using NBD to expose both an overlay BDS (for constant contents) and a
|
||||||
|
bitmap (for learning which blocks are interesting) during an
|
||||||
|
incremental backup:
|
||||||
|
|
||||||
|
Base <- Active <- Temporary
|
||||||
|
\--block job ->/
|
||||||
|
|
||||||
|
where Temporary is being fed by a backup 'sync=none' job. When
|
||||||
|
exposing Temporary over NBD, referring to a bitmap that lives only in
|
||||||
|
Active is less effort than having to copy a bitmap into Temporary [1].
|
||||||
|
So the testsuite additions in this patch check both where bitmaps get
|
||||||
|
allocated (the qemu-img info output), and that qemu-nbd is indeed able
|
||||||
|
to access a bitmap inherited from the backing chain since it is a
|
||||||
|
different use case than 'qemu-img bitmap'.
|
||||||
|
|
||||||
|
[1] Full disclosure: prior to the recent commit 374eedd1c4 and
|
||||||
|
friends, we were NOT able to see bitmaps through filters, which meant
|
||||||
|
that we actually did not have nice clean semantics for uniformly being
|
||||||
|
able to pick up bitmaps from anywhere in the backing chain (seen as a
|
||||||
|
change in behavior between qemu 4.1 and 4.2 at commit 00e30f05de, when
|
||||||
|
block-copy swapped from a one-off to a filter). Which means libvirt
|
||||||
|
was already coded to copy bitmaps around for the sake of older qemu,
|
||||||
|
even though modern qemu no longer needs it. Oh well.
|
||||||
|
|
||||||
|
Fixes: http://bugzilla.redhat.com/1877209
|
||||||
|
Reported-by: Eyal Shenitzky <eshenitz@redhat.com>
|
||||||
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||||
|
Message-Id: <20200914191009.644842-1-eblake@redhat.com>
|
||||||
|
[eblake: more commit message tweaks, per Max Reitz review]
|
||||||
|
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||||||
|
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||||||
|
|
||||||
|
(cherry picked from commit 14f16bf9474c860ecc127a66a86961942319f7af)
|
||||||
|
Tweak 291.out since extended L2 is not backported.
|
||||||
|
|
||||||
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
||||||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||||
|
---
|
||||||
|
qemu-img.c | 11 +++++---
|
||||||
|
tests/qemu-iotests/291 | 12 +++++++++
|
||||||
|
tests/qemu-iotests/291.out | 54 ++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 74 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/qemu-img.c b/qemu-img.c
|
||||||
|
index 5308773811f..b0ca321a6be 100644
|
||||||
|
--- a/qemu-img.c
|
||||||
|
+++ b/qemu-img.c
|
||||||
|
@@ -4747,14 +4747,19 @@ static int img_bitmap(int argc, char **argv)
|
||||||
|
filename = argv[optind];
|
||||||
|
bitmap = argv[optind + 1];
|
||||||
|
|
||||||
|
- blk = img_open(image_opts, filename, fmt, BDRV_O_RDWR, false, false,
|
||||||
|
- false);
|
||||||
|
+ /*
|
||||||
|
+ * No need to open backing chains; we will be manipulating bitmaps
|
||||||
|
+ * directly in this image without reference to image contents.
|
||||||
|
+ */
|
||||||
|
+ blk = img_open(image_opts, filename, fmt, BDRV_O_RDWR | BDRV_O_NO_BACKING,
|
||||||
|
+ false, false, false);
|
||||||
|
if (!blk) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
bs = blk_bs(blk);
|
||||||
|
if (src_filename) {
|
||||||
|
- src = img_open(false, src_filename, src_fmt, 0, false, false, false);
|
||||||
|
+ src = img_open(false, src_filename, src_fmt, BDRV_O_NO_BACKING,
|
||||||
|
+ false, false, false);
|
||||||
|
if (!src) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
diff --git a/tests/qemu-iotests/291 b/tests/qemu-iotests/291
|
||||||
|
index 1e0bb76959b..4f837b20565 100755
|
||||||
|
--- a/tests/qemu-iotests/291
|
||||||
|
+++ b/tests/qemu-iotests/291
|
||||||
|
@@ -91,6 +91,15 @@ $QEMU_IMG bitmap --remove --image-opts \
|
||||||
|
driver=$IMGFMT,file.driver=file,file.filename="$TEST_IMG" tmp
|
||||||
|
_img_info --format-specific
|
||||||
|
|
||||||
|
+echo
|
||||||
|
+echo "=== Merge from top layer into backing image ==="
|
||||||
|
+echo
|
||||||
|
+
|
||||||
|
+$QEMU_IMG rebase -u -F qcow2 -b "$TEST_IMG.base" "$TEST_IMG"
|
||||||
|
+$QEMU_IMG bitmap --add --merge b2 -b "$TEST_IMG" -F $IMGFMT \
|
||||||
|
+ -f $IMGFMT "$TEST_IMG.base" b3
|
||||||
|
+_img_info --format-specific --backing-chain
|
||||||
|
+
|
||||||
|
echo
|
||||||
|
echo "=== Check bitmap contents ==="
|
||||||
|
echo
|
||||||
|
@@ -107,6 +116,9 @@ $QEMU_IMG map --output=json --image-opts \
|
||||||
|
nbd_server_start_unix_socket -r -f qcow2 -B b2 "$TEST_IMG"
|
||||||
|
$QEMU_IMG map --output=json --image-opts \
|
||||||
|
"$IMG,x-dirty-bitmap=qemu:dirty-bitmap:b2" | _filter_qemu_img_map
|
||||||
|
+nbd_server_start_unix_socket -r -f qcow2 -B b3 "$TEST_IMG"
|
||||||
|
+$QEMU_IMG map --output=json --image-opts \
|
||||||
|
+ "$IMG,x-dirty-bitmap=qemu:dirty-bitmap:b3" | _filter_qemu_img_map
|
||||||
|
|
||||||
|
# success, all done
|
||||||
|
echo '*** done'
|
||||||
|
diff --git a/tests/qemu-iotests/291.out b/tests/qemu-iotests/291.out
|
||||||
|
index 9f661515b41..332584f67a8 100644
|
||||||
|
--- a/tests/qemu-iotests/291.out
|
||||||
|
+++ b/tests/qemu-iotests/291.out
|
||||||
|
@@ -66,6 +66,57 @@ Format specific information:
|
||||||
|
refcount bits: 16
|
||||||
|
corrupt: false
|
||||||
|
|
||||||
|
+=== Merge from top layer into backing image ===
|
||||||
|
+
|
||||||
|
+image: TEST_DIR/t.IMGFMT
|
||||||
|
+file format: IMGFMT
|
||||||
|
+virtual size: 10 MiB (10485760 bytes)
|
||||||
|
+cluster_size: 65536
|
||||||
|
+backing file: TEST_DIR/t.IMGFMT.base
|
||||||
|
+backing file format: IMGFMT
|
||||||
|
+Format specific information:
|
||||||
|
+ compat: 1.1
|
||||||
|
+ compression type: zlib
|
||||||
|
+ lazy refcounts: false
|
||||||
|
+ bitmaps:
|
||||||
|
+ [0]:
|
||||||
|
+ flags:
|
||||||
|
+ name: b1
|
||||||
|
+ granularity: 524288
|
||||||
|
+ [1]:
|
||||||
|
+ flags:
|
||||||
|
+ [0]: auto
|
||||||
|
+ name: b2
|
||||||
|
+ granularity: 65536
|
||||||
|
+ [2]:
|
||||||
|
+ flags:
|
||||||
|
+ name: b0
|
||||||
|
+ granularity: 65536
|
||||||
|
+ refcount bits: 16
|
||||||
|
+ corrupt: false
|
||||||
|
+
|
||||||
|
+image: TEST_DIR/t.IMGFMT.base
|
||||||
|
+file format: IMGFMT
|
||||||
|
+virtual size: 10 MiB (10485760 bytes)
|
||||||
|
+cluster_size: 65536
|
||||||
|
+Format specific information:
|
||||||
|
+ compat: 1.1
|
||||||
|
+ compression type: zlib
|
||||||
|
+ lazy refcounts: false
|
||||||
|
+ bitmaps:
|
||||||
|
+ [0]:
|
||||||
|
+ flags:
|
||||||
|
+ [0]: auto
|
||||||
|
+ name: b0
|
||||||
|
+ granularity: 65536
|
||||||
|
+ [1]:
|
||||||
|
+ flags:
|
||||||
|
+ [0]: auto
|
||||||
|
+ name: b3
|
||||||
|
+ granularity: 65536
|
||||||
|
+ refcount bits: 16
|
||||||
|
+ corrupt: false
|
||||||
|
+
|
||||||
|
=== Check bitmap contents ===
|
||||||
|
|
||||||
|
[{ "start": 0, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||||
|
@@ -77,4 +128,7 @@ Format specific information:
|
||||||
|
[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||||
|
{ "start": 2097152, "length": 1048576, "depth": 0, "zero": false, "data": false},
|
||||||
|
{ "start": 3145728, "length": 7340032, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
|
||||||
|
+[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||||
|
+{ "start": 2097152, "length": 1048576, "depth": 0, "zero": false, "data": false},
|
||||||
|
+{ "start": 3145728, "length": 7340032, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
|
||||||
|
*** done
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
@ -69,7 +69,7 @@ Obsoletes: %1-rhev
|
|||||||
Summary: QEMU is a machine emulator and virtualizer
|
Summary: QEMU is a machine emulator and virtualizer
|
||||||
Name: qemu-kvm
|
Name: qemu-kvm
|
||||||
Version: 5.1.0
|
Version: 5.1.0
|
||||||
Release: 9%{?dist}
|
Release: 10%{?dist}
|
||||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||||
Epoch: 15
|
Epoch: 15
|
||||||
License: GPLv2 and GPLv2+ and CC-BY
|
License: GPLv2 and GPLv2+ and CC-BY
|
||||||
@ -195,6 +195,8 @@ Patch62: kvm-Revert-Drop-bogus-IPv6-messages.patch
|
|||||||
Patch63: kvm-block-rbd-add-namespace-to-qemu_rbd_strong_runtime_o.patch
|
Patch63: kvm-block-rbd-add-namespace-to-qemu_rbd_strong_runtime_o.patch
|
||||||
# For bz#1688978 - RFE: forward host preferences for cipher suites and CA certs to guest firmware
|
# For bz#1688978 - RFE: forward host preferences for cipher suites and CA certs to guest firmware
|
||||||
Patch64: kvm-hw-nvram-fw_cfg-fix-FWCfgDataGeneratorClass-get_data.patch
|
Patch64: kvm-hw-nvram-fw_cfg-fix-FWCfgDataGeneratorClass-get_data.patch
|
||||||
|
# For bz#1877209 - 'qemu-img bitmaps --merge' failed when trying to merge top volume bitmap to base volume bitmap
|
||||||
|
Patch65: kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch
|
||||||
|
|
||||||
BuildRequires: wget
|
BuildRequires: wget
|
||||||
BuildRequires: rpm-build
|
BuildRequires: rpm-build
|
||||||
@ -1160,6 +1162,11 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Sep 28 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 5.1.0-10.el8
|
||||||
|
- kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch [bz#1877209]
|
||||||
|
- Resolves: bz#1877209
|
||||||
|
('qemu-img bitmaps --merge' failed when trying to merge top volume bitmap to base volume bitmap)
|
||||||
|
|
||||||
* Mon Sep 21 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 5.1.0-9.el8
|
* Mon Sep 21 2020 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 5.1.0-9.el8
|
||||||
- kvm-hw-nvram-fw_cfg-fix-FWCfgDataGeneratorClass-get_data.patch [bz#1688978]
|
- kvm-hw-nvram-fw_cfg-fix-FWCfgDataGeneratorClass-get_data.patch [bz#1688978]
|
||||||
- Resolves: bz#1688978
|
- Resolves: bz#1688978
|
||||||
|
Loading…
Reference in New Issue
Block a user