From nobody Sun May 5 13:12:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1571053997; cv=none; d=zoho.com; s=zohoarc; b=RcYgocP5vAdjew9tVV86U5vflIM+VCaAxJ57dNTVibaVN2k38bKlQWbiOHICTWgK6GRe0iF/qifTHb0KDq1VjcBnTu63WfgYcM8DEJ0L3+tHRfrB+fBWMVMAeCVldqlD4Uy/mCLxl/NJmOJOBUFNiIqPC7SC0hSGvpqLWjwRWBY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1571053997; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=F2b6FqwRTkJ0HqozkESPWCPZrUv+6a3nJEdUNiPQXQs=; b=VpcRC+6i3w90NNo/iQtmM4mmVIEAHwstoldINMVpeHk3snxlLVf7P6BcXOMyysnapgoyuYdQ+N6PTayfNuP+flYJp+HKFlFXEJkwo6tabvqOXqoThwU+KuYjuYqsAwAn+zoa7WhO+UH2KdlGmt6C+fFwkD4/+ikmDHDm88g3pJI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1571053997653695.0776585735929; Mon, 14 Oct 2019 04:53:17 -0700 (PDT) Received: from localhost ([::1]:48196 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iJyua-0000j9-HZ for importer@patchew.org; Mon, 14 Oct 2019 07:53:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52477) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iJysx-0008AQ-I5 for qemu-devel@nongnu.org; Mon, 14 Oct 2019 07:51:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iJysw-0005lE-AZ for qemu-devel@nongnu.org; Mon, 14 Oct 2019 07:51:35 -0400 Received: from relay.sw.ru ([185.231.240.75]:57684) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iJyst-0005eV-Oo; Mon, 14 Oct 2019 07:51:31 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92.2) (envelope-from ) id 1iJysp-0002Oa-Tn; Mon, 14 Oct 2019 14:51:28 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v2 1/2] qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap Date: Mon, 14 Oct 2019 14:51:25 +0300 Message-Id: <20191014115126.15360-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191014115126.15360-1-vsementsov@virtuozzo.com> References: <20191014115126.15360-1-vsementsov@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" qcow2_can_store_new_dirty_bitmap works wrong, as it considers only bitmaps already stored in the qcow2 image and ignores persistent BdrvDirtyBitmap objects. So, let's instead count persistent BdrvDirtyBitmaps. We load all qcow2 bitmaps on open, so there should not be any bitmap in the image for which we don't have BdrvDirtyBitmaps version. If it is - it's a kind of corruption, and no reason to check for corruptions here (open() and close() are better places for it). Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Max Reitz --- block/qcow2-bitmap.c | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index 98294a7696..d5131181a3 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -1671,8 +1671,14 @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitma= p(BlockDriverState *bs, Error **errp) { BDRVQcow2State *s =3D bs->opaque; - bool found; - Qcow2BitmapList *bm_list; + BdrvDirtyBitmap *bitmap; + uint64_t bitmap_directory_size =3D 0; + uint32_t nb_bitmaps =3D 0; + + if (bdrv_find_dirty_bitmap(bs, name)) { + error_setg(errp, "Bitmap already exists: %s", name); + return false; + } =20 if (s->qcow_version < 3) { /* Without autoclear_features, we would always have to assume @@ -1688,38 +1694,27 @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitm= ap(BlockDriverState *bs, goto fail; } =20 - if (s->nb_bitmaps =3D=3D 0) { - return true; + FOR_EACH_DIRTY_BITMAP(bs, bitmap) { + if (bdrv_dirty_bitmap_get_persistence(bitmap)) { + nb_bitmaps++; + bitmap_directory_size +=3D + calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap))= , 0); + } } + nb_bitmaps++; + bitmap_directory_size +=3D calc_dir_entry_size(strlen(name), 0); =20 - if (s->nb_bitmaps >=3D QCOW2_MAX_BITMAPS) { + if (nb_bitmaps > QCOW2_MAX_BITMAPS) { error_setg(errp, "Maximum number of persistent bitmaps is already reache= d"); goto fail; } =20 - if (s->bitmap_directory_size + calc_dir_entry_size(strlen(name), 0) > - QCOW2_MAX_BITMAP_DIRECTORY_SIZE) - { + if (bitmap_directory_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) { error_setg(errp, "Not enough space in the bitmap directory"); goto fail; } =20 - qemu_co_mutex_lock(&s->lock); - bm_list =3D bitmap_list_load(bs, s->bitmap_directory_offset, - s->bitmap_directory_size, errp); - qemu_co_mutex_unlock(&s->lock); - if (bm_list =3D=3D NULL) { - goto fail; - } - - found =3D find_bitmap_by_name(bm_list, name); - bitmap_list_free(bm_list); - if (found) { - error_setg(errp, "Bitmap with the same name is already stored"); - goto fail; - } - return true; =20 fail: --=20 2.21.0 From nobody Sun May 5 13:12:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1571054228; cv=none; d=zoho.com; s=zohoarc; b=l7OIpxmE/LFmAIMEzWr0lF/S1qnEsHM9VDd/9OPGdFi+AKWO+9/nOBGLqYHUVtY5nfEcBmZQe6iONI80E6OWHbsYnv0Atxuu49FsecEuOMFTNfoEpmJpi9l0qSdaJcpBJC64yMEGcX/VIV06bt+G2YbTUJZxpKS8zp+cAeu2bTA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1571054228; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=THk+euRDJFg4iIsp99IrU3JUzPfIiyRHpv/gHQf90yQ=; b=C+s4AlyjEpVJBMqoasZxbOLWZNUd72s1VxJoj/ULyrx++vA6LwZmn5t1sIzD/NL3OcXhpg6TspQRqGQaSj9ivVivGRRVM4LGKZAULcywm+8UgSPCpEDwXFOEAqVjVIoe/Wv6/200ZNxx6lzx3R0OcvaMaP46/7HGDrbElTaWQHk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1571054228399820.8966896921274; Mon, 14 Oct 2019 04:57:08 -0700 (PDT) Received: from localhost ([::1]:48302 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iJyyE-0004AT-78 for importer@patchew.org; Mon, 14 Oct 2019 07:57:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52480) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iJysx-0008Af-Or for qemu-devel@nongnu.org; Mon, 14 Oct 2019 07:51:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iJysw-0005ld-Gm for qemu-devel@nongnu.org; Mon, 14 Oct 2019 07:51:35 -0400 Received: from relay.sw.ru ([185.231.240.75]:57682) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iJyss-0005eQ-OA; Mon, 14 Oct 2019 07:51:30 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92.2) (envelope-from ) id 1iJysq-0002Oa-1M; Mon, 14 Oct 2019 14:51:28 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v2 2/2] iotests: add 269 to check maximum of bitmaps in qcow2 Date: Mon, 14 Oct 2019 14:51:26 +0300 Message-Id: <20191014115126.15360-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191014115126.15360-1-vsementsov@virtuozzo.com> References: <20191014115126.15360-1-vsementsov@virtuozzo.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, qemu-devel@nongnu.org, mreitz@redhat.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Check that it's impossible to create more persistent bitmaps than qcow2 supports. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/269 | 47 ++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/269.out | 3 +++ tests/qemu-iotests/group | 1 + 3 files changed, 51 insertions(+) create mode 100755 tests/qemu-iotests/269 create mode 100644 tests/qemu-iotests/269.out diff --git a/tests/qemu-iotests/269 b/tests/qemu-iotests/269 new file mode 100755 index 0000000000..cf14d519ee --- /dev/null +++ b/tests/qemu-iotests/269 @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# +# Test exceeding dirty bitmaps maximum amount in qcow2 image +# +# Copyright (c) 2019 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import iotests +from iotests import qemu_img_create, file_path, log, filter_qmp_event + +iotests.verify_image_format(supported_fmts=3D['qcow2']) + +img =3D file_path('img') +size =3D 64 * 1024 + +qemu_img_create('-f', iotests.imgfmt, img, str(size)) +vm =3D iotests.VM().add_drive(img) +vm.launch() + +# Look at block/qcow2.h +QCOW2_MAX_BITMAPS =3D 65535 + +for i in range(QCOW2_MAX_BITMAPS): + result =3D vm.qmp('block-dirty-bitmap-add', node=3D'drive0', + name=3D'bitmap{}'.format(i), persistent=3DTrue) + assert result['return'] =3D=3D {} + +log("{} persistent bitmap already created, " \ + "let's try to create one more".format(QCOW2_MAX_BITMAPS)) + +vm.qmp_log('block-dirty-bitmap-add', node=3D'drive0', + name=3D'bitmap{}'.format(QCOW2_MAX_BITMAPS), persistent=3DTrue) + +vm.shutdown() diff --git a/tests/qemu-iotests/269.out b/tests/qemu-iotests/269.out new file mode 100644 index 0000000000..bcfa616a2b --- /dev/null +++ b/tests/qemu-iotests/269.out @@ -0,0 +1,3 @@ +65535 persistent bitmap already created, let's try to create one more +{"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap65535",= "node": "drive0", "persistent": true}} +{"error": {"class": "GenericError", "desc": "Can't make bitmap 'bitmap6553= 5' persistent in 'drive0': Maximum number of persistent bitmaps is already = reached"}} diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 0c1e5ef414..fe8274a204 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -279,3 +279,4 @@ 265 rw auto quick 266 rw quick 267 rw auto quick snapshot +269 --=20 2.21.0