From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (unknown [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 2109480036 for ; Thu, 27 Aug 2026 16:10:50 +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 67RG9c0Q001679; Thu, 27 Aug 2026 19:09:39 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 67RG9c0Q001679 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="l1UIXHfM" Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 67RG9BGk001580 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Thu, 27 Aug 2026 19:09:11 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 67RG9BGk001580 Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-482a5e9400eso830526f8f.2 for ; Thu, 27 Aug 2026 09:09:11 -0700 (PDT) X-Gm-Message-State: AFuF++n2uOmnKcsbovdMBr0Y1o4MvcMHnFOnS+yuLUtwGUPcVt+oa/Ot Npra3F6uYaxC1wpYQkj9qlMgjhvYJAA0/5HF5FujpT4SFJi5zpoeQkLBytCD9p7n2khldHVMEia vBRGeovtiVz8N50HIqWdVBv+G9Eyy3Vk3SzayNXT7qZSeokkU6etJXQ== X-Gm-Gg: AR+sD10U2nWAZfQZbJSetcTlh3pAvY1D5uFQOx24qxSZUpQ5ibxYuNI7bK7rPDtnDzl Fa+hL6jsrWsIzsuObN35gmrKyC9d8tncHCUwpyTaewpYw6P2DyC3pZJCl4dcAPK3btwb056bKEd QeEU8aQ1Q0lEZqhtapl84BFAAv7MBR0Bvo/4ZyubBL8Hpw/6IUwDkb1OOvWJMY4e2d6muM3kKyW fxxrxNCmTA/l+AJNG8w12b08KURnqXCtzJDNSZR5cCEx5KKYG/2WFAHsIiJ0t2KR3t8bgLIPhx1 HwxF2elA3ZoopxzmeG3skRKrzGR2YUfzulpdqhT3QX/5FCsfsfSoih1eTjNxSl7vbc6HM54IJnr yK7WI2iwD1rJyIcpucZFH+q7+8jaJVw== X-Received: by 2002:a05:6000:4910:b0:47f:9283:1fbe with SMTP id ffacd0b85a97d-482e2646cbbmr22666967f8f.0.1787846951436; Thu, 27 Aug 2026 09:09:11 -0700 (PDT) X-Received: by 2002:a05:6000:4910:b0:47f:9283:1fbe with SMTP id ffacd0b85a97d-482e2646cbbmr22666810f8f.0.1787846950904; Thu, 27 Aug 2026 09:09:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1787846950; cv=none; d=google.com; s=arc-20260327; b=VJa+OMQjJSJ4TkH/eRWOSe9mLzMEeDAjxWLlzeqXqq4MtGIBO5kwckNcOMiHCk0lED sf12uUZqhPKN+AxI5DPd6p+xV7+G/ywKJcHXb3na2ry9K+5Ib3h/hPsoOaxtx/Eezer9 epxicar3F8wfsSNY69iL7+aiase+QmaEWxGcZhJi2F8SPuCcQla+Mc25o6nwkKs9cwse Tf9qXM9ocJFF8b7SipOwomyWpCwqKe5JIcql0NiUhv0EmoqNBO6GHBbGHYB6NQamBQKn lSZbwf/QBGHvOKeUrHeRESp/Ggqd7LRrkhAal0fkBt7PGMolPPhyV9EhSiGn8QtmcKbz OO0A== 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=zTwtLq4IjB3owgr39uJBBLXsoobj1bcIBC9/SaLk5q8=; fh=0/brz1B8ohImS2ERrXZY0dPGpSEyX2H6iLC7bneXJkE=; b=WH+aaWHe+YS3JFEsLvUY+j9ao+3C1f0+D4x8jHp2hwoh2S4PJFnOEVR0KR8Qdvnd2F 6soKctVB4bLspKlsGi9rtWq8AvriF/WuGnUY5mGZQtXaXz8GUOJPI2pUOCuzE7ijbNez lUUOzN1casqNG6YXyKBmeNqwHFVg8ZCdnN8EQghLxVNp/xZ5EnVsaBr9BCAGYM3t37cw dBsU5/SKNRb3nUAllEiob9uYJ5BXTN4UphQ0Ded5NgoTjnTfKIA8OAdcdJFgsRH7JT19 zyem+F8ZBvAv+/VBsbBeVLjr/6xW4FfQ8VY8xdc8drKUSwPjGuoexsMXgMf5+O0L9lu9 cSVw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=l1UIXHfM; spf=pass (google.com: domain of andrey.zhadchenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=andrey.zhadchenko@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-482e2787ee3si8472770f8f.10.2026.08.27.09.09.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 27 Aug 2026 09:09:10 -0700 (PDT) Received-SPF: pass (google.com: domain of andrey.zhadchenko@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=l1UIXHfM; spf=pass (google.com: domain of andrey.zhadchenko@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=andrey.zhadchenko@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=zTwtLq4IjB3owgr39uJBBLXsoobj1bcIBC9/SaLk5q8=; b=l1UIXHfMEcd/ /6DvmY2EvEgPaOG0EZOtzEJ+ypeyoul3g/EmJO18W7mj5COiI4zhcPVPAcNz8Y8ekK9aSAQn6CC38 aZjTlaIlc5KxtjbZigdQOBlGmj3w9ljoIWXUG4B+wW/Fs/wD8IokgIrufFfRjYgXGeZbgTtzKnxD0 euFKeX8SS/LrA2l1A3ChCjMpSnp8Ivy4v8HvPLnVuEMDjR+SGzg7QlrM1z/oTGS3Ayy9wqDOiRoOg 4h5t3FVeU21nlxLtXLPxrrLP0vgHYEUh6MqeFLP0cetBBuhcrB08XIa+hw9j4/60CBqVMeHz1d1YG C1tvzWDLxvyvSOwjyMeyyA==; Received: from [130.117.225.5] (helo=vz9-demens-1.aci.vzint.dev) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1wzccs-00FHQJ-1U; Thu, 27 Aug 2026 18:09:08 +0200 From: Andrey Zhadchenko To: ptikhomirov@virtuozzo.com, vasileios.almpanis@virtuozzo.com Date: Thu, 27 Aug 2026 19:06:16 +0300 Message-ID: <20260827160619.303398-9-andrey.zhadchenko@virtuozzo.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260827160619.303398-1-andrey.zhadchenko@virtuozzo.com> References: <20260827160619.303398-1-andrey.zhadchenko@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH VZ10 v4 08/11] drivers/md/dm-qcow2: unmap cluster when discard clears last allocated subclusters 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 subclusters discard only clears bits in the extended L2 bitmap and keeps the cluster mapped. Teach dm-qcow2 to clear L2 entry if every subcluster is discarded. Feature: dm-qcow2: block device over QCOW2 files driver https://virtuozzo.atlassian.net/browse/VSTOR-139406 Signed-off-by: Andrey Zhadchenko --- drivers/md/dm-qcow2-map.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c index 609cdd8837b8d..25a0ea63b0da4 100644 --- a/drivers/md/dm-qcow2-map.c +++ b/drivers/md/dm-qcow2-map.c @@ -122,6 +122,17 @@ static u32 qio_full_subclus_mask(struct qcow2 *qcow2, struct qio *qio) return GENMASK(end_bit - 1, first_bit); } +static bool qio_discard_unmaps_cluster(struct qcow2 *qcow2, struct qio *qio, + struct qcow2_map *map) +{ + if (qio_covers_full_clu(qcow2, qio)) + return true; + if (!qcow2->ext_l2 || map->compressed) + return false; + return (u32)map->ext_l2 && + !((u32)map->ext_l2 & ~qio_full_subclus_mask(qcow2, qio)); +} + static loff_t compressed_clu_end_pos(loff_t start, sector_t compressed_sectors) { if (start % SECTOR_SIZE == 0) @@ -2044,9 +2055,10 @@ static int parse_metadata(struct qcow2 *qcow2, struct qio **qio, if (!write) return 0; - /* discards also need to update r1r2 */ + /* cluster unmapping discards also need to update r1r2 */ if (!map->clu_is_cow && - !(op_is_discard((*qio)->bi_op) && qio_covers_full_clu(qcow2, *qio))) + !(op_is_discard((*qio)->bi_op) && + qio_discard_unmaps_cluster(qcow2, *qio, map))) return 0; /* Now refcounters table/block */ @@ -3399,6 +3411,8 @@ static bool qio_discard_updates_metadata(struct qcow2 *qcow2, struct qio *qio, * Subclusters fully covered by the discard are marked unallocated in * ext_l2 bitmap: the cluster itself remains allocated, so refcounts * are not touched (hence empty unuse range). + * Discarding last subclusters in a cluster clears it from L2 like a + * whole cluster discard. * If the backing is present, set 'reads as zeroes' to avoid exposing * stale data. */ @@ -3409,7 +3423,7 @@ static int prepare_cluster_discard(struct qcow2 *qcow2, struct qio **qio, u32 index_in_page = map->l2.index_in_page; struct md_page *md = map->l2.md; loff_t unuse_pos, unuse_end; - bool whole_clu; + bool whole_clu, unmap; struct qio_ext *ext; u64 new_ext_l2 = 0; int ret; @@ -3427,6 +3441,8 @@ static int prepare_cluster_discard(struct qcow2 *qcow2, struct qio **qio, spin_unlock_irq(&qcow2->md_pages_lock); whole_clu = qio_covers_full_clu(qcow2, *qio); + unmap = qio_discard_unmaps_cluster(qcow2, *qio, map); + if (whole_clu) { if (zeroes && qcow2->ext_l2) new_ext_l2 = (u64)U32_MAX << 32; @@ -3438,7 +3454,7 @@ static int prepare_cluster_discard(struct qcow2 *qcow2, struct qio **qio, new_ext_l2 |= mask << 32; } - if (whole_clu) { + if (unmap) { if (map->clu_is_cow) { /* Cluster is shared or compressed. Decrement refcount. */ unuse_pos = map->cow_clu_pos; @@ -3463,7 +3479,7 @@ static int prepare_cluster_discard(struct qcow2 *qcow2, struct qio **qio, ext->lx_md = md; ext->new_ext_l2 = new_ext_l2; - if (!whole_clu) + if (!unmap) ext->only_set_ext_l2 = true; else if (zeroes && !qcow2->ext_l2) ext->set_all_zeroes = true; -- 2.43.5 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel