Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
block/backup.c | 30 ++++++++++++++----------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/block/backup.c b/block/backup.c
index 900bbd3..b79a481 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -383,19 +383,24 @@ static inline int64_t backup_get_work(BackupBlockJob *job)
}
cluster = next_notif_cluster(job);
- if (cluster != -1) {
- return cluster;
- }
+ if (cluster == -1) {
+ if (block_job_should_pause(&job->common) ||
+ job->sync_mode == MIRROR_SYNC_MODE_NONE || check_delay(job))
+ {
+ return BACKUP_WORKER_PAUSE;
+ }
- if (block_job_should_pause(&job->common) ||
- job->sync_mode == MIRROR_SYNC_MODE_NONE || check_delay(job))
- {
- return BACKUP_WORKER_PAUSE;
+ cluster = hbitmap_iter_next(&job->linear_hbi);
+ if (cluster == -1) {
+ return BACKUP_WORKER_STOP;
+ }
}
- cluster = hbitmap_iter_next(&job->linear_hbi);
+ assert(hbitmap_get(job->copy_bitmap, cluster));
+ hbitmap_reset(job->copy_bitmap, cluster, 1);
+ set_bit(cluster, job->notif_wait_bitmap);
- return cluster == -1 ? BACKUP_WORKER_STOP : cluster;
+ return cluster;
}
static void coroutine_fn backup_worker_co(void *opaque)
@@ -583,13 +588,6 @@ static void coroutine_fn backup_do_cow(BackupBlockJob
*job, int64_t cluster)
trace_backup_do_cow_enter(job, qemu_coroutine_self(), cluster);
- if (!hbitmap_get(job->copy_bitmap, cluster)) {
- trace_backup_do_cow_skip(job, cluster);
- return; /* already copied */
- }
- hbitmap_reset(job->copy_bitmap, cluster, 1);
- set_bit(cluster, job->notif_wait_bitmap);
-
bounce_buffer = blk_blockalign(blk, job->cluster_size);
backup_copy_cluster(job, cluster, bounce_buffer);
qemu_vfree(bounce_buffer);
--
1.8.3.1