From a318bb58b73c8f1dadd43ac54739ffa8c229a710 Mon Sep 17 00:00:00 2001 From: "Danilo C. L. de Paula" Date: Mon, 28 Sep 2020 10:55:54 -0400 Subject: [PATCH] * Mon Sep 28 2020 Danilo Cesar Lemes de Paula - 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) --- ...port-bitmap-merge-into-backing-image.patch | 203 ++++++++++++++++++ qemu-kvm.spec | 9 +- 2 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch diff --git a/kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch b/kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch new file mode 100644 index 0000000..98dff89 --- /dev/null +++ b/kvm-qemu-img-Support-bitmap-merge-into-backing-image.patch @@ -0,0 +1,203 @@ +From a768aa960a2e9e3b8dd72dfc7135a7e7d0814d3f Mon Sep 17 00:00:00 2001 +From: Eric Blake +Date: Wed, 23 Sep 2020 17:49:40 -0400 +Subject: [PATCH] qemu-img: Support bitmap --merge into backing image + +RH-Author: Eric Blake +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 +RH-Acked-by: Stefano Garzarella +RH-Acked-by: Max Reitz + +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 +Signed-off-by: Eric Blake +Message-Id: <20200914191009.644842-1-eblake@redhat.com> +[eblake: more commit message tweaks, per Max Reitz review] +Reviewed-by: Max Reitz +Reviewed-by: Vladimir Sementsov-Ogievskiy + +(cherry picked from commit 14f16bf9474c860ecc127a66a86961942319f7af) +Tweak 291.out since extended L2 is not backported. + +Signed-off-by: Eric Blake +Signed-off-by: Danilo C. L. de Paula +--- + 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 + diff --git a/qemu-kvm.spec b/qemu-kvm.spec index 5039a6b..b871e53 100644 --- a/qemu-kvm.spec +++ b/qemu-kvm.spec @@ -69,7 +69,7 @@ Obsoletes: %1-rhev Summary: QEMU is a machine emulator and virtualizer Name: qemu-kvm 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: 15 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 # 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 +# 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: rpm-build @@ -1160,6 +1162,11 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \ %changelog +* Mon Sep 28 2020 Danilo Cesar Lemes de Paula - 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 - 5.1.0-9.el8 - kvm-hw-nvram-fw_cfg-fix-FWCfgDataGeneratorClass-get_data.patch [bz#1688978] - Resolves: bz#1688978