Skip to content

Commit

Permalink
qcow2: fix bitmaps loading when bitmaps already exist
Browse files Browse the repository at this point in the history
On reopen with existing bitmaps, instead of loading bitmaps, lets
reopen them if needed. This also fixes bitmaps migration through
shared storage.
Consider the case. Persistent bitmaps are stored on bdrv_inactivate.
Then, on destination process_incoming_migration_bh() calls
bdrv_invalidate_cache_all() which leads to
qcow2_load_autoloading_dirty_bitmaps() which fails if bitmaps are
already loaded on destination start.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-id: 20180320170521.32152-3-vsementsov@virtuozzo.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and XanClic committed Mar 26, 2018
1 parent b1336cc commit 2d949df
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion block/qcow2.c
Expand Up @@ -1480,7 +1480,22 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
s->autoclear_features &= QCOW2_AUTOCLEAR_MASK;
}

if (qcow2_load_dirty_bitmaps(bs, &local_err)) {
if (bdrv_dirty_bitmap_next(bs, NULL)) {
/* It's some kind of reopen with already existing dirty bitmaps. There
* are no known cases where we need loading bitmaps in such situation,
* so it's safer don't load them.
*
* Moreover, if we have some readonly bitmaps and we are reopening for
* rw we should reopen bitmaps correspondingly.
*/
if (bdrv_has_readonly_bitmaps(bs) &&
!bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE))
{
bool header_updated = false;
qcow2_reopen_bitmaps_rw_hint(bs, &header_updated, &local_err);
update_header = update_header && !header_updated;
}
} else if (qcow2_load_dirty_bitmaps(bs, &local_err)) {
update_header = false;
}
if (local_err != NULL) {
Expand Down

0 comments on commit 2d949df

Please sign in to comment.