@@ -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.

--
С уважением,
Владимир

Reply via email to