block: Update image size in bdrv_invalidate_cache()

After migration has completed, we call bdrv_invalidate_cache() so that
drivers which cache some data drop their stale copy of the data and
reread it from the image file to get a new version of data that the
source modified while the migration was running.

Reloading metadata from the image file is useless, though, if the size
of the image file stays stale (this is a value that is cached for all
image formats in block.c). Reads from (meta)data after the old EOF
return only zeroes, causing image corruption.

We need to update bs->total_sectors in all layers that could potentially
have changed their size (i.e. backing files are not a concern - if they
are changed, we're in bigger trouble)

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
stable-2.0
Kevin Wolf 2014-03-11 10:58:39 +01:00 committed by Stefan Hajnoczi
parent 26d49c4675
commit 3456a8d185
3 changed files with 15 additions and 2 deletions

12
block.c
View File

@ -4776,9 +4776,17 @@ flush_parent:
void bdrv_invalidate_cache(BlockDriverState *bs)
{
if (bs->drv && bs->drv->bdrv_invalidate_cache) {
bs->drv->bdrv_invalidate_cache(bs);
if (!bs->drv) {
return;
}
if (bs->drv->bdrv_invalidate_cache) {
bs->drv->bdrv_invalidate_cache(bs);
} else if (bs->file) {
bdrv_invalidate_cache(bs->file);
}
refresh_total_sectors(bs, bs->total_sectors);
}
void bdrv_invalidate_cache_all(void)

View File

@ -1176,6 +1176,8 @@ static void qcow2_invalidate_cache(BlockDriverState *bs)
qcow2_close(bs);
bdrv_invalidate_cache(bs->file);
options = qdict_new();
qdict_put(options, QCOW2_OPT_LAZY_REFCOUNTS,
qbool_from_int(s->use_lazy_refcounts));

View File

@ -1563,6 +1563,9 @@ static void bdrv_qed_invalidate_cache(BlockDriverState *bs)
BDRVQEDState *s = bs->opaque;
bdrv_qed_close(bs);
bdrv_invalidate_cache(bs->file);
memset(s, 0, sizeof(BDRVQEDState));
bdrv_qed_open(bs, NULL, bs->open_flags, NULL);
}