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 7B82E80474 for ; Fri, 23 Oct 2026 13:21:45 +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 69NDKPL7024851; Fri, 23 Oct 2026 16:20:27 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69NDKPL7024851 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="DP/2PrIf" Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69NDKD4Q024824 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Fri, 23 Oct 2026 16:20:13 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69NDKD4Q024824 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-48e0461e040so674259f8f.0 for ; Fri, 23 Oct 2026 06:20:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvByBCOFy/ldC8aXDPEADqE/427Q2bRms1qmK8s6u+l67XerrnoS8VPMN+tg2XX5sTmO/ZYOOkw==@openvz.org X-Gm-Message-State: AFq9FYIR9NDnLM52p1pRup2XgcyD520g6W7Vysocszq1CVlc7TB6XZOj fi7+jlEBBPvIlnnWG0zq/2hwlp5X1F+JesI2lPdkU5FJlRNNNKiFLT6PUl6EkHxqh+mLlOQtjyp onD8O+0ERLW7bhn51rW9lqqdT2eY+50+EORu5nc9qKZf0lusrZA6sSA== X-Gm-Gg: AYBFou3wthf4eewfJY9ccHX+kKNPFoAhtkKe4SEoBbRuIfeiR5ol7tY6v78VKxh6aMy oOG7wZv6OvS3W+G0IXAlitB+AGhdZ55mXayuQhQmmgxDTMWU9tg9ETlcQqdCK5HYFBLV8xVd1VG 4WwRJTs3lQ2vrvwbAbfIWslf5WDAbYOVchcYn8cMuRBr5mdz/hV4u7PNNWiAdnTusTrTMNPB30k ZXahsdFQaElMpWNsdUaC7EDC4Omd394jtOpsgL2dXOnIDl3FuM5hPjOUfzzCegKVwaSpsOYwiDf /sqSL84rDiBcMEGa56knbGPA3nB9COIoA2aIdn08DdHeaMZD7meBiOjGpk+6bANOQVgMmuxWbj9 c07IhMHyoAOnDhNGfgWxSM56gk7g= X-Received: by 2002:a05:6000:240c:b0:48b:f08:8159 with SMTP id ffacd0b85a97d-48e385be178mr3330997f8f.40.1792761613261; Fri, 23 Oct 2026 06:20:13 -0700 (PDT) X-Received: by 2002:a05:6000:240c:b0:48b:f08:8159 with SMTP id ffacd0b85a97d-48e385be178mr3330928f8f.40.1792761612618; Fri, 23 Oct 2026 06:20:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1792761612; cv=none; d=google.com; s=arc-20260327; b=U/QskxKSq1ffkDhVn8uchcZz+8W3CdQJXhmHfR3I/OIUs/hlT+WZf5w1Y+yDKF5hWF LooxpcIGpk43A5q4c3MeOoSy7N/3rNMNSgYLO8YqJ4a8Or9aOu+UNgtzXSGn5zEN3BAi 3wZqRMn7tXlFNMDw64RQ2M6SGUIIvqAO0DH4ayDkCCOhEtxnDoVx9aj8955QoYW/HtKU oUW177tfMmNer2z3AStQVCPk057UKohU84WVMOJ9rcAreLXOOXYRpVHU77LwolMm75rq 9uwHZXTWOHO6+37PuHm7stF6e5ziHzyRTJse9eszQd+JCfTG71MnKoJRWaXLeQcSWx90 Va/A== 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=+/siKYhC2QTyXPaltQVygGnGzdeVBvxCU3r0RX8RRHY=; fh=1MEQxOGYABaQPNQS1Ckioh0rrUOwgCYjd8t5csgx5as=; b=ImDRSLAtgjvonGvcQOoYq07LiruxYGAB1PSY9vaVEZvOYsIB3GQ7hRV+XJsjNIW+mS Xrb1KRK3XdvhbkqEUjU0uSX4uBxUL/qNar4476tsQxMgwSVv+0OYa7jdTFtRYT0IzZgg Vh2KFWEv2mv5Ij5cWEEP/EvDoj6Py9rQPvMnJWqDfAgbUe6DurBUtgulRZ7IyANGLpJH VuZIE2dd83fb5QnWhqpmur8s+jPzlwDy4jDavsheNMili06/52vdUBWLQGRuVOYvxZSV GbqkXh0KpB1RWQjORo4agYruNwMB0lGvBGLDwxNVpBe8YMG2D0mVRVZEyQnqgfIfKQ0R uaOA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b="DP/2PrIf"; 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-48e3805b9d7si4184424f8f.115.2026.10.23.06.20.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Oct 2026 06:20:12 -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="DP/2PrIf"; 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=+/siKYhC2QTyXPaltQVygGnGzdeVBvxCU3r0RX8RRHY=; b=DP/2PrIfQn8p LCdbAO/DnXDeGVgXRkAtmU+uCXaH2Tl4WFhyiNELAk+FhYxSNfcfEqk/Nd5F5wp9zVCdc0PAZXuw3 td+/5Gx/Hu7qFT7W1Qw10OC1JCI8CKKwrzXzcLtcw+YN7ZjmCLT+CdFX8Dj/MnbK4q2aJql5XZeSo bTnexk3e/Tbw0bb5u2oYoKpkRXzyUdhAp7u1ta7zd/vE96MyyjiN1BCghKk0p4DKGGH5dMI4+6OI7 D2UqfRtxmIQDoM6ef1luhaR0VBABgVVYHF+TM6L6uhKcvZtqMegDXJRZzD1mlPe6EVLjgBvaDmVTn UwL74u2qVw/mYbmZwuFZeA==; 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 1xKF8D-007iDn-1B; Fri, 23 Oct 2026 15:20:08 +0200 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Fri, 23 Oct 2026 15:20:06 +0200 Message-ID: <20261023132008.2304901-2-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261023132008.2304901-1-alexander.ivanov@virtuozzo.com> References: <20261023132008.2304901-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 1/3] drivers/md/dm-qcow2: treat images of a read-only table as read-only 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 Whether an image may be modified is decided by the mode of its file only. Userspace may pass an O_RDWR top image to a read-only table, and then dm-qcow2 truncates the unaligned image tail on every .ctr and .preresume and considers the image writable on the I/O and discard paths. merge_backward is also allowed on a read-only table if the lower image is opened for write. qcow2_set_image_file_features() checks the table mode and skips the lower image, so the merge writes to it without the dirty bit and without clearing the bitmaps autoclear bit. Enabled persistent bitmaps of the lower image are left marked consistent although the image data changed. Consider an image writable only if both its file and the table are writable, and use this check for the header update, the tail truncate and the short read near EOF as well. merge_backward on a read-only table now fails with -EACCES. https://virtuozzo.atlassian.net/browse/VSTOR-138887 Feature: dm-qcow2: block device over QCOW2 files driver Signed-off-by: Alexander Ivanov --- drivers/md/dm-qcow2-map.c | 4 +--- drivers/md/dm-qcow2-target.c | 6 ++---- drivers/md/dm-qcow2.h | 3 ++- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c index 78ee7cf5e881..54b3a345f927 100644 --- a/drivers/md/dm-qcow2-map.c +++ b/drivers/md/dm-qcow2-map.c @@ -1470,7 +1470,6 @@ static void md_page_read_complete(struct qio *qio) struct md_page *md = qio->ext->md; struct qcow2 *qcow2 = qio->qcow2; int ret = qio->ret; - mode_t mode; BUG_ON(qvec->bvec[0].bv_page != md->page); @@ -1478,8 +1477,7 @@ static void md_page_read_complete(struct qio *qio) /* Read near EOF? See qcow2_attach_file() */ loff_t pos = (md->id << PAGE_SHIFT) + ret; - mode = qcow2->file->f_mode; - if (pos == qcow2->file_size && !(mode & FMODE_WRITE)) { + if (pos == qcow2->file_size && !qcow2_file_is_writable(qcow2)) { qcow2_zero_fill_page_from(md->page, ret); ret = PAGE_SIZE; } diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c index be09615eb8e2..2d1e5d4e1b3a 100644 --- a/drivers/md/dm-qcow2-target.c +++ b/drivers/md/dm-qcow2-target.c @@ -623,13 +623,11 @@ int qcow2_set_image_file_features(struct qcow2 *qcow2, bool dirty) u64 dirty_mask = cpu_to_be64(INCOMPATIBLE_FEATURES_DIRTY_BIT); struct QCowHeader *raw_hdr; struct md_page *md; - bool is_ro; if (qcow2->hdr.version == 2) return 0; - is_ro = !(dm_table_get_mode(qcow2->tgt->ti->table) & FMODE_WRITE); - if (is_ro) + if (!qcow2_file_is_writable(qcow2)) return 0; md = qcow2_md_page_find(qcow2, 0); @@ -840,7 +838,7 @@ static int qcow2_parse_header(struct dm_target *ti, struct qcow2 *qcow2, int ret; qcow2->file_size = i_size_read(file_inode(file)); - if ((file->f_mode & FMODE_WRITE) && (qcow2->file_size & ~PAGE_MASK)) { + if (qcow2_file_is_writable(qcow2) && (qcow2->file_size & ~PAGE_MASK)) { new_size = PAGE_ALIGN(qcow2->file_size); ret = qcow2_truncate_safe(file, new_size); if (ret) { diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h index d9b8c38e093f..8f10c5812a1b 100644 --- a/drivers/md/dm-qcow2.h +++ b/drivers/md/dm-qcow2.h @@ -462,7 +462,8 @@ static inline bool qcow2_wants_check(struct qcow2_target *tgt) static inline bool qcow2_file_is_writable(struct qcow2 *qcow2) { - return qcow2->file->f_mode & FMODE_WRITE; + return (qcow2->file->f_mode & FMODE_WRITE) && + (dm_table_get_mode(qcow2->tgt->ti->table) & BLK_OPEN_WRITE); } static inline void remap_to_clu(struct qcow2 *qcow2, struct qio *qio, loff_t clu_pos) -- 2.53.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel