From nobody Sun May 19 07:12:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1530803823922716.2364590820961; Thu, 5 Jul 2018 08:17:03 -0700 (PDT) Received: from localhost ([::1]:53271 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fb60B-0007yP-E5 for importer@patchew.org; Thu, 05 Jul 2018 11:16:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42844) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fb5ye-0006yJ-1y for qemu-devel@nongnu.org; Thu, 05 Jul 2018 11:15:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fb5yZ-0004FU-Hr for qemu-devel@nongnu.org; Thu, 05 Jul 2018 11:15:24 -0400 Received: from relay.sw.ru ([185.231.240.75]:57224) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fb5yZ-0004EK-51; Thu, 05 Jul 2018 11:15:19 -0400 Received: from vz-out.virtuozzo.com ([185.231.240.5] helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.90_1) (envelope-from ) id 1fb5yV-0004kJ-KT; Thu, 05 Jul 2018 18:15:15 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 5 Jul 2018 18:15:15 +0300 Message-Id: <20180705151515.779173-1-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v4] qcow2: add overlap check for bitmap directory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy --- If it appropriate for 3.0, let's push it. If not - then for 3.1 with fixed "since". Should I cc stable? v4: - fix indentation v3: - update Qcow2OverlapCheckFlags in qapi/block-core.json [Max] v2: - squash 02 (indentation fix) to 01 - drop comment from qcow2_check_metadata_overlap() - set @ign to QCOW2_OL_BITMAP_DIRECTORY for in-place case in bitmap_list_store. I don't think non-inplace case should be changed, as it don't touch active bitmap directory. qapi/block-core.json | 21 ++++++++++++--------- block/qcow2.h | 45 ++++++++++++++++++++++++--------------------- block/qcow2-bitmap.c | 7 ++++++- block/qcow2-refcount.c | 10 ++++++++++ block/qcow2.c | 22 ++++++++++++++-------- 5 files changed, 66 insertions(+), 39 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 90e554ed0f..30f7714674 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2695,18 +2695,21 @@ # @template: Specifies a template mode which can be adjusted using the oth= er # flags, defaults to 'cached' # +# @bitmap-directory: since 3.0 +# # Since: 2.9 ## { 'struct': 'Qcow2OverlapCheckFlags', - 'data': { '*template': 'Qcow2OverlapCheckMode', - '*main-header': 'bool', - '*active-l1': 'bool', - '*active-l2': 'bool', - '*refcount-table': 'bool', - '*refcount-block': 'bool', - '*snapshot-table': 'bool', - '*inactive-l1': 'bool', - '*inactive-l2': 'bool' } } + 'data': { '*template': 'Qcow2OverlapCheckMode', + '*main-header': 'bool', + '*active-l1': 'bool', + '*active-l2': 'bool', + '*refcount-table': 'bool', + '*refcount-block': 'bool', + '*snapshot-table': 'bool', + '*inactive-l1': 'bool', + '*inactive-l2': 'bool', + '*bitmap-directory': 'bool' } } =20 ## # @Qcow2OverlapChecks: diff --git a/block/qcow2.h b/block/qcow2.h index 1c9c0d3631..f90e6e2de2 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -94,6 +94,7 @@ #define QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE "overlap-check.snapshot-table" #define QCOW2_OPT_OVERLAP_INACTIVE_L1 "overlap-check.inactive-l1" #define QCOW2_OPT_OVERLAP_INACTIVE_L2 "overlap-check.inactive-l2" +#define QCOW2_OPT_OVERLAP_BITMAP_DIRECTORY "overlap-check.bitmap-directory" #define QCOW2_OPT_CACHE_SIZE "cache-size" #define QCOW2_OPT_L2_CACHE_SIZE "l2-cache-size" #define QCOW2_OPT_L2_CACHE_ENTRY_SIZE "l2-cache-entry-size" @@ -397,34 +398,36 @@ typedef enum QCow2ClusterType { } QCow2ClusterType; =20 typedef enum QCow2MetadataOverlap { - QCOW2_OL_MAIN_HEADER_BITNR =3D 0, - QCOW2_OL_ACTIVE_L1_BITNR =3D 1, - QCOW2_OL_ACTIVE_L2_BITNR =3D 2, - QCOW2_OL_REFCOUNT_TABLE_BITNR =3D 3, - QCOW2_OL_REFCOUNT_BLOCK_BITNR =3D 4, - QCOW2_OL_SNAPSHOT_TABLE_BITNR =3D 5, - QCOW2_OL_INACTIVE_L1_BITNR =3D 6, - QCOW2_OL_INACTIVE_L2_BITNR =3D 7, - - QCOW2_OL_MAX_BITNR =3D 8, - - QCOW2_OL_NONE =3D 0, - QCOW2_OL_MAIN_HEADER =3D (1 << QCOW2_OL_MAIN_HEADER_BITNR), - QCOW2_OL_ACTIVE_L1 =3D (1 << QCOW2_OL_ACTIVE_L1_BITNR), - QCOW2_OL_ACTIVE_L2 =3D (1 << QCOW2_OL_ACTIVE_L2_BITNR), - QCOW2_OL_REFCOUNT_TABLE =3D (1 << QCOW2_OL_REFCOUNT_TABLE_BITNR), - QCOW2_OL_REFCOUNT_BLOCK =3D (1 << QCOW2_OL_REFCOUNT_BLOCK_BITNR), - QCOW2_OL_SNAPSHOT_TABLE =3D (1 << QCOW2_OL_SNAPSHOT_TABLE_BITNR), - QCOW2_OL_INACTIVE_L1 =3D (1 << QCOW2_OL_INACTIVE_L1_BITNR), + QCOW2_OL_MAIN_HEADER_BITNR =3D 0, + QCOW2_OL_ACTIVE_L1_BITNR =3D 1, + QCOW2_OL_ACTIVE_L2_BITNR =3D 2, + QCOW2_OL_REFCOUNT_TABLE_BITNR =3D 3, + QCOW2_OL_REFCOUNT_BLOCK_BITNR =3D 4, + QCOW2_OL_SNAPSHOT_TABLE_BITNR =3D 5, + QCOW2_OL_INACTIVE_L1_BITNR =3D 6, + QCOW2_OL_INACTIVE_L2_BITNR =3D 7, + QCOW2_OL_BITMAP_DIRECTORY_BITNR =3D 8, + + QCOW2_OL_MAX_BITNR =3D 9, + + QCOW2_OL_NONE =3D 0, + QCOW2_OL_MAIN_HEADER =3D (1 << QCOW2_OL_MAIN_HEADER_BITNR), + QCOW2_OL_ACTIVE_L1 =3D (1 << QCOW2_OL_ACTIVE_L1_BITNR), + QCOW2_OL_ACTIVE_L2 =3D (1 << QCOW2_OL_ACTIVE_L2_BITNR), + QCOW2_OL_REFCOUNT_TABLE =3D (1 << QCOW2_OL_REFCOUNT_TABLE_BITNR), + QCOW2_OL_REFCOUNT_BLOCK =3D (1 << QCOW2_OL_REFCOUNT_BLOCK_BITNR), + QCOW2_OL_SNAPSHOT_TABLE =3D (1 << QCOW2_OL_SNAPSHOT_TABLE_BITNR), + QCOW2_OL_INACTIVE_L1 =3D (1 << QCOW2_OL_INACTIVE_L1_BITNR), /* NOTE: Checking overlaps with inactive L2 tables will result in bdrv * reads. */ - QCOW2_OL_INACTIVE_L2 =3D (1 << QCOW2_OL_INACTIVE_L2_BITNR), + QCOW2_OL_INACTIVE_L2 =3D (1 << QCOW2_OL_INACTIVE_L2_BITNR), + QCOW2_OL_BITMAP_DIRECTORY =3D (1 << QCOW2_OL_BITMAP_DIRECTORY_BITNR), } QCow2MetadataOverlap; =20 /* Perform all overlap checks which can be done in constant time */ #define QCOW2_OL_CONSTANT \ (QCOW2_OL_MAIN_HEADER | QCOW2_OL_ACTIVE_L1 | QCOW2_OL_REFCOUNT_TABLE |= \ - QCOW2_OL_SNAPSHOT_TABLE) + QCOW2_OL_SNAPSHOT_TABLE | QCOW2_OL_BITMAP_DIRECTORY) =20 /* Perform all overlap checks which don't require disk access */ #define QCOW2_OL_CACHED \ diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index 69485aa1de..ba978ad2aa 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -775,7 +775,12 @@ static int bitmap_list_store(BlockDriverState *bs, Qco= w2BitmapList *bm_list, } } =20 - ret =3D qcow2_pre_write_overlap_check(bs, 0, dir_offset, dir_size); + /* Actually, even in in-place case ignoring QCOW2_OL_BITMAP_DIRECTORY = is not + * necessary, because we drop QCOW2_AUTOCLEAR_BITMAPS when updating bi= tmap + * directory in-place (actually, turn-off the extension), which is che= cked + * in qcow2_check_metadata_overlap() */ + ret =3D qcow2_pre_write_overlap_check( + bs, in_place ? QCOW2_OL_BITMAP_DIRECTORY : 0, dir_offset, dir_= size); if (ret < 0) { goto fail; } diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 18c729aa27..1b9ecb1ca0 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -2705,6 +2705,16 @@ int qcow2_check_metadata_overlap(BlockDriverState *b= s, int ign, int64_t offset, } } =20 + if ((chk & QCOW2_OL_BITMAP_DIRECTORY) && + (s->autoclear_features & QCOW2_AUTOCLEAR_BITMAPS)) + { + if (overlaps_with(s->bitmap_directory_offset, + s->bitmap_directory_size)) + { + return QCOW2_OL_BITMAP_DIRECTORY; + } + } + return 0; } =20 diff --git a/block/qcow2.c b/block/qcow2.c index 2f9e58e0c4..af51220499 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -676,6 +676,11 @@ static QemuOptsList qcow2_runtime_opts =3D { .help =3D "Check for unintended writes into an inactive L2 tab= le", }, { + .name =3D QCOW2_OPT_OVERLAP_BITMAP_DIRECTORY, + .type =3D QEMU_OPT_BOOL, + .help =3D "Check for unintended writes into the bitmap directo= ry", + }, + { .name =3D QCOW2_OPT_CACHE_SIZE, .type =3D QEMU_OPT_SIZE, .help =3D "Maximum combined metadata (L2 tables and refcount b= locks) " @@ -708,14 +713,15 @@ static QemuOptsList qcow2_runtime_opts =3D { }; =20 static const char *overlap_bool_option_names[QCOW2_OL_MAX_BITNR] =3D { - [QCOW2_OL_MAIN_HEADER_BITNR] =3D QCOW2_OPT_OVERLAP_MAIN_HEADER, - [QCOW2_OL_ACTIVE_L1_BITNR] =3D QCOW2_OPT_OVERLAP_ACTIVE_L1, - [QCOW2_OL_ACTIVE_L2_BITNR] =3D QCOW2_OPT_OVERLAP_ACTIVE_L2, - [QCOW2_OL_REFCOUNT_TABLE_BITNR] =3D QCOW2_OPT_OVERLAP_REFCOUNT_TABLE, - [QCOW2_OL_REFCOUNT_BLOCK_BITNR] =3D QCOW2_OPT_OVERLAP_REFCOUNT_BLOCK, - [QCOW2_OL_SNAPSHOT_TABLE_BITNR] =3D QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE, - [QCOW2_OL_INACTIVE_L1_BITNR] =3D QCOW2_OPT_OVERLAP_INACTIVE_L1, - [QCOW2_OL_INACTIVE_L2_BITNR] =3D QCOW2_OPT_OVERLAP_INACTIVE_L2, + [QCOW2_OL_MAIN_HEADER_BITNR] =3D QCOW2_OPT_OVERLAP_MAIN_HEADER, + [QCOW2_OL_ACTIVE_L1_BITNR] =3D QCOW2_OPT_OVERLAP_ACTIVE_L1, + [QCOW2_OL_ACTIVE_L2_BITNR] =3D QCOW2_OPT_OVERLAP_ACTIVE_L2, + [QCOW2_OL_REFCOUNT_TABLE_BITNR] =3D QCOW2_OPT_OVERLAP_REFCOUNT_TABLE, + [QCOW2_OL_REFCOUNT_BLOCK_BITNR] =3D QCOW2_OPT_OVERLAP_REFCOUNT_BLOCK, + [QCOW2_OL_SNAPSHOT_TABLE_BITNR] =3D QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE, + [QCOW2_OL_INACTIVE_L1_BITNR] =3D QCOW2_OPT_OVERLAP_INACTIVE_L1, + [QCOW2_OL_INACTIVE_L2_BITNR] =3D QCOW2_OPT_OVERLAP_INACTIVE_L2, + [QCOW2_OL_BITMAP_DIRECTORY_BITNR] =3D QCOW2_OPT_OVERLAP_BITMAP_DIRECTO= RY, }; =20 static void cache_clean_timer_cb(void *opaque) --=20 2.11.1