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:
parent
dacbb6eb8a
commit
2d00cbd8e2
@ -1288,7 +1288,6 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
|
||||
uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
|
||||
const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
|
||||
uint8_t *buf = NULL;
|
||||
BdrvDirtyBitmapIter *dbi;
|
||||
uint64_t *tb;
|
||||
uint64_t tb_size =
|
||||
size_to_clusters(s,
|
||||
@ -1307,12 +1306,14 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dbi = bdrv_dirty_iter_new(bitmap);
|
||||
buf = g_malloc(s->cluster_size);
|
||||
limit = bytes_covered_by_bitmap_cluster(s, bitmap);
|
||||
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 end, write_size;
|
||||
int64_t off;
|
||||
@ -1355,23 +1356,17 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (end >= bm_size) {
|
||||
break;
|
||||
}
|
||||
|
||||
bdrv_set_dirty_iter(dbi, end);
|
||||
offset = end;
|
||||
}
|
||||
|
||||
*bitmap_table_size = tb_size;
|
||||
g_free(buf);
|
||||
bdrv_dirty_iter_free(dbi);
|
||||
|
||||
return tb;
|
||||
|
||||
fail:
|
||||
clear_bitmap_table(bs, tb, tb_size);
|
||||
g_free(buf);
|
||||
bdrv_dirty_iter_free(dbi);
|
||||
g_free(tb);
|
||||
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user