From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36165) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z1zVp-0001o2-RR for qemu-devel@nongnu.org; Mon, 08 Jun 2015 12:03:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z1zVk-0001Dd-Ru for qemu-devel@nongnu.org; Mon, 08 Jun 2015 12:02:57 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:38531 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z1zVk-00018U-Gf for qemu-devel@nongnu.org; Mon, 08 Jun 2015 12:02:52 -0400 From: Vladimir Sementsov-Ogievskiy Date: Mon, 8 Jun 2015 18:21:24 +0300 Message-Id: <1433776886-27239-7-git-send-email-vsementsov@virtuozzo.com> In-Reply-To: <1433776886-27239-1-git-send-email-vsementsov@virtuozzo.com> References: <1433776886-27239-1-git-send-email-vsementsov@virtuozzo.com> Subject: [Qemu-devel] [PATCH 6/8] qcow2: add autoclear bit for dirty bitmaps List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, Vladimir Sementsov-Ogievskiy , stefanha@redhat.com, pbonzini@redhat.com, den@openvz.org, jsnow@redhat.com From: Vladimir Sementsov-Ogievskiy Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/qcow2-dirty-bitmap.c | 5 +++++ block/qcow2.c | 13 +++++++++++-- block/qcow2.h | 9 +++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/block/qcow2-dirty-bitmap.c b/block/qcow2-dirty-bitmap.c index db83112..686a121 100644 --- a/block/qcow2-dirty-bitmap.c +++ b/block/qcow2-dirty-bitmap.c @@ -188,6 +188,11 @@ static int qcow2_write_dirty_bitmaps(BlockDriverState *bs) s->dirty_bitmaps_offset = dirty_bitmaps_offset; s->dirty_bitmaps_size = dirty_bitmaps_size; + if (s->nb_dirty_bitmaps > 0) { + s->autoclear_features |= QCOW2_AUTOCLEAR_DIRTY_BITMAPS; + } else { + s->autoclear_features &= ~QCOW2_AUTOCLEAR_DIRTY_BITMAPS; + } ret = qcow2_update_header(bs); if (ret < 0) { fprintf(stderr, "Could not update qcow2 header\n"); diff --git a/block/qcow2.c b/block/qcow2.c index 406e55d..f85a55a 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -182,6 +182,14 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, return ret; } + if (!(s->autoclear_features & QCOW2_AUTOCLEAR_DIRTY_BITMAPS) && + s->nb_dirty_bitmaps > 0) { + ret = qcow2_delete_all_dirty_bitmaps(bs, errp); + if (ret < 0) { + return ret; + } + } + #ifdef DEBUG_EXT printf("Qcow2: Got dirty bitmaps extension:" " offset=%" PRIu64 " nb_bitmaps=%" PRIu32 "\n", @@ -928,8 +936,9 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, } /* Clear unknown autoclear feature bits */ - if (!bs->read_only && !(flags & BDRV_O_INCOMING) && s->autoclear_features) { - s->autoclear_features = 0; + if (!bs->read_only && !(flags & BDRV_O_INCOMING) && + (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 b5e576c..14bd6f9 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.9.1