From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (mail.openvz.org [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 853068017D for ; Mon, 9 Nov 2026 12:00:53 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A9BxdKU031423; Mon, 9 Nov 2026 14:59:40 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9BxdKU031423 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="cZTMRGrI" Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A9Bx49O031333 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Mon, 9 Nov 2026 14:59:04 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9Bx49O031333 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-4902ce85f72so586736f8f.2 for ; Mon, 09 Nov 2026 03:59:04 -0800 (PST) X-Forwarded-Encrypted: i=2; AL+hErHIsvMqyoJrts9YjXBlQQX7aLBzl9Gi7uWbIBD3BjtJs5ff62/usR1UXQX7w/rPR87LmWX1WQ==@openvz.org X-Gm-Message-State: APuU4Z8H70TgdRUdrs9x+/Om+3A9dqDgdBajodAFUYCJlkL9sjUxrQvs iBacVufWXKmT2b0U/UbFJbE12SaBCdWVPqX6t+kpaNaCS1kNdEw6Kw4KP+A1k87Fh44jtZKm1H9 YeZk1Xt1C2BFdCTu70Yw6ZfqrMl8E1d7qyh5cEeWw7xTJoR7OHsW0dg== X-Gm-Gg: AYBFou1MA5OxSUGSVGAxt4EPb+2tbXWBh5Le1+YxSV2Vo4Xzk98el6Hir6Kk2jHxoBX yvOYF9a/VhNvP+GqnvIuOiO/cyznsRzpTKVlV9aP6r9zwOCWtGYeGsrNk50gBFc4qP1ylouNOGu 2z7qJVM4CJyDTlOUIBaW4hPuUhsza0bKIcVvF4nO3irtTFNCAWWOLZjvw6DIxhqwQGbGEeJVZSZ xpoQjQPiSbR99mqE3EQjOtn3RYgznf1+9TFWD1kj5McE7az6UQrQeK8KOilZa5+xmPvdqOtxJA8 MPdN3oLn0mkQfZQNHt/IsO1Au/xXIPADRLS0xch2iBByYYX/mR6XFk1GkViWeTNjiTQxHc8hdmh 52ZNgB3/sxrCfriIAOhdjhd70s0s= X-Received: by 2002:a05:6000:40dd:b0:48d:f488:f32a with SMTP id ffacd0b85a97d-49585f85f9dmr7784869f8f.56.1794225543833; Mon, 09 Nov 2026 03:59:03 -0800 (PST) X-Received: by 2002:a05:6000:40dd:b0:48d:f488:f32a with SMTP id ffacd0b85a97d-49585f85f9dmr7784838f8f.56.1794225543243; Mon, 09 Nov 2026 03:59:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1794225543; cv=none; d=google.com; s=arc-20260327; b=hJ+L2Fhpk9vSkKzKXZDu2Y+iseNkXbCkAAy0OgigJ9WL+7DIAP8eclO/8rtT4BF/85 BLihcHANkytf18C7UO8lzQZ6STETAA8z6DOK4exUNRm9HjN2g7SPXnbruwdsnguo5kjI N5fsVMETFiKsVLmThvXpJZbZXKkraHnPcDb+NkZWO37n9vv3Shaqmi+vItAi6wkGVu1w vEeY68AEZ8bB18ihxEKc4ntcHaAx224AGj4G1kckFbyKl5G1YVA0GuHy10/72Ocv3POm 1rxcMDyg9b/mCDW3bQo0w7PhvrFbkrJoUJ03UcAdzhiEFwGHkmkpgoh0QDpQKvK5Galc 9+tA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=sVn/5aVtfzuj8xoA2DMPrM648KdWiupnua3C7KxQ55o=; fh=CMILZ+goaghq6B4UpCDhf0EQp6kYD0LAlmOkUiVCOvs=; b=BqIjyJvlplGWxn570ip5QsTEm3iX9uZCciEAj3jfK4scbQozUZkKQuXn7a/p4ACWQf iVzldA5oXlvuBRVq2+i8haZ2+cVvLxe7baT1szFbSq5nKPdhQkhw2DnfwKWiKd4WRvJ8 XPI2cEkusJg8OmrlPcb5v61AdGmvOuYdFsDjhPYgynOaRLbqKSSEW5YxgWVZIvdwJWiC 5CeGj9jUneUxfv2WIqs/BjJZYIyMGZsvLpSGc0QTrh0wl9ZSOTwVjOEEsAYp1BtySxEM R2f+qqatrUMiDFyGvcRIO9xe6iLgyDARYEnxPu8rdi8Yq1LURz+ajPFUvMvAhU3ZOA6U TIMw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=cZTMRGrI; spf=pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=alexander.ivanov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id ffacd0b85a97d-496cbcb1663si3670210f8f.244.2026.11.09.03.59.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Nov 2026 03:59:03 -0800 (PST) Received-SPF: pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=cZTMRGrI; spf=pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=alexander.ivanov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=sVn/5aVtfzuj8xoA2DMPrM648KdWiupnua3C7KxQ55o=; b=cZTMRGrIQvK8 djWQG+aQo1Up0guiaK2QoNmpd9Rd+ZKJboPDycaDWqappREY7x8Fj8f8VVx926/aobkRnYyw+ELSf qszZlhisKbDEjZ9KhVzDW18oAjKTo6y8GLN+uKSQ5EweZUA/WXlfu9Mje1S48wrObI6Mz+uvhV8YN zbeqZl4ILxgYQeU+nEwqR6Q/PmTo5ly6eKMGkiskK2fUSMIieotv+Ec6kfmRicPFIs3FfXCnqSeTi WEQtftyc2aI8vDaGHEGqvhB2qmWNj1adrdT+lmWLtvvj5hCkFB3WZc+qRki1p0SauhfniBImh1JV8 0xlaldffM+g0pVdX0/hyQw==; Received: from ch-vpn.virtuozzo.com ([130.117.225.6] helo=sky) by relay.virtuozzo.com with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1xQNxa-003a4R-25; Mon, 09 Nov 2026 12:58:54 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Mon, 9 Nov 2026 12:58:54 +0100 Message-ID: <20261109115856.1362416-9-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261109115856.1362416-1-alexander.ivanov@virtuozzo.com> References: <20261109115856.1362416-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v10 08/10] dm-qcow2: leak clusters allocated for a failed L1/L2 writeback X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org A failed L1/L2 writeback reverts the page in memory and frees each cluster allocated for it: revert_l_entries_update() drops the refcount of a newly allocated cluster, and a COW qio waiting on the page frees its cluster through FREE_ALLOCATED_CLU when it ends with the error. The write may still have partially reached the disk, so L1/L2 on disk may point to such a cluster. Until the page is rewritten, the allocator may give the cluster to another offset, and two guest offsets then share it. If the page is not rewritten before suspend, the image is left with a reference to a free cluster. Keep the refcount of these clusters instead. If L1/L2 on disk points to such a cluster, the image stays consistent; otherwise the cluster is leaked, which check repairs by freeing it. So the image needs no check and resume needs no refusal. https://virtuozzo.atlassian.net/browse/VSTOR-148171 Feature: dm-qcow2: block device over QCOW2 files driver Fixes: 222b6f1291c1c ("dm-qcow2: Introduce driver to create block devices over QCOW2 files") Signed-off-by: Alexander Ivanov --- drivers/md/dm-qcow2-map.c | 48 +++++++-------------------------------- 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c index cd46a99f81a7..4197f7704e18 100644 --- a/drivers/md/dm-qcow2-map.c +++ b/drivers/md/dm-qcow2-map.c @@ -1331,50 +1331,15 @@ static void do_md_page_read_complete(int ret, struct qcow2 *qcow2, /* Be careful with dirty_or_writeback()/etc! Check races. */ static void revert_l_entries_update(struct qcow2 *qcow2, struct wb_desc *wbd) { - struct qcow2_map_item r1, r2; - struct page *pe_page; - bool skip_odd; - u64 pos, old; - bool cleared; - int i, ret; - - skip_odd = qcow2->ext_l2 && wbd->lx_level == L2_LEVEL; + struct page *pe_page = wbd->pe_page; + u64 old; + int i; lockdep_assert_held(&qcow2->md_pages_lock); for_each_set_bit(i, wbd->changed_indexes, LX_INDEXES_PER_PAGE) { - pos = get_u64_from_be_page(wbd->md->page, i); - - cleared = !(pos & ~(u64)L2_READS_ALL_ZEROES); - /* Here we restore prealloced and compressed clu mappings */ - pe_page = wbd->pe_page; - if (pe_page) { /* Only L2 has this. */ - old = get_u64_from_be_page(pe_page, i); - if (old != 0) { - set_u64_to_be_page(wbd->md->page, i, old); - continue; /* Avoid mark_cluster_unused() */ - } - } - - set_u64_to_be_page(wbd->md->page, i, 0); - if (skip_odd && (i & 1)) - continue; /* pos contains ext_l2 part of L2 entry */ - if (cleared) - continue; /* no cluster was allocated */ - - spin_unlock(&qcow2->md_pages_lock); - pos &= ~LX_REFCOUNT_EXACTLY_ONE; - - /* - * R1/R2 should be cached, since we was able - * to submit cluster allocation. - */ - ret = qcow2_handle_r1r2_maps(qcow2, pos, NULL, &r1, &r2, false); - if (WARN_ON_ONCE(ret <= 0)) - continue; - - mark_cluster_unused(qcow2, r2.md, r2.index_in_page, pos); - spin_lock(&qcow2->md_pages_lock); + old = pe_page ? get_u64_from_be_page(pe_page, i) : 0; + set_u64_to_be_page(wbd->md->page, i, old); } } @@ -1408,6 +1373,7 @@ static void complete_wbd(struct qcow2 *qcow2, struct wb_desc *wbd) LIST_HEAD(wait_list); LIST_HEAD(end_list); unsigned long flags; + struct qio *qio; spin_lock_irqsave(&qcow2->md_pages_lock, flags); revert_l_entries_update(qcow2, wbd); @@ -1415,6 +1381,8 @@ static void complete_wbd(struct qcow2 *qcow2, struct wb_desc *wbd) &wait_list, &end_list); spin_unlock_irqrestore(&qcow2->md_pages_lock, flags); + list_for_each_entry(qio, &end_list, link) + qio->ext->cleanup_mask &= ~FREE_ALLOCATED_CLU; qcow2_dispatch_qios(qcow2, NULL, &wait_list); end_qios(&end_list, errno_to_blk_status(wbd->ret)); } -- 2.53.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel