[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 03/10] backup: init copy_bitmap from sync_bitmap for
From: |
Jeff Cody |
Subject: |
[Qemu-block] [PULL 03/10] backup: init copy_bitmap from sync_bitmap for incremental |
Date: |
Mon, 18 Dec 2017 16:08:12 -0500 |
From: Vladimir Sementsov-Ogievskiy <address@hidden>
We should not copy non-dirty clusters in write notifiers. So,
initialize copy_bitmap from sync_bitmap.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: John Snow <address@hidden>
Reviewed-by: Jeff Cody <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Message-id: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
---
block/backup.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/block/backup.c b/block/backup.c
index 5175808..b8901ea 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -422,6 +422,43 @@ out:
return ret;
}
+/* init copy_bitmap from sync_bitmap */
+static void backup_incremental_init_copy_bitmap(BackupBlockJob *job)
+{
+ BdrvDirtyBitmapIter *dbi;
+ int64_t offset;
+ int64_t end = DIV_ROUND_UP(bdrv_dirty_bitmap_size(job->sync_bitmap),
+ job->cluster_size);
+
+ dbi = bdrv_dirty_iter_new(job->sync_bitmap);
+ while ((offset = bdrv_dirty_iter_next(dbi)) != -1) {
+ int64_t cluster = offset / job->cluster_size;
+ int64_t next_cluster;
+
+ offset += bdrv_dirty_bitmap_granularity(job->sync_bitmap);
+ if (offset >= bdrv_dirty_bitmap_size(job->sync_bitmap)) {
+ hbitmap_set(job->copy_bitmap, cluster, end - cluster);
+ break;
+ }
+
+ offset = bdrv_dirty_bitmap_next_zero(job->sync_bitmap, offset);
+ if (offset == -1) {
+ hbitmap_set(job->copy_bitmap, cluster, end - cluster);
+ break;
+ }
+
+ next_cluster = DIV_ROUND_UP(offset, job->cluster_size);
+ hbitmap_set(job->copy_bitmap, cluster, next_cluster - cluster);
+ if (next_cluster >= end) {
+ break;
+ }
+
+ bdrv_set_dirty_iter(dbi, next_cluster * job->cluster_size);
+ }
+
+ bdrv_dirty_iter_free(dbi);
+}
+
static void coroutine_fn backup_run(void *opaque)
{
BackupBlockJob *job = opaque;
@@ -435,7 +472,12 @@ static void coroutine_fn backup_run(void *opaque)
nb_clusters = DIV_ROUND_UP(job->common.len, job->cluster_size);
job->copy_bitmap = hbitmap_alloc(nb_clusters, 0);
- hbitmap_set(job->copy_bitmap, 0, nb_clusters);
+ if (job->sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
+ backup_incremental_init_copy_bitmap(job);
+ } else {
+ hbitmap_set(job->copy_bitmap, 0, nb_clusters);
+ }
+
job->before_write.notify = backup_before_write_notify;
bdrv_add_before_write_notifier(bs, &job->before_write);
--
2.9.5
- [Qemu-block] [PULL 00/10] Block patches, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 01/10] hbitmap: add next_zero function, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 02/10] backup: move from done_bitmap to copy_bitmap, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 03/10] backup: init copy_bitmap from sync_bitmap for incremental,
Jeff Cody <=
- [Qemu-block] [PULL 04/10] backup: simplify non-dirty bits progress processing, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 05/10] backup: use copy_bitmap in incremental backup, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 06/10] blockjob: kick jobs on set-speed, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 07/10] block/sheepdog: remove spurious NULL check, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 08/10] block/sheepdog: code beautification, Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 09/10] block/curl: check error return of curl_global_init(), Jeff Cody, 2017/12/18
- [Qemu-block] [PULL 10/10] block/curl: fix minor memory leaks, Jeff Cody, 2017/12/18
- Re: [Qemu-block] [PULL 00/10] Block patches, Peter Maydell, 2017/12/19