From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53593) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bpvRm-0003ZX-II for qemu-devel@nongnu.org; Fri, 30 Sep 2016 06:53:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bpvRi-000091-8C for qemu-devel@nongnu.org; Fri, 30 Sep 2016 06:53:41 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:28868 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bpvRh-00005n-Pf for qemu-devel@nongnu.org; Fri, 30 Sep 2016 06:53:38 -0400 From: Vladimir Sementsov-Ogievskiy Date: Fri, 30 Sep 2016 13:53:21 +0300 Message-Id: <1475232808-4852-16-git-send-email-vsementsov@virtuozzo.com> In-Reply-To: <1475232808-4852-1-git-send-email-vsementsov@virtuozzo.com> References: <1475232808-4852-1-git-send-email-vsementsov@virtuozzo.com> Subject: [Qemu-devel] [PATCH 15/22] qcow2-bitmap: add autoclear bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: kwolf@redhat.com, mreitz@redhat.com, armbru@redhat.com, eblake@redhat.com, jsnow@redhat.com, famz@redhat.com, den@openvz.org, stefanha@redhat.com, vsementsov@virtuozzo.com, pbonzini@redhat.com Add autoclear bit for handling rewriting image by old qemu version. If autoclear bit is not set, but bitmaps extension is found it would not be loaded and warning will be generated. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2-bitmap.c | 4 ++++ block/qcow2.c | 12 ++++++++++-- block/qcow2.h | 9 +++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index 2642afe..76f7e2b 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -515,6 +515,10 @@ static int directory_update(BlockDriverState *bs, uint8_t *new_dir, if (ret < 0) { goto fail; } + + s->autoclear_features |= QCOW2_AUTOCLEAR_DIRTY_BITMAPS; + } else { + s->autoclear_features &= ~(uint64_t)QCOW2_AUTOCLEAR_DIRTY_BITMAPS; } s->bitmap_directory_offset = new_offset; s->bitmap_directory_size = new_size; diff --git a/block/qcow2.c b/block/qcow2.c index aa967ed..373cf7e 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -165,6 +165,13 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, break; case QCOW2_EXT_MAGIC_DIRTY_BITMAPS: + if (!(s->autoclear_features & QCOW2_AUTOCLEAR_DIRTY_BITMAPS)) { + fprintf(stderr, + "WARNING: bitmaps_ext: autoclear flag is not " + "set, all bitmaps will be considered as inconsistent"); + break; + } + ret = bdrv_pread(bs->file, offset, &bitmaps_ext, ext.len); if (ret < 0) { error_setg_errno(errp, -ret, "ERROR: bitmaps_ext: " @@ -1206,8 +1213,9 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, } /* Clear unknown autoclear feature bits */ - if (!bs->read_only && !(flags & BDRV_O_INACTIVE) && s->autoclear_features) { - s->autoclear_features = 0; + if (!bs->read_only && !(flags & BDRV_O_INACTIVE) && + (s->autoclear_features & ~QCOW2_AUTOCLEAR_MASK)) { + s->autoclear_features &= QCOW2_AUTOCLEAR_MASK; ret = qcow2_update_header(bs); if (ret < 0) { error_setg_errno(errp, -ret, "Could not update qcow2 header"); diff --git a/block/qcow2.h b/block/qcow2.h index af18efc..a5e7592 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -215,6 +215,15 @@ enum { QCOW2_COMPAT_FEAT_MASK = QCOW2_COMPAT_LAZY_REFCOUNTS, }; +/* Autoclear feature bits */ +enum { + QCOW2_AUTOCLEAR_DIRTY_BITMAPS_BITNR = 0, + QCOW2_AUTOCLEAR_DIRTY_BITMAPS = + 1 << QCOW2_AUTOCLEAR_DIRTY_BITMAPS_BITNR, + + QCOW2_AUTOCLEAR_MASK = QCOW2_AUTOCLEAR_DIRTY_BITMAPS, +}; + enum qcow2_discard_type { QCOW2_DISCARD_NEVER = 0, QCOW2_DISCARD_ALWAYS, -- 1.8.3.1