All Virtuozzo development lists (kernel + QEMU)
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@openvz.org>
To: andrey.zhadchenko@virtuozzo.com
Cc: devel@openvz.org
Subject: [Devel] [PATCH hci-8.1 v3 5/5] dm-qcow2: fix a refcount table relocation failing on a valid image
Date: Wed,  4 Nov 2026 19:01:05 +0100	[thread overview]
Message-ID: <20261104180105.1807820-6-den@openvz.org> (raw)
In-Reply-To: <20261104180105.1807820-1-den@openvz.org>

From: Denis V. Lunev <den@openvz.org>

relocate_refcount_table() puts the new reftable at pos, the start of
the first refcount group the old table does not cover, and the new
refblocks right after it. It then gives each new refblock to the group
the refblock itself sits in. When the new reftable fills the group of
pos by itself, the refblocks all land in the next group, and the group
of pos gets none. Marking the reftable clusters used then fails with a
WARN, and every allocating write past the old refcount coverage fails
with EIO.

A valid image gets there: with 4K clusters and refcount_bits=64 a
refcount group is 512 clusters, and the reftable reaches 512 clusters
when the image file grows to about 511G; with refcount_bits=32, at
about 2T.

Give the new refblocks to the groups the new reftable and refblocks
span, one each, in order. pos is group-aligned, and r2_clus is computed
for the refblocks to count both themselves and the new table, so there
is a refblock for each of these groups.

Fixes: 222b6f1291c1 ("dm-qcow2: Introduce driver to create block devices over QCOW2 files")
Reported-by: Konstantin Khorenko <khorenko@virtuozzo.com>
https://virtuozzo.atlassian.net/browse/VSTOR-153421
Feature: dm-qcow2: block device over QCOW2 files driver
Signed-off-by: Denis V. Lunev <den@openvz.org>
---
 drivers/md/dm-qcow2-map.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
index eee865989ef7..34d9d9810f60 100644
--- a/drivers/md/dm-qcow2-map.c
+++ b/drivers/md/dm-qcow2-map.c
@@ -2277,7 +2277,7 @@ static void set_reftable_in_raw_hdr(struct page *page0, loff_t pos, loff_t clus)
 static int relocate_refcount_table(struct qcow2 *qcow2, struct qio **qio)
 {
 	loff_t i, old_pos, old_end, pos, end, r2_end, delta;
-	loff_t new_md_start, new_md_end;
+	loff_t new_md_start, new_md_end, group_size, r2_pos;
 	u32 old_clus, clus, clu_size = qcow2->clu_size;
 	u32 r2_clus, bits = qcow2->refblock_bits;
 	unsigned long nr_pages, index;
@@ -2385,8 +2385,11 @@ static int relocate_refcount_table(struct qcow2 *qcow2, struct qio **qio)
 	if (i != nr_pages)
 		goto err_eio;
 
-	/* Connect new R2 to new R1 */
-	for (i = end; i < r2_end; i += clu_size) {
+	/* Connect new R2 to new R1: one for each group new R1 and R2 span */
+	group_size = (u64)qcow2->refblock_entries * clu_size;
+	for (i = pos, r2_pos = end; i < r2_end; i += group_size, r2_pos += clu_size) {
+		if (WARN_ON_ONCE(r2_pos >= r2_end))
+			goto err_eio;
 		if (calc_refcounters_map(qcow2, i, &r1, &r2) < 0) {
 			WARN_ON_ONCE(1);
 			goto err_eio;
@@ -2395,7 +2398,7 @@ static int relocate_refcount_table(struct qcow2 *qcow2, struct qio **qio)
 		if (WARN_ON_ONCE(ret <= 0))
 			goto err_eio;
 		spin_lock_irq(&qcow2->md_pages_lock);
-		set_u64_to_be_page(md->page, r1.index_in_page, i);
+		set_u64_to_be_page(md->page, r1.index_in_page, r2_pos);
 		qcow2_md_make_dirty(qcow2, md, true);
 		spin_unlock_irq(&qcow2->md_pages_lock);
 	}
-- 
2.53.0

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

  parent reply	other threads:[~2026-11-04 18:50 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-04 18:01 [Devel] [PATCH hci-8.1 v3 0/5] dm-qcow2: fix merges not stopping the users of the images they change Denis V. Lunev
2026-11-04 18:01 ` [Devel] [PATCH hci-8.1 v3 1/5] dm-qcow2: fix a failed refcount table relocation leaking md pages Denis V. Lunev
2026-11-04 18:52   ` no-reply
2026-11-04 18:01 ` [Devel] [PATCH hci-8.1 v3 2/5] dm-qcow2: fix backward merge of an inner image racing its reads Denis V. Lunev
2026-11-04 18:52   ` no-reply
2026-11-04 18:01 ` [Devel] [PATCH hci-8.1 v3 3/5] dm-qcow2: fix SEEK_HOLE/SEEK_DATA using an image freed by a merge Denis V. Lunev
2026-11-04 18:54   ` no-reply
2026-11-04 18:01 ` [Devel] [PATCH hci-8.1 v3 4/5] dm-qcow2: fix SEEK_HOLE/SEEK_DATA hanging after a failed metadata read Denis V. Lunev
2026-11-04 18:55   ` no-reply
2026-11-04 18:01 ` Denis V. Lunev [this message]
2026-11-04 18:55   ` [Devel] [PATCH hci-8.1 v3 5/5] dm-qcow2: fix a refcount table relocation failing on a valid image no-reply
2026-11-04 18:30 ` [Devel] [PATCH hci-8.1 v3 0/5] dm-qcow2: fix merges not stopping the users of the images they change Konstantin Khorenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261104180105.1807820-6-den@openvz.org \
    --to=den@openvz.org \
    --cc=andrey.zhadchenko@virtuozzo.com \
    --cc=devel@openvz.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.