@@ -317,7 +321,21 @@ static void coroutine_fn backup_run(void *opaque)
if (alloced == 0) {
continue;
}
+ } else if (job->sync_mode == MIRROR_SYNC_MODE_DIRTY_BITMAP) {
+ int i, dirty = 0;
+ for (i = 0; i < BACKUP_SECTORS_PER_CLUSTER;
+ i += job->sync_bitmap_gran) {
+ if (bdrv_get_dirty(bs, job->sync_bitmap,
+ start * BACKUP_SECTORS_PER_CLUSTER + i)) {
+ dirty = 1;
+ break;
+ }
+ }
+ if (!dirty) {
+ continue;
+ }
}
+
With such solution we don't use the power of HBitmap, which provides
"hbitmap_iter_skip_words", with O(log(n)) complexity. Here we look
through the whole bitmap (O(n)), instead of jumping to the next dirty bit.
--
С уважением,
Владимир