From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53622) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3E1z-0004Tj-Vt for qemu-devel@nongnu.org; Mon, 22 Dec 2014 20:13:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y3E1t-0000xD-CO for qemu-devel@nongnu.org; Mon, 22 Dec 2014 20:12:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42497) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3E1t-0000x7-3u for qemu-devel@nongnu.org; Mon, 22 Dec 2014 20:12:53 -0500 From: John Snow Date: Mon, 22 Dec 2014 20:12:17 -0500 Message-Id: <1419297142-24282-9-git-send-email-jsnow@redhat.com> In-Reply-To: <1419297142-24282-1-git-send-email-jsnow@redhat.com> References: <1419297142-24282-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH v10 08/13] block: add bdrv_reclaim_dirty_bitmap List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, famz@redhat.com, John Snow , armbru@redhat.com, mreitz@redhat.com, vsementsov@parallels.com, stefanha@redhat.com For a synchronization bitmap that has been used for a failed operation, we may wish to merge that bitmap back with the bitmap we copied it from so that no dirty bit tracking information is lost due to the failed operation. For this operation, I add bdrv_reclaim_dirty_bitmap, which takes a BdrvDirtyBitmap associated with a failed operation and merges the bitmap back with the BdrvDirtyBitmap that spawned it, then frees this failed bitmap. Signed-off-by: John Snow --- block.c | 13 +++++++++++++ include/block/block.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/block.c b/block.c index f9e0767..990b9eb 100644 --- a/block.c +++ b/block.c @@ -53,6 +53,7 @@ struct BdrvDirtyBitmap { HBitmap *bitmap; + BdrvDirtyBitmap *originator; int64_t size; int64_t granularity; char *name; @@ -5352,6 +5353,7 @@ BdrvDirtyBitmap *bdrv_copy_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *new_bitmap; new_bitmap = g_malloc0(sizeof(BdrvDirtyBitmap)); + new_bitmap->originator = bitmap; new_bitmap->bitmap = hbitmap_copy(bitmap->bitmap); new_bitmap->size = bitmap->size; new_bitmap->granularity = bitmap->granularity; @@ -5360,6 +5362,17 @@ BdrvDirtyBitmap *bdrv_copy_dirty_bitmap(BlockDriverState *bs, return new_bitmap; } +BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs, + BdrvDirtyBitmap *failed) +{ + BdrvDirtyBitmap *originator = failed->originator; + hbitmap_merge(originator->bitmap, failed->bitmap); + bdrv_release_dirty_bitmap(bs, failed); + + return originator; +} + + BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity, const char *name, diff --git a/include/block/block.h b/include/block/block.h index e964abd..e51ca45 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -439,6 +439,8 @@ void bdrv_dirty_bitmap_make_anon(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); BdrvDirtyBitmap *bdrv_copy_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, const char *name); +BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs, + BdrvDirtyBitmap *failed); void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs); uint64_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs); -- 1.9.3