From nobody Tue Nov 11 15:58:00 2025 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=1564046435; cv=none; d=zoho.com; s=zohoarc; b=Kd61/50pX+DjvdL8cyUGnJ+yJ65LsjsFPzuaSuG/H8R7vIe7woUSbE0XFJaKh44Uu4WEguLmx09J7SqNt2zTslly22821CTwhn7wz5MBmuupWvpnhD4MTr/to4dMDGcuEqgOQgir9yMXVhCqXPjjHFfwYXdJGeIpbLEWdNPZStI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1564046435; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=+JtBkhJQiL1M6SFyW39HWoZbZyl34x3XF/ha2/sJOoM=; b=YXkaRZQ+p0kL5QTMgUumgLLPlvVXsqxqIHkkFrx8HVJyY58HkElZP7sXMTPjf9B5pqTxXl3NpgXmqkjbg29SpozP/QVNASl4cjzICfDhZOUj/RMtunZDopTfUX4kSXlvFFBmZNwAJ2JExHO3O/Vbq3aHgdhLIIOPA6pGBf9B2nU= 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 1564046435090900.6935335516954; Thu, 25 Jul 2019 02:20:35 -0700 (PDT) Received: from localhost ([::1]:57496 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqZvN-0003pH-FJ for importer@patchew.org; Thu, 25 Jul 2019 05:20:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35766) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hqZtz-0007SQ-LE for qemu-devel@nongnu.org; Thu, 25 Jul 2019 05:19:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hqZty-00044x-2C for qemu-devel@nongnu.org; Thu, 25 Jul 2019 05:19:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:44246) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hqZtx-00042D-O4; Thu, 25 Jul 2019 05:19:05 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.92) (envelope-from ) id 1hqZtw-0001bs-84; Thu, 25 Jul 2019 12:19:04 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 25 Jul 2019 12:18:59 +0300 Message-Id: <20190725091900.30542-9-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190725091900.30542-1-vsementsov@virtuozzo.com> References: <20190725091900.30542-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v3 8/9] block/qcow2-bitmap: fix reopening bitmaps to RW 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: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, mreitz@redhat.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently reopening bitmaps to RW can't work, as qcow2 needs write access to file child, to mark bitmaps in-image with IN_USE flag. The possibility to write-access file child during reopen-RW was implemented several patches ago with help of .bdrv_need_rw_file_child_during_reopen_rw handler. Let's use this new API to fix bitmaps reopening. Add corresponding test-cases to 260 iotest. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2.h | 1 + block/qcow2-bitmap.c | 6 ++++++ block/qcow2.c | 1 + tests/qemu-iotests/260 | 2 ++ tests/qemu-iotests/260.out | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/block/qcow2.h b/block/qcow2.h index a67e6a7d7c..3bfdaa7957 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -730,6 +730,7 @@ void *qcow2_cache_is_table_offset(Qcow2Cache *c, uint64= _t offset); void qcow2_cache_discard(Qcow2Cache *c, void *table); =20 /* qcow2-bitmap.c functions */ +bool qcow2_has_bitmaps(BlockDriverState *bs); int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *r= es, void **refcount_table, int64_t *refcount_table_size); diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index e276a95154..ed02588626 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -1102,6 +1102,12 @@ Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(Bloc= kDriverState *bs, return list; } =20 +bool qcow2_has_bitmaps(BlockDriverState *bs) +{ + BDRVQcow2State *s =3D bs->opaque; + return s->nb_bitmaps; +} + int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp) { BDRVQcow2State *s =3D bs->opaque; diff --git a/block/qcow2.c b/block/qcow2.c index 5c1187e2f9..1d9fb3ae98 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -5232,6 +5232,7 @@ BlockDriver bdrv_qcow2 =3D { .bdrv_reopen_bitmaps_rw =3D qcow2_reopen_bitmaps_rw, .bdrv_can_store_new_dirty_bitmap =3D qcow2_can_store_new_dirty_bitmap, .bdrv_remove_persistent_dirty_bitmap =3D qcow2_remove_persistent_dirty= _bitmap, + .bdrv_need_rw_file_child_during_reopen_rw =3D qcow2_has_bitmaps, }; =20 static void bdrv_qcow2_init(void) diff --git a/tests/qemu-iotests/260 b/tests/qemu-iotests/260 index 51288b8ee7..d8fcf4567a 100755 --- a/tests/qemu-iotests/260 +++ b/tests/qemu-iotests/260 @@ -83,3 +83,5 @@ def test(persistent, restart): =20 =20 test(persistent=3DFalse, restart=3DFalse) +test(persistent=3DTrue, restart=3DFalse) +test(persistent=3DTrue, restart=3DTrue) diff --git a/tests/qemu-iotests/260.out b/tests/qemu-iotests/260.out index 5239d27c46..2f0d98d036 100644 --- a/tests/qemu-iotests/260.out +++ b/tests/qemu-iotests/260.out @@ -15,3 +15,38 @@ check that no bitmaps are in snapshot: not found {"data": {"device": "drive0", "len": 65536, "offset": 65536, "speed": 0, "= type": "commit"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microsecon= ds": "USECS", "seconds": "SECS"}} check bitmap after commit: name=3Dbitmap0 dirty-clusters=3D2 check updated bitmap: name=3Dbitmap0 dirty-clusters=3D3 + +Testcase persistent without restart + +{"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap0", "no= de": "drive0", "persistent": true}} +{"return": {}} +initial bitmap: name=3Dbitmap0 dirty-clusters=3D1 +{"execute": "blockdev-snapshot-sync", "arguments": {"device": "drive0", "f= ormat": "qcow2", "snapshot-file": "TEST_DIR/PID-top"}} +{"return": {}} +check that no bitmaps are in snapshot: not found +{"execute": "block-commit", "arguments": {"device": "drive0", "top": "TEST= _DIR/PID-top"}} +{"return": {}} +{"data": {"device": "drive0", "len": 65536, "offset": 65536, "speed": 0, "= type": "commit"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds":= "USECS", "seconds": "SECS"}} +{"execute": "block-job-complete", "arguments": {"device": "drive0"}} +{"return": {}} +{"data": {"device": "drive0", "len": 65536, "offset": 65536, "speed": 0, "= type": "commit"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microsecon= ds": "USECS", "seconds": "SECS"}} +check bitmap after commit: name=3Dbitmap0 dirty-clusters=3D2 +check updated bitmap: name=3Dbitmap0 dirty-clusters=3D3 + +Testcase persistent with restart + +{"execute": "block-dirty-bitmap-add", "arguments": {"name": "bitmap0", "no= de": "drive0", "persistent": true}} +{"return": {}} +initial bitmap: name=3Dbitmap0 dirty-clusters=3D1 +{"execute": "blockdev-snapshot-sync", "arguments": {"device": "drive0", "f= ormat": "qcow2", "snapshot-file": "TEST_DIR/PID-top"}} +{"return": {}} +check that no bitmaps are in snapshot: not found +... Restart ... +{"execute": "block-commit", "arguments": {"device": "drive0", "top": "TEST= _DIR/PID-top"}} +{"return": {}} +{"data": {"device": "drive0", "len": 65536, "offset": 65536, "speed": 0, "= type": "commit"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds":= "USECS", "seconds": "SECS"}} +{"execute": "block-job-complete", "arguments": {"device": "drive0"}} +{"return": {}} +{"data": {"device": "drive0", "len": 65536, "offset": 65536, "speed": 0, "= type": "commit"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microsecon= ds": "USECS", "seconds": "SECS"}} +check bitmap after commit: name=3Dbitmap0 dirty-clusters=3D2 +check updated bitmap: name=3Dbitmap0 dirty-clusters=3D3 --=20 2.18.0