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 5E43280F25 for ; Wed, 28 Oct 2026 15:08:33 +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 69SF7Lkq021166; Wed, 28 Oct 2026 18:07:22 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69SF7Lkq021166 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="fzt0PZJI" Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69SF6r1X021075 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 28 Oct 2026 18:06:54 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69SF6r1X021075 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4a009f82bedso7881655e9.0 for ; Wed, 28 Oct 2026 08:06:53 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvBz2jRHjzGo97zWBzcax7a0REcPxitsdGFXH4rynsu+SCu5MIUmBKpWHnIGDyCUM8dJn84LVgg==@openvz.org X-Gm-Message-State: AFq9FYLGuBIgORX6z253ND9IssfMZ0c5IURlQjClcbhqxH6pD4MrIhFo dsxYHa03eLM5zSX7GmA1xk7r+R0TtA3IIeDQKwmOVB+JIaBIxNBmEWqy/c06n/z4ZU7Mt51eN24 qo79G2QiKD3zPNlkJiBHwIRS+YRDiepRngcH2NxvaPZvLhlXbycdorA== X-Gm-Gg: AYBFou3iytgselocQ4c3aQNLo8LDzD2/W76TDXWOJHomEdmCuXs6b6IBQeSZPti8zuC 8SuYjcUSSvobENxczTq0B9zjS0tMjN5L95UJslJ+Plb5HqNh7qxjerymjxsk/oeTJONQyQy0oM6 jMej9QfquBkoszPLIGad1vVc/EDF7d7eov8FMKV2yGWzFWGPhi+DQTEzjGu7Otp9lKv3ckLcmBx PsgJH+R5b6dRO5g0JMqOPsvxxIf6DRp6XZAXm5Wf2vyNcTgQTyAWFKRY1cta/Muk0Y9jV7Wvo4i qxIS6WiKNhyGEEZ75SQjrwy/SqNywLNe0sQvO/Vv2dKyOlCYkQHVeCqL11IPVQUAIrcyEAB+6Gr RkptcUocc4F3zsMvlKJpC+Sd+mRo= X-Received: by 2002:a05:600c:198d:b0:4a2:1a:a11d with SMTP id 5b1f17b1804b1-4a9610e1028mr58838295e9.0.1793200013603; Wed, 28 Oct 2026 08:06:53 -0700 (PDT) X-Received: by 2002:a05:600c:198d:b0:4a2:1a:a11d with SMTP id 5b1f17b1804b1-4a9610e1028mr58837225e9.0.1793200012894; Wed, 28 Oct 2026 08:06:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1793200012; cv=none; d=google.com; s=arc-20260327; b=fX3YN9TeDs8fVKaLQrXF7UBIvQM0S8jRJ5flJemdJ1+qIkktBpAnEek2hFHLAFKcSb D+NrNp585iBSvhAmLU006iUl+k4vWd6nPXADiPWqSDxIpT33bujoQWEvsEggFL5GqV7T K0z0Z3SwfwKzXLZF3IP4roMAVuy7BeMiqCRQONqultno1d75DTUVNl/SQKSGQQdV+Ra2 rDpawMSpARBHN4qRuwKSr1St8pdu7bR2axUQ7hGC8IvYz4UszE1ghlOAwsb2LlD9Zwe6 kC9dU0dxvnIh+jvzoy2Ue9KHGYM2hwlSu49svse26XY2xon+uAJOPPUmZjLyMpv7djqr bHdQ== 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=UvojsrDfOMgxwBxw/xdssJnHc/3cdAKytNdAbOt3tGQ=; fh=CMILZ+goaghq6B4UpCDhf0EQp6kYD0LAlmOkUiVCOvs=; b=Y2NMPJLEPom67Y2HXHeEBWQ1gnKPv8b7jXw5R1+vCV0VeLcQTWZ2FH5xo+MtObOGm3 h+im/ssKT0ZZ+QTvWam8SunB+Ejrw5t24F1KFUg9LG5NsmjYviHw6GmphY2IaGoMbkZd RJ3L1ssh9g4SSH0RluwnwYjpPyzXOTH6BWZVaQ5W/ct5CB6kKY0jU8Mb9C7/ukFHF6MB O014q5mnJE2tOzMwzHR7SE+uLmiK6UEeBmH72HhzF8UUmVD6UOExd6j6eRYqS+3Ov/0J tKigWkuXx21QmfxXL5++tenObOR05VJbxQ6Svuqro8JBPpzsC39f37grzxTLxr27+IPp 086Q==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=fzt0PZJI; 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 5b1f17b1804b1-4a977de55d3si48518495e9.5.2026.10.28.08.06.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Oct 2026 08:06:52 -0700 (PDT) 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=fzt0PZJI; 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=UvojsrDfOMgxwBxw/xdssJnHc/3cdAKytNdAbOt3tGQ=; b=fzt0PZJI2rCi 8jHglEnd/+R/Hlrk4qp3OOMvdiQLu/h0qSbV2Mw9H49oTQ6HHRgzNQ7x5NlpDHiB2cXv6PldvZgY2 Idc1gflJzLqEB7T39sXdReMM0gu6lz3hSw9lxpp8tt+AWT3iSUEnbpvkK0JwNK2yQL4nOh+MS0cyu P/OnF7EFweg4Hta2izjJm/htHmj0oU091JvPs0FII9MTuALq/YWS2vHZ1nAXrBfgqDuCLLPpd4cDx xeK6U9FfqXm+KbShiSzLUv/tTfJNQ2rDMpZ9g9Y+utWUYbIYUXCsjtGNARF752HGWkISutx9WqHI/ F/TNQJQFl7t+3EB3DB+iVg==; 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 1xM5B4-00AtLl-0v; Wed, 28 Oct 2026 16:06:51 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Wed, 28 Oct 2026 16:06:44 +0100 Message-ID: <20261028150645.3222391-10-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261028150645.3222391-1-alexander.ivanov@virtuozzo.com> References: <20261028150645.3222391-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v9 09/10] dm-qcow2: flag the image for check after a reverted 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 drops the refcount of each cluster allocated for it back to zero. The write may still have partially reached the disk, so L1/L2 on disk may point to such a cluster. If the page is not rewritten before suspend, the image is left with a reference to a free cluster, which may also have been reused for another offset meanwhile. Nothing reports that: L1/L2 writeback errors don't set MD_WRITEBACK_ERROR, as the revert is considered safe. Mark such a page with MD_LX_REVERTED and clear the mark on its next successful writeback, which rewrites the whole page, e.g. when a request delayed on ENOSPC is resubmitted. On md writeback flush a still marked page sets a new lx_writeback_error flag, which is reported in get_errors and included in wants_check, so resume is refused until the image is checked and the target reloaded. The flush loop no longer stops at the first page with MD_WRITEBACK_ERROR, so a marked page after it is not missed. https://virtuozzo.atlassian.net/browse/VSTOR-148171 Feature: dm-qcow2: block device over QCOW2 files driver Signed-off-by: Alexander Ivanov --- drivers/md/dm-qcow2-cmd.c | 4 ++-- drivers/md/dm-qcow2-map.c | 3 +++ drivers/md/dm-qcow2-target.c | 15 ++++++++++----- drivers/md/dm-qcow2.h | 5 ++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/md/dm-qcow2-cmd.c b/drivers/md/dm-qcow2-cmd.c index 28c2166fd47a..0f5d61f94f26 100644 --- a/drivers/md/dm-qcow2-cmd.c +++ b/drivers/md/dm-qcow2-cmd.c @@ -20,9 +20,9 @@ static int qcow2_get_errors(struct qcow2_target *tgt, char *result, int ret; ret = DMEMIT("wants_check=%d\nmd_writeback_error=%d\ntruncate_error=%d\n" - "merge_backward_error=%d\n", + "merge_backward_error=%d\nlx_writeback_error=%d\n", wants_check, tgt->md_writeback_error, tgt->truncate_error, - tgt->backward_merge.error); + tgt->backward_merge.error, tgt->lx_writeback_error); return ret ? 1 : 0; } diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c index 185243584e0c..1ecbb525b6aa 100644 --- a/drivers/md/dm-qcow2-map.c +++ b/drivers/md/dm-qcow2-map.c @@ -1362,6 +1362,7 @@ static void revert_l_entries_update(struct qcow2 *qcow2, struct wb_desc *wbd) if (cleared) continue; /* no cluster was allocated */ + wbd->md->status |= MD_LX_REVERTED; spin_unlock(&qcow2->md_pages_lock); pos &= ~LX_REFCOUNT_EXACTLY_ONE; @@ -1385,6 +1386,8 @@ static void clear_writeback_status(struct qcow2 *qcow2, struct md_page *md, lockdep_assert_held(&qcow2->md_pages_lock); md->status &= ~(MD_WRITEBACK|MD_WRITEBACK_ERROR); + if (!ret) + md->status &= ~MD_LX_REVERTED; list_splice_init(&md->wait_list, wait_list); if (ret && !md->wbd) { /* diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c index dc083572de5e..a9bdad198fde 100644 --- a/drivers/md/dm-qcow2-target.c +++ b/drivers/md/dm-qcow2-target.c @@ -170,6 +170,7 @@ static void qcow2_free_md_pages_tree(struct rb_root *root) void qcow2_flush_deferred_activity(struct qcow2_target *tgt, struct qcow2 *qcow2) { struct rb_node *node; + bool wb_error = false; struct md_page *md; int i; @@ -191,13 +192,17 @@ void qcow2_flush_deferred_activity(struct qcow2_target *tgt, struct qcow2 *qcow2 node; node = rb_next(node)) { md = rb_entry(node, struct md_page, node); /* FIXME: call md_make_dirty() and try once again? */ - if (md->status & MD_WRITEBACK_ERROR) { - QC_ERR(tgt->ti, "Failed to write dirty pages"); - tgt->md_writeback_error = true; - break; - } + if (md->status & MD_WRITEBACK_ERROR) + wb_error = true; + if (md->status & MD_LX_REVERTED) + tgt->lx_writeback_error = true; } spin_unlock_irq(&qcow2->md_pages_lock); + + if (wb_error) { + QC_ERR(tgt->ti, "Failed to write dirty pages"); + tgt->md_writeback_error = true; + } } static void qcow2_flush_deferred_activity_all(struct qcow2_target *tgt) diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h index 93c573c9a284..4113783b9d15 100644 --- a/drivers/md/dm-qcow2.h +++ b/drivers/md/dm-qcow2.h @@ -134,6 +134,7 @@ struct md_page { #define MD_DIRTY (1U << 1) /* Page contains changes and wants writeback */ #define MD_WRITEBACK (1U << 2) /* Writeback was submitted */ #define MD_WRITEBACK_ERROR (1U << 3) /* Last writeback failed with error */ +#define MD_LX_REVERTED (1U << 4) /* L1/L2 on disk may point to freed cluster */ unsigned int status; struct page *page; struct list_head wait_list; @@ -200,6 +201,7 @@ struct qcow2_target { bool service_operations_allowed; bool wants_suspend; bool md_writeback_error; + bool lx_writeback_error; bool truncate_error; bool event_enospc; @@ -461,7 +463,8 @@ static inline bool fake_service_qio(struct qio *qio) static inline bool qcow2_wants_check(struct qcow2_target *tgt) { - return !!(tgt->md_writeback_error|tgt->truncate_error); + return !!(tgt->md_writeback_error|tgt->lx_writeback_error| + tgt->truncate_error); } static inline bool qcow2_file_is_writable(struct qcow2 *qcow2) -- 2.53.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel