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 82FD080EC8 for ; Wed, 28 Oct 2026 15:08:27 +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 69SF7ESL021141; Wed, 28 Oct 2026 18:07:14 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69SF7ESL021141 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="TLDoB3Hy" Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69SF6rU7021068 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 28 Oct 2026 18:06:53 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69SF6rU7021068 Received: by mail-wr1-f69.google.com with SMTP id ffacd0b85a97d-48af4a0bd0fso504667f8f.2 for ; Wed, 28 Oct 2026 08:06:53 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvBzmSWaxIW4dxGnspp/PIQwNjLdVEl+CwvFa0+3Xjg52UD8fTgweuvQU3ZGQJi3cih09iBQrzw==@openvz.org X-Gm-Message-State: AFq9FYLIO9iMnDjqUnk6hL1CBz9Jeo1wWSKH+3ciuQ9WeMVJTxScJSQL beG3BJIlfdJdKL0JGirJPK+CfzCgk9Ea9oK+tmkim3lHGS4rXZuYhXfvcSA72z47nmZfG3XOWg8 Eyn0RBozfh4qCk7HoLuTMEqYxAB5lmasHjUQc2dxUTGf2OxQ6cXI6bA== X-Gm-Gg: AYBFou1aacg+xzyb7b3SRsOUEtCFheUWsfmss2ZPF0QejiL/nRoQCa4JnBOVrxIwn0R MljkvueflltC6ltZM5ehwe+gAMTWuX6Y4jOCeCKv9W3Q+ENxbk1NL5/LTkKxz8y/MYNw7fxO9rW 5JVjRyQ5iOlmRfPovsn9d3hrKoG2NkrtRXtQ2AX/nJCEzJfj34v+olhmAgHf7tK77b1f+RrZSl9 DN4QItwHGlElMO2mmwigsyVh1yi+1JlhTFBD7QQZ1RIYZ2h/0Ee+cXajz0KRDHmEoH4YsIjJT6+ r/ivoKklGllWhudiXiQ1+JCIazNKMfS/fJG606E+xoSOBCgfDWm4bXBLnGtNM4FrNY3/t4T2JuP aZhFCUCF0zZ6pZg358PM1J7LHsZE= X-Received: by 2002:a05:6000:4a19:b0:48e:870:778f with SMTP id ffacd0b85a97d-48e5d5c38b5mr6442815f8f.16.1793200013104; Wed, 28 Oct 2026 08:06:53 -0700 (PDT) X-Received: by 2002:a05:6000:4a19:b0:48e:870:778f with SMTP id ffacd0b85a97d-48e5d5c38b5mr6442689f8f.16.1793200012293; 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=kXBu79MtO5Uj8NON4L/Db09MyuZXb64pxlX8K2Wl6sRLZn2Xeztpk6c3LW7nqsHQRF Yh01F4tCJhaVcpFlDA7UC+ct5gvJMqnYp1IRlm8v4v+ab42q2tn7I7wQeMAyYVQBfDgs CoMGVCZzywQKgt7yWsS915IDvLS2N4yxgx/gmW5mxIz63dKXsVFZedzZEZkyGivQWl/r /su0W0OM240Lwt72W5k0zImMfpGh34H/ybe4U1feeqzZ858XNIqOYOTQmhsqYl/J2S5S dA9WdFLE0kOI4VD1P5NV8r7iikUPy8NRf2xjC0fyQglWJ1bDmZZYtBvX0KlUpeUFRJtd 2O/Q== 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=3Sf6uyohn/5+0kwhwBCobppHsAg9uLEuYZOm/8XCPhE=; fh=CMILZ+goaghq6B4UpCDhf0EQp6kYD0LAlmOkUiVCOvs=; b=qZ5X8yksBD48F2NxuzCMGb+C6liLs8vct9D2bGk1roIkplWViDmqzi7bvAyPm0GJfR R0iJ8JtPb8OGeLaFyBjL19MmnkCz4IcY2wZUYOjPPgWVMN1Vwj3GscAH68D0NmOQMJOr mRDx2qjQc3kkh5P3k3jdgsTGZDIMTFv3O3isZiXmtAjGdcbVJzaemu5sIL9K/B7lyqtm OIUAseFmcRJs5wJ8qWTyMAIwaWeL3IglbLNSFYkzFnNq9Smlw0fdSVHOCJPJvd6Uu7D7 6ISiGgMDdp8/GGdQiklII2H11IZbw7Wxay0s1bXE57h7S70GN28aEMvLZWhVChYL4PYU BtPg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=TLDoB3Hy; 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-48e3ecdb119si28287227f8f.111.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=TLDoB3Hy; 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=3Sf6uyohn/5+0kwhwBCobppHsAg9uLEuYZOm/8XCPhE=; b=TLDoB3Hy0fT1 Xn02MXLUNkXOrlaGJFgxJljG11BucrgyyylpL5wsQe2w1QfEVXIu6/hnaLT5ql5GmUUeWkQHiiBge r3KrA2bxnqvC+QdUCOdSUYoByavIlbWou5JomNjlrTbe/+MGOylhf9I782qGcuKkL6t1Vi0rKGxT+ 6GaBJ38KKPwgRLCjK7IRf3wxgfahktCyg9TFhrKJtAzme20HEamlVozJxxmRxPk0V/f3WQjy9JdP/ 2bbanMulzpw5Y0mPXirsGd5/srU+3dHmsllLs+KbVsfq6hxQJjuSSmLlqRS8/Pqvn0XlWh/O33M0o F8NSms64uaKeJ979ZOUPVA==; 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 1xM5B3-00AtLl-29; Wed, 28 Oct 2026 16:06:51 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Wed, 28 Oct 2026 16:06:41 +0100 Message-ID: <20261028150645.3222391-7-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 06/10] dm-qcow2: keep the dirty bit of an image that needs check 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 The dm-qcow2 module parameter kernel_sets_dirty_bit makes the kernel set the dirty bit on resume and clear it on postsuspend. It is off by default and Virtuozzo does not set it: ploop manages the dirty bit from userspace itself. So this is a hardening patch for the non-default mode. With kernel_sets_dirty_bit, postsuspend clears the dirty bit unconditionally. An image that is dirty at open, e.g. after a crash, has unrepaired refcounts, which may be below real usage, yet it is marked clean on disk after the first suspend. A userspace check before the next open then has no reason to repair it. The same happens after an error that sets wants_check, e.g. md_writeback_error: it is kept only in the target, so resume is refused, but after a table reload or a host restart the image is reopened with a clean header. Clear the bit only if the image was clean before the kernel set it and wants_check is not set. The parsed header can't tell the former: it is reread on every preresume and may carry the kernel's own bit, e.g. on the lower image of a backward merge cancelled by suspend in waiting_completion or of a merge with depth > 0. So track two flags per image: kernel_dirty_bit_set is set only while the last header write was a successful set and the reread header still has the bit, opened_dirty is set when the header has the bit and kernel_dirty_bit_set is not set. Clearing the bit of an image opened dirty is left to userspace check. After a failed write the bit found on disk is taken as opened dirty, which costs an extra check, rather than as the kernel's, which could clear a bit set by userspace while the device was suspended. 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-target.c | 14 ++++++++++++-- drivers/md/dm-qcow2.h | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c index b667adb5472a..dc083572de5e 100644 --- a/drivers/md/dm-qcow2-target.c +++ b/drivers/md/dm-qcow2-target.c @@ -659,6 +659,7 @@ int qcow2_set_image_file_features(struct qcow2 *qcow2, bool dirty) struct QCowHeader *raw_hdr; struct md_page *md; bool is_ro; + int ret; if (qcow2->hdr.version == 2) return 0; @@ -676,12 +677,15 @@ int qcow2_set_image_file_features(struct qcow2 *qcow2, bool dirty) if (kernel_sets_dirty_bit) { if (dirty) raw_hdr->incompatible_features |= dirty_mask; - else + else if (!qcow2->opened_dirty && !qcow2_wants_check(qcow2->tgt)) raw_hdr->incompatible_features &= ~dirty_mask; } kunmap(md->page); - return qcow2_rw_page_sync(WRITE, qcow2, md->id, md->page); + ret = qcow2_rw_page_sync(WRITE, qcow2, md->id, md->page); + if (kernel_sets_dirty_bit) + qcow2->kernel_dirty_bit_set = dirty && !ret; + return ret; } ALLOW_ERROR_INJECTION(qcow2_set_image_file_features, ERRNO); @@ -903,6 +907,12 @@ static int qcow2_parse_header(struct dm_target *ti, struct qcow2 *qcow2, goto out; qcow2_calc_cached_parameters(qcow2, hdr); + if (!(hdr->incompatible_features & INCOMPATIBLE_FEATURES_DIRTY_BIT)) { + qcow2->opened_dirty = false; + qcow2->kernel_dirty_bit_set = false; + } else if (!qcow2->kernel_dirty_bit_set) { + qcow2->opened_dirty = true; + } ret = -EOPNOTSUPP; if (qcow2->clu_size < PAGE_SIZE || (qcow2->ext_l2 && qcow2->clu_size < PAGE_SIZE * 32)) diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h index 69d3ae6fca8a..93c573c9a284 100644 --- a/drivers/md/dm-qcow2.h +++ b/drivers/md/dm-qcow2.h @@ -257,6 +257,8 @@ struct qcow2 { u32 refblock_bits; u32 refblock_entries; bool ext_l2; + bool opened_dirty; + bool kernel_dirty_bit_set; bool pause_submitting_qios; /* This is used only on top qcow2 image */ bool backward_merge_in_process; -- 2.53.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel