]> xenbits.xensource.com Git - people/pauldu/qemu.git/commitdiff
block/mirror: Refresh stale bitmap iterator cache
authorMax Reitz <mreitz@redhat.com>
Tue, 19 Apr 2016 22:59:48 +0000 (00:59 +0200)
committerKevin Wolf <kwolf@redhat.com>
Wed, 20 Apr 2016 14:52:55 +0000 (16:52 +0200)
If the drive's dirty bitmap is dirtied while the mirror operation is
running, the cache of the iterator used by the mirror code may become
stale and not contain all dirty bits.

This only becomes an issue if we are looking for contiguously dirty
chunks on the drive. In that case, we can easily detect the discrepancy
and just refresh the iterator if one occurs.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
block/mirror.c

index 2714a77d69989a54d5e42210faf33ea5126c8f29..9df1fae5eafc582cac8b8462efc1803754e2b785 100644 (file)
@@ -334,6 +334,11 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
         }
 
         hbitmap_next = hbitmap_iter_next(&s->hbi);
+        if (hbitmap_next > next_sector || hbitmap_next < 0) {
+            /* The bitmap iterator's cache is stale, refresh it */
+            bdrv_set_dirty_iter(&s->hbi, next_sector);
+            hbitmap_next = hbitmap_iter_next(&s->hbi);
+        }
         assert(hbitmap_next == next_sector);
         nb_chunks++;
     }