From: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> Fix bitmap migration with dirty-bitmaps capability enabled and shared storage. We should ignore IN_USE bitmaps in the image on target, when migrating bitmaps through migration channel, see new comment below.
Fixes: 74da6b943565c451 Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> Message-id: 20191125125229.13531-2-vsement...@virtuozzo.com Reviewed-by: Max Reitz <mre...@redhat.com> Signed-off-by: Max Reitz <mre...@redhat.com> --- block/qcow2-bitmap.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index 809bbc5d20..8abaf632fc 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -988,7 +988,26 @@ bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp) } QSIMPLEQ_FOREACH(bm, bm_list, entry) { - BdrvDirtyBitmap *bitmap = load_bitmap(bs, bm, errp); + BdrvDirtyBitmap *bitmap; + + if ((bm->flags & BME_FLAG_IN_USE) && + bdrv_find_dirty_bitmap(bs, bm->name)) + { + /* + * We already have corresponding BdrvDirtyBitmap, and bitmap in the + * image is marked IN_USE. Firstly, this state is valid, no reason + * to consider existing BdrvDirtyBitmap to be bad. Secondly it's + * absolutely possible, when we do migration with shared storage + * with dirty-bitmaps capability enabled: if the bitmap was loaded + * from this storage before migration start, the storage will + * of-course contain IN_USE outdated version of the bitmap, and we + * should not load it on migration target, as we already have this + * bitmap, being migrated. + */ + continue; + } + + bitmap = load_bitmap(bs, bm, errp); if (bitmap == NULL) { goto fail; } -- 2.23.0