block: allow migration to work with image files (v3)
Image files have two types of data: immutable data that describes things like image size, backing files, etc. and mutable data that includes offset and reference count tables. Today, image formats aggressively cache mutable data to improve performance. In some cases, this happens before a guest even starts. When dealing with live migration, since a file is open on two machines, the caching of meta data can lead to data corruption. This patch addresses this by introducing a mechanism to invalidate any cached mutable data a block driver may have which is then used by the live migration code. NB, this still requires coherent shared storage. Addressing migration without coherent shared storage (i.e. NFS) requires additional work. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
38e0735eb7
commit
0f15423c32
16
block.c
16
block.c
@ -2839,6 +2839,22 @@ int coroutine_fn bdrv_co_flush(BlockDriverState *bs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bdrv_invalidate_cache(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
if (bs->drv && bs->drv->bdrv_invalidate_cache) {
|
||||||
|
bs->drv->bdrv_invalidate_cache(bs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bdrv_invalidate_cache_all(void)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(bs, &bdrv_states, list) {
|
||||||
|
bdrv_invalidate_cache(bs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int bdrv_flush(BlockDriverState *bs)
|
int bdrv_flush(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
Coroutine *co;
|
Coroutine *co;
|
||||||
|
4
block.h
4
block.h
@ -197,6 +197,10 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
|
|||||||
unsigned long int req, void *buf,
|
unsigned long int req, void *buf,
|
||||||
BlockDriverCompletionFunc *cb, void *opaque);
|
BlockDriverCompletionFunc *cb, void *opaque);
|
||||||
|
|
||||||
|
/* Invalidate any cached metadata used by image formats */
|
||||||
|
void bdrv_invalidate_cache(BlockDriverState *bs);
|
||||||
|
void bdrv_invalidate_cache_all(void);
|
||||||
|
|
||||||
/* Ensure contents are flushed to disk. */
|
/* Ensure contents are flushed to disk. */
|
||||||
int bdrv_flush(BlockDriverState *bs);
|
int bdrv_flush(BlockDriverState *bs);
|
||||||
int coroutine_fn bdrv_co_flush(BlockDriverState *bs);
|
int coroutine_fn bdrv_co_flush(BlockDriverState *bs);
|
||||||
|
@ -87,6 +87,11 @@ struct BlockDriver {
|
|||||||
int coroutine_fn (*bdrv_co_discard)(BlockDriverState *bs,
|
int coroutine_fn (*bdrv_co_discard)(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors);
|
int64_t sector_num, int nb_sectors);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Invalidate any cached meta-data.
|
||||||
|
*/
|
||||||
|
void (*bdrv_invalidate_cache)(BlockDriverState *bs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flushes all data that was already written to the OS all the way down to
|
* Flushes all data that was already written to the OS all the way down to
|
||||||
* the disk (for example raw-posix calls fsync()).
|
* the disk (for example raw-posix calls fsync()).
|
||||||
|
@ -89,6 +89,9 @@ void process_incoming_migration(QEMUFile *f)
|
|||||||
qemu_announce_self();
|
qemu_announce_self();
|
||||||
DPRINTF("successfully loaded vm state\n");
|
DPRINTF("successfully loaded vm state\n");
|
||||||
|
|
||||||
|
/* Make sure all file formats flush their mutable metadata */
|
||||||
|
bdrv_invalidate_cache_all();
|
||||||
|
|
||||||
if (autostart) {
|
if (autostart) {
|
||||||
vm_start();
|
vm_start();
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user