From: Vladimir Sementsov-Ogievskiy <vsement...@parallels.com> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- block/qcow2-dirty-bitmap.c | 29 +++++++++++++++++++++++++++++ block/qcow2.h | 2 ++ 2 files changed, 31 insertions(+)
diff --git a/block/qcow2-dirty-bitmap.c b/block/qcow2-dirty-bitmap.c index bc0167c..db83112 100644 --- a/block/qcow2-dirty-bitmap.c +++ b/block/qcow2-dirty-bitmap.c @@ -501,3 +501,32 @@ int qcow2_dirty_bitmap_delete(BlockDriverState *bs, return ret; } + +int qcow2_delete_all_dirty_bitmaps(BlockDriverState *bs, Error **errp) +{ + BDRVQcowState *s = bs->opaque; + int ret = 0, i; + + for (i = 0; i < s->nb_dirty_bitmaps; ++i) { + ret = qcow2_dirty_bitmap_free_clusters(bs, s->dirty_bitmaps + i); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to free dirty bitmap clusters"); + return ret; + } + g_free(s->dirty_bitmaps[i].name); + } + + g_free(s->dirty_bitmaps); + s->nb_dirty_bitmaps = 0; + + ret = qcow2_write_dirty_bitmaps(bs); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to remove dirty bitmaps" + " from dirty bitmap list"); + return ret; + } + + return ret; +} diff --git a/block/qcow2.h b/block/qcow2.h index 24beee0..b5e576c 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -616,6 +616,8 @@ int qcow2_dirty_bitmap_create(BlockDriverState *bs, const char *name, int qcow2_dirty_bitmap_delete(BlockDriverState *bs, const char *name, Error **errp); +int qcow2_delete_all_dirty_bitmaps(BlockDriverState *bs, + Error **errp); void qcow2_free_dirty_bitmaps(BlockDriverState *bs); int qcow2_read_dirty_bitmaps(BlockDriverState *bs); -- 1.9.1