qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v10 08/13] block: add bdrv_reclaim_dirty_bitmap


From: John Snow
Subject: [Qemu-devel] [PATCH v10 08/13] block: add bdrv_reclaim_dirty_bitmap
Date: Mon, 22 Dec 2014 20:12:17 -0500

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]