block/qcow2-bitmap: use bdrv_dirty_bitmap_next_dirty

store_bitmap_data() loop does bdrv_set_dirty_iter() on each iteration,
which means that we actually don't need iterator itself and we can use
simpler bitmap API.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Message-id: 20200205112041.6003-11-vsementsov@virtuozzo.com
Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2020-02-05 14:20:41 +03:00 committed by John Snow
parent dacbb6eb8a
commit 2d00cbd8e2
1 changed files with 5 additions and 10 deletions

View File

@ -1288,7 +1288,6 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap); uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
const char *bm_name = bdrv_dirty_bitmap_name(bitmap); const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
uint8_t *buf = NULL; uint8_t *buf = NULL;
BdrvDirtyBitmapIter *dbi;
uint64_t *tb; uint64_t *tb;
uint64_t tb_size = uint64_t tb_size =
size_to_clusters(s, size_to_clusters(s,
@ -1307,12 +1306,14 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
return NULL; return NULL;
} }
dbi = bdrv_dirty_iter_new(bitmap);
buf = g_malloc(s->cluster_size); buf = g_malloc(s->cluster_size);
limit = bytes_covered_by_bitmap_cluster(s, bitmap); limit = bytes_covered_by_bitmap_cluster(s, bitmap);
assert(DIV_ROUND_UP(bm_size, limit) == tb_size); assert(DIV_ROUND_UP(bm_size, limit) == tb_size);
while ((offset = bdrv_dirty_iter_next(dbi)) >= 0) { offset = 0;
while ((offset = bdrv_dirty_bitmap_next_dirty(bitmap, offset, INT64_MAX))
>= 0)
{
uint64_t cluster = offset / limit; uint64_t cluster = offset / limit;
uint64_t end, write_size; uint64_t end, write_size;
int64_t off; int64_t off;
@ -1355,23 +1356,17 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
goto fail; goto fail;
} }
if (end >= bm_size) { offset = end;
break;
}
bdrv_set_dirty_iter(dbi, end);
} }
*bitmap_table_size = tb_size; *bitmap_table_size = tb_size;
g_free(buf); g_free(buf);
bdrv_dirty_iter_free(dbi);
return tb; return tb;
fail: fail:
clear_bitmap_table(bs, tb, tb_size); clear_bitmap_table(bs, tb, tb_size);
g_free(buf); g_free(buf);
bdrv_dirty_iter_free(dbi);
g_free(tb); g_free(tb);
return NULL; return NULL;