Skip to content

Commit

Permalink
block: allow migration to work with image files (v3)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Anthony Liguori committed Nov 21, 2011
1 parent 38e0735 commit 0f15423
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 0 deletions.
16 changes: 16 additions & 0 deletions block.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Coroutine *co;
Expand Down
4 changes: 4 additions & 0 deletions block.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
unsigned long int req, void *buf,
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. */
int bdrv_flush(BlockDriverState *bs);
int coroutine_fn bdrv_co_flush(BlockDriverState *bs);
Expand Down
5 changes: 5 additions & 0 deletions block_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ struct BlockDriver {
int coroutine_fn (*bdrv_co_discard)(BlockDriverState *bs,
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
* the disk (for example raw-posix calls fsync()).
Expand Down
3 changes: 3 additions & 0 deletions migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ void process_incoming_migration(QEMUFile *f)
qemu_announce_self();
DPRINTF("successfully loaded vm state\n");

/* Make sure all file formats flush their mutable metadata */
bdrv_invalidate_cache_all();

if (autostart) {
vm_start();
} else {
Expand Down

0 comments on commit 0f15423

Please sign in to comment.