From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41580) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z0fNW-0005Qp-CH for qemu-devel@nongnu.org; Thu, 04 Jun 2015 20:20:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z0fNU-0007Su-Px for qemu-devel@nongnu.org; Thu, 04 Jun 2015 20:20:54 -0400 From: John Snow Date: Thu, 4 Jun 2015 20:20:36 -0400 Message-Id: <1433463642-21840-4-git-send-email-jsnow@redhat.com> In-Reply-To: <1433463642-21840-1-git-send-email-jsnow@redhat.com> References: <1433463642-21840-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH 3/9] block: add bdrv_copy_dirty_bitmap List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: kwolf@redhat.com, John Snow , jcody@redhat.com, qemu-devel@nongnu.org One step up from hbitmap, we need a copy primitive for the BdrvDirtyBitmap type. Signed-off-by: John Snow --- block.c | 26 ++++++++++++++++++++++++++ include/block/block.h | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/block.c b/block.c index 1eb81ac..5551f79 100644 --- a/block.c +++ b/block.c @@ -3114,6 +3114,32 @@ BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, return bitmap; } +BdrvDirtyBitmap *bdrv_copy_dirty_bitmap(BlockDriverState *bs, + const BdrvDirtyBitmap *bitmap, + const char *name, + Error **errp) +{ + BdrvDirtyBitmap *new_bitmap; + + if (name && bdrv_find_dirty_bitmap(bs, name)) { + error_setg(errp, "Bitmap already exists: %s", name); + return NULL; + } + + new_bitmap = g_new0(BdrvDirtyBitmap, 1); + new_bitmap->bitmap = hbitmap_copy(bitmap->bitmap); + new_bitmap->size = bitmap->size; + new_bitmap->name = g_strdup(name); + + if (bitmap->successor) { + /* NB: 2nd arg is read-only. */ + hbitmap_merge(new_bitmap->bitmap, bitmap->successor->bitmap); + } + + QLIST_INSERT_HEAD(&bs->dirty_bitmaps, new_bitmap, list); + return new_bitmap; +} + bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap) { return bitmap->successor; diff --git a/include/block/block.h b/include/block/block.h index b7892d2..e88a332 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -456,6 +456,10 @@ BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, uint32_t granularity, const char *name, Error **errp); +BdrvDirtyBitmap *bdrv_copy_dirty_bitmap(BlockDriverState *bs, + const BdrvDirtyBitmap *bitmap, + const char *name, + Error **errp); int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, Error **errp); -- 2.1.0