On 25.02.2017 18:07, Vladimir Sementsov-Ogievskiy wrote: > New field BdrvDirtyBitmap.persistent means, that bitmap should be saved > on bdrv_close, using format driver.
Somehow this sentence stays valid, but it has a much different meaning now. bdrv_close() no longer directly takes care of saving bitmaps but its completely up to the format driver. In any case, this patch has no longer anything to do with that, so I think this statement should be changed. Max > Format driver should maintain bitmap > storing. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > --- > block/dirty-bitmap.c | 26 ++++++++++++++++++++++++++ > block/qcow2-bitmap.c | 1 + > include/block/dirty-bitmap.h | 6 ++++++ > 3 files changed, 33 insertions(+) > > diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c > index a9dfce8d00..d2fbf55964 100644 > --- a/block/dirty-bitmap.c > +++ b/block/dirty-bitmap.c > @@ -44,6 +44,7 @@ struct BdrvDirtyBitmap { > int64_t size; /* Size of the bitmap (Number of sectors) */ > bool disabled; /* Bitmap is read-only */ > int active_iterators; /* How many iterators are active */ > + bool persistent; /* bitmap must be saved to owner disk image > */ > bool autoload; /* For persistent bitmaps: bitmap must be > autoloaded on image opening */ > QLIST_ENTRY(BdrvDirtyBitmap) list; > @@ -72,6 +73,7 @@ void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap) > assert(!bdrv_dirty_bitmap_frozen(bitmap)); > g_free(bitmap->name); > bitmap->name = NULL; > + bitmap->persistent = false; > bitmap->autoload = false; > } > > @@ -241,6 +243,8 @@ BdrvDirtyBitmap > *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs, > bitmap->name = NULL; > successor->name = name; > bitmap->successor = NULL; > + successor->persistent = bitmap->persistent; > + bitmap->persistent = false; > successor->autoload = bitmap->autoload; > bitmap->autoload = false; > bdrv_release_dirty_bitmap(bs, bitmap); > @@ -555,3 +559,25 @@ bool bdrv_dirty_bitmap_get_autoload(const > BdrvDirtyBitmap *bitmap) > { > return bitmap->autoload; > } > + > +void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap, bool > persistent) > +{ > + bitmap->persistent = persistent; > +} > + > +bool bdrv_dirty_bitmap_get_persistance(BdrvDirtyBitmap *bitmap) > +{ > + return bitmap->persistent; > +} > + > +bool bdrv_has_persistent_bitmaps(BlockDriverState *bs) > +{ > + BdrvDirtyBitmap *bm; > + QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) { > + if (bm->persistent) { > + return true; > + } > + } > + > + return false; > +} > diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c > index 6b1a2c9c67..ba72b7d2ac 100644 > --- a/block/qcow2-bitmap.c > +++ b/block/qcow2-bitmap.c > @@ -780,6 +780,7 @@ void > qcow2_load_autoloading_dirty_bitmaps(BlockDriverState *bs, Error **errp) > goto fail; > } > > + bdrv_dirty_bitmap_set_persistance(bitmap, true); > bdrv_dirty_bitmap_set_autoload(bitmap, true); > bm->flags |= BME_FLAG_IN_USE; > created_dirty_bitmaps = > diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h > index 45a389a20a..8dbd16b040 100644 > --- a/include/block/dirty-bitmap.h > +++ b/include/block/dirty-bitmap.h > @@ -77,4 +77,10 @@ void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap > *bitmap); > > void bdrv_dirty_bitmap_set_autoload(BdrvDirtyBitmap *bitmap, bool autoload); > bool bdrv_dirty_bitmap_get_autoload(const BdrvDirtyBitmap *bitmap); > +void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap, > + bool persistent); > +bool bdrv_dirty_bitmap_get_persistance(BdrvDirtyBitmap *bitmap); > + > +bool bdrv_has_persistent_bitmaps(BlockDriverState *bs); > + > #endif >
signature.asc
Description: OpenPGP digital signature