[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 05/10] backup: use copy_bitmap in incremental backup
From: |
Jeff Cody |
Subject: |
[Qemu-devel] [PULL 05/10] backup: use copy_bitmap in incremental backup |
Date: |
Mon, 18 Dec 2017 16:08:14 -0500 |
From: Vladimir Sementsov-Ogievskiy <address@hidden>
We can use copy_bitmap instead of sync_bitmap. copy_bitmap is
initialized from sync_bitmap and it is more informative: we will not try
to process data, that is already in progress (by write notifier).
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: John Snow <address@hidden>
Reviewed-by: Jeff Cody <address@hidden>
Message-id: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
---
block/backup.c | 55 +++++++++++++++++--------------------------------------
1 file changed, 17 insertions(+), 38 deletions(-)
diff --git a/block/backup.c b/block/backup.c
index 8ee2200..4a16a37 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -362,49 +362,28 @@ static bool coroutine_fn yield_and_check(BackupBlockJob
*job)
static int coroutine_fn backup_run_incremental(BackupBlockJob *job)
{
+ int ret;
bool error_is_read;
- int ret = 0;
- int clusters_per_iter;
- uint32_t granularity;
- int64_t offset;
int64_t cluster;
- int64_t end;
- BdrvDirtyBitmapIter *dbi;
+ HBitmapIter hbi;
- granularity = bdrv_dirty_bitmap_granularity(job->sync_bitmap);
- clusters_per_iter = MAX((granularity / job->cluster_size), 1);
- dbi = bdrv_dirty_iter_new(job->sync_bitmap);
-
- /* Find the next dirty sector(s) */
- while ((offset = bdrv_dirty_iter_next(dbi)) >= 0) {
- cluster = offset / job->cluster_size;
-
- for (end = cluster + clusters_per_iter; cluster < end; cluster++) {
- do {
- if (yield_and_check(job)) {
- goto out;
- }
- ret = backup_do_cow(job, cluster * job->cluster_size,
- job->cluster_size, &error_is_read,
- false);
- if ((ret < 0) &&
- backup_error_action(job, error_is_read, -ret) ==
- BLOCK_ERROR_ACTION_REPORT) {
- goto out;
- }
- } while (ret < 0);
- }
-
- /* If the bitmap granularity is smaller than the backup granularity,
- * we need to advance the iterator pointer to the next cluster. */
- if (granularity < job->cluster_size) {
- bdrv_set_dirty_iter(dbi, cluster * job->cluster_size);
- }
+ hbitmap_iter_init(&hbi, job->copy_bitmap, 0);
+ while ((cluster = hbitmap_iter_next(&hbi)) != -1) {
+ do {
+ if (yield_and_check(job)) {
+ return 0;
+ }
+ ret = backup_do_cow(job, cluster * job->cluster_size,
+ job->cluster_size, &error_is_read, false);
+ if (ret < 0 && backup_error_action(job, error_is_read, -ret) ==
+ BLOCK_ERROR_ACTION_REPORT)
+ {
+ return ret;
+ }
+ } while (ret < 0);
}
-out:
- bdrv_dirty_iter_free(dbi);
- return ret;
+ return 0;
}
/* init copy_bitmap from sync_bitmap */
--
2.9.5
- [Qemu-devel] [PULL 00/10] Block patches, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 01/10] hbitmap: add next_zero function, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 02/10] backup: move from done_bitmap to copy_bitmap, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 03/10] backup: init copy_bitmap from sync_bitmap for incremental, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 04/10] backup: simplify non-dirty bits progress processing, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 05/10] backup: use copy_bitmap in incremental backup,
Jeff Cody <=
- [Qemu-devel] [PULL 06/10] blockjob: kick jobs on set-speed, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 07/10] block/sheepdog: remove spurious NULL check, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 09/10] block/curl: check error return of curl_global_init(), Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 08/10] block/sheepdog: code beautification, Jeff Cody, 2017/12/18
- [Qemu-devel] [PULL 10/10] block/curl: fix minor memory leaks, Jeff Cody, 2017/12/18
- Re: [Qemu-devel] [PULL 00/10] Block patches, Peter Maydell, 2017/12/19