Message ID | 20231031135431.393137-4-f.ebner@proxmox.com |
---|---|
State | New |
Headers | show |
Series | mirror: allow switching from background to active mode | expand |
On Tue, Oct 31, 2023 at 02:54:24PM +0100, Fiona Ebner wrote: > In preparation to allow switching to active mode without draining. > Initialization of the bitmap in mirror_dirty_init() still happens with > the original/backing BlockDriverState, which should be fine, because > the mirror top has the same length. > > Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> > Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> > --- > > Changes in v4: > * Also set actively_synced to false when setting the bitmap in > bdrv_mirror_top_do_write. > > block/mirror.c | 17 +++++++++++++---- > 1 file changed, 13 insertions(+), 4 deletions(-) > Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/block/mirror.c b/block/mirror.c index 1c2c00ee1d..914d723446 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1500,6 +1500,11 @@ bdrv_mirror_top_do_write(BlockDriverState *bs, MirrorMethod method, abort(); } + if (!copy_to_target && s->job && s->job->dirty_bitmap) { + s->job->actively_synced = false; + bdrv_set_dirty_bitmap(s->job->dirty_bitmap, offset, bytes); + } + if (ret < 0) { goto out; } @@ -1823,13 +1828,17 @@ static BlockJob *mirror_start_job( s->should_complete = true; } - s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp); + s->dirty_bitmap = bdrv_create_dirty_bitmap(s->mirror_top_bs, granularity, + NULL, errp); if (!s->dirty_bitmap) { goto fail; } - if (s->copy_mode == MIRROR_COPY_MODE_WRITE_BLOCKING) { - bdrv_disable_dirty_bitmap(s->dirty_bitmap); - } + + /* + * The dirty bitmap is set by bdrv_mirror_top_do_write() when not in active + * mode. + */ + bdrv_disable_dirty_bitmap(s->dirty_bitmap); ret = block_job_add_bdrv(&s->common, "source", bs, 0, BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE |
In preparation to allow switching to active mode without draining. Initialization of the bitmap in mirror_dirty_init() still happens with the original/backing BlockDriverState, which should be fine, because the mirror top has the same length. Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> --- Changes in v4: * Also set actively_synced to false when setting the bitmap in bdrv_mirror_top_do_write. block/mirror.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)