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 A80C78017D for ; Thu, 29 Oct 2026 14:45:23 +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 69TEi7jg001311; Thu, 29 Oct 2026 17:44:08 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69TEi7jg001311 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="wAgJ1ZB/" Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69TEi1WL001290 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Thu, 29 Oct 2026 17:44:02 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69TEi1WL001290 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4a1fa972b4fso11332375e9.2 for ; Thu, 29 Oct 2026 07:44:02 -0700 (PDT) X-Forwarded-Encrypted: i=2; AKwUvBxUPNgR3seqseuhJMb8X415rSnkkeEgR/E2unlKSMk8ygFvd4pE+gJF1TsdfZbRBQVXA5xS9Q==@openvz.org X-Gm-Message-State: AFq9FYLvwIqb1QpCNXAFLVowaYS6D/alQII0HZDu8v/WYtC3ZOkz0NRa PoCQhFUPq+QrkWtS9iV04P99grJbjeENnSKS3Q/hvrJm3wdqnpYql6t9A4+ZggLzog3EO+RN3VR nskMpe1Akyfc+vlXfrpc5jdc5xlmWY9lYzilLUm+jrDOIHShvnwVY8w== X-Gm-Gg: AYBFou1x/olOGrUkjEjhIRWcU9oHI+8Svgxr9ZRixs/nUTNz4uNydRz5aiSrx/KmU/E 279T/lV0mZfX/c2Ri6fjIhMxQ7U/Px4DBnRPZ2nNM5MDC4jIiugHRAb8bbUA9r0nXxLGmoP89eU 3cfY8qlItBnCSed+Wg6UsnHYDhorwRYUNwHbrtsiOUoZeVA1Hzgx68ZKD9bE5xJj98zp8UfWWsp jqUez3PkENenr/A92u6TOK0nyYPpVbLDvcDTLMmLEdKSpSgmjqs27WJLCDy1wWevd2r4S0qn/p3 guqkSUfYgaRCor7w7Gjq+6joDcVgunQtkrJ4HAnsrzFn+Cis5tsQ0GTaPs7PQbGut1jaD/tOyQ8 lM1Znm28eR+W8qhBd0eh82Hs4j2HE X-Received: by 2002:a05:600c:4454:b0:4a1:ce33:1536 with SMTP id 5b1f17b1804b1-4a965cdb7afmr130733965e9.9.1793285041646; Thu, 29 Oct 2026 07:44:01 -0700 (PDT) X-Received: by 2002:a05:600c:4454:b0:4a1:ce33:1536 with SMTP id 5b1f17b1804b1-4a965cdb7afmr130733175e9.9.1793285040944; Thu, 29 Oct 2026 07:44:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1793285040; cv=none; d=google.com; s=arc-20260327; b=kT9G9ph1GQlEGT/j3vL2tUYWH3AgusfM/478OQRqnJMda63ObE3R/8uPOVSFMpL+Qp yck6O9E2J9GD6TQnzihidBNLqMX43/RDDwfda0iDCs3fdWCNympCsUaG244L53PALR+F /dripVp7ykQs04PAHzhkiq1WPMGmUzsCGKl4V69GN0T18ZyP0XKgOGA3yFqYy3Jrc5b9 dYNX/4OMmUqT3/M7lmJIlCKv4OGTotJYJB5ex4hOIiLUl9WXcMKM2JBl0Db5RvUAOYCm G/7bNNzxbN1Y4mjsq7+mU2ambax2DMGxaAQFuHBRdW6d4WcD5SZV/CauUWkXACltf3FL j51Q== 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=TautaQMzJieER/SbHVY6Xs02XJVe7JQo2mh9yYs8RHM=; fh=CMILZ+goaghq6B4UpCDhf0EQp6kYD0LAlmOkUiVCOvs=; b=r6Swsua052NytSPUWMOxRUKWqNgxTkBRu9Tx3wiFAdy0E5SoKht6j95gVobR2JmHwF /vGk6fOeCcHS9585tWffNMIUdxEIZioVG3dCbRR1vsFcGxOhUzjDo5z84AcNm2OukfST /OGjQ4dVcrwcLh+MGZYDT9ysR54Bk8Ybwmzel3vZ0HYP0vDOm1DErdCAbPE9eI3PKfq6 LJhILZyD/8d2Nr/O34rkStPh87IrTCVAlNQlxOikTK4+s3gPpYUiqeV3Vd46uQpEePYg OH3CzMkJsPkISuEI+LkJan+6SLt7dZJ9Fpa/yLLRvZDjcEDdcQJHS+wmOYcbl3u1Fg4V Trww==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b="wAgJ1ZB/"; 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-48e3ecf3f00si35078584f8f.221.2026.10.29.07.44.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Oct 2026 07:44:00 -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="wAgJ1ZB/"; 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=TautaQMzJieER/SbHVY6Xs02XJVe7JQo2mh9yYs8RHM=; b=wAgJ1ZB/zs05 SmEssyzQmC9ZT40iqv/tEHvt5PTM8GJBZTPcE6lNNugXhO2uJl9foxO3il8kp73vnfBAwJUbWZxam mogXS77ESv5G4f7/Dm2N8ibN1GtpMuSJWg8P1/0wilII9KsTH3l1ktXZ3NYdraOrIf+LO6ymDKy5v h1VHQeCIDKPI6azlyBDHaYql1K9GSrgNy1LWntswOsUKx+SiSRvPcbbQWOfm/I0OHw3zEt1qvICym mwujt7zx9ZKw2qxKpg4V2OFuVn32Yvefy715CLqhFIdPMPqCq9wzGiZXXsfc3EOCkUlkijRUpJ2eP RBuKl5fRYQ6m4SqOWSa21g==; 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 1xMRIS-007b5D-2b; Thu, 29 Oct 2026 15:43:58 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Thu, 29 Oct 2026 15:43:56 +0100 Message-ID: <20261029144358.3384569-2-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261029144358.3384569-1-alexander.ivanov@virtuozzo.com> References: <20261029144358.3384569-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v2 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 pads the unaligned image tail on .ctr and .preresume and considers the image writable on the discard and merge 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 padding 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 | 6 ++---- drivers/md/dm-qcow2-target.c | 6 ++---- drivers/md/dm-qcow2.h | 3 ++- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c index 78ee7cf5e881..bc317c8db3a6 100644 --- a/drivers/md/dm-qcow2-map.c +++ b/drivers/md/dm-qcow2-map.c @@ -1470,16 +1470,14 @@ 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); if (unlikely(ret != PAGE_SIZE && ret > 0)) { - /* Read near EOF? See qcow2_attach_file() */ + /* Read near EOF? See qcow2_parse_header() */ 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