mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-27 13:30:52 +00:00
dirty-bitmap: Change bdrv_dirty_iter_next() to report byte offset
Thanks to recent cleanups, most callers were scaling a return value of sectors into bytes (the exception, in qcow2-bitmap, will be converted to byte-based iteration later). Update the interface to do the scaling internally instead. In qcow2-bitmap, the code was specifically checking for an error return of -1. To avoid a regression, we either have to make sure we continue to return -1 (rather than a scaled -512) on error, or we have to fix the caller to treat all negative values as error rather than just one magic value. It's easy enough to make both changes at the same time, even though either one in isolation would work. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
715a74d819
commit
f798184cfd
@ -375,7 +375,7 @@ static int coroutine_fn backup_run_incremental(BackupBlockJob *job)
|
|||||||
dbi = bdrv_dirty_iter_new(job->sync_bitmap);
|
dbi = bdrv_dirty_iter_new(job->sync_bitmap);
|
||||||
|
|
||||||
/* Find the next dirty sector(s) */
|
/* Find the next dirty sector(s) */
|
||||||
while ((offset = bdrv_dirty_iter_next(dbi) * BDRV_SECTOR_SIZE) >= 0) {
|
while ((offset = bdrv_dirty_iter_next(dbi)) >= 0) {
|
||||||
cluster = offset / job->cluster_size;
|
cluster = offset / job->cluster_size;
|
||||||
|
|
||||||
/* Fake progress updates for any clusters we skipped */
|
/* Fake progress updates for any clusters we skipped */
|
||||||
|
@ -503,7 +503,8 @@ void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
|
|||||||
|
|
||||||
int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
|
int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
|
||||||
{
|
{
|
||||||
return hbitmap_iter_next(&iter->hbi);
|
int64_t ret = hbitmap_iter_next(&iter->hbi);
|
||||||
|
return ret < 0 ? -1 : ret * BDRV_SECTOR_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called within bdrv_dirty_bitmap_lock..unlock */
|
/* Called within bdrv_dirty_bitmap_lock..unlock */
|
||||||
|
@ -336,10 +336,10 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
|||||||
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
|
int max_io_bytes = MAX(s->buf_size / MAX_IN_FLIGHT, MAX_IO_BYTES);
|
||||||
|
|
||||||
bdrv_dirty_bitmap_lock(s->dirty_bitmap);
|
bdrv_dirty_bitmap_lock(s->dirty_bitmap);
|
||||||
offset = bdrv_dirty_iter_next(s->dbi) * BDRV_SECTOR_SIZE;
|
offset = bdrv_dirty_iter_next(s->dbi);
|
||||||
if (offset < 0) {
|
if (offset < 0) {
|
||||||
bdrv_set_dirty_iter(s->dbi, 0);
|
bdrv_set_dirty_iter(s->dbi, 0);
|
||||||
offset = bdrv_dirty_iter_next(s->dbi) * BDRV_SECTOR_SIZE;
|
offset = bdrv_dirty_iter_next(s->dbi);
|
||||||
trace_mirror_restart_iter(s, bdrv_get_dirty_count(s->dirty_bitmap) *
|
trace_mirror_restart_iter(s, bdrv_get_dirty_count(s->dirty_bitmap) *
|
||||||
BDRV_SECTOR_SIZE);
|
BDRV_SECTOR_SIZE);
|
||||||
assert(offset >= 0);
|
assert(offset >= 0);
|
||||||
@ -370,11 +370,11 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_dirty = bdrv_dirty_iter_next(s->dbi) * BDRV_SECTOR_SIZE;
|
next_dirty = bdrv_dirty_iter_next(s->dbi);
|
||||||
if (next_dirty > next_offset || next_dirty < 0) {
|
if (next_dirty > next_offset || next_dirty < 0) {
|
||||||
/* The bitmap iterator's cache is stale, refresh it */
|
/* The bitmap iterator's cache is stale, refresh it */
|
||||||
bdrv_set_dirty_iter(s->dbi, next_offset);
|
bdrv_set_dirty_iter(s->dbi, next_offset);
|
||||||
next_dirty = bdrv_dirty_iter_next(s->dbi) * BDRV_SECTOR_SIZE;
|
next_dirty = bdrv_dirty_iter_next(s->dbi);
|
||||||
}
|
}
|
||||||
assert(next_dirty == next_offset);
|
assert(next_dirty == next_offset);
|
||||||
nb_chunks++;
|
nb_chunks++;
|
||||||
|
@ -1109,7 +1109,7 @@ static uint64_t *store_bitmap_data(BlockDriverState *bs,
|
|||||||
sbc = limit >> BDRV_SECTOR_BITS;
|
sbc = limit >> BDRV_SECTOR_BITS;
|
||||||
assert(DIV_ROUND_UP(bm_size, limit) == tb_size);
|
assert(DIV_ROUND_UP(bm_size, limit) == tb_size);
|
||||||
|
|
||||||
while ((sector = bdrv_dirty_iter_next(dbi)) != -1) {
|
while ((sector = bdrv_dirty_iter_next(dbi) >> BDRV_SECTOR_BITS) >= 0) {
|
||||||
uint64_t cluster = sector / sbc;
|
uint64_t cluster = sector / sbc;
|
||||||
uint64_t end, write_size;
|
uint64_t end, write_size;
|
||||||
int64_t off;
|
int64_t off;
|
||||||
|
Loading…
Reference in New Issue
Block a user