@@ -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;
+}
@@ -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);