On Wed, 04/20 00:59, Max Reitz wrote: > 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 <mre...@redhat.com> > --- > block/mirror.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/block/mirror.c b/block/mirror.c > index 2714a77..9df1fae 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -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++; > } > -- > 2.8.0 >
Reviewed-by: Fam Zheng <f...@redhat.com>