[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 for-2.0 02/24] block: Update image size in bdrv_in
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 for-2.0 02/24] block: Update image size in bdrv_invalidate_cache() |
Date: |
Thu, 13 Mar 2014 15:10:46 +0100 |
From: Kevin Wolf <address@hidden>
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 <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
block.c | 10 +++++++++-
block/qcow2.c | 2 ++
block/qed.c | 3 +++
3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/block.c b/block.c
index f1ef4b0..7b306fb 100644
--- a/block.c
+++ b/block.c
@@ -4776,9 +4776,17 @@ flush_parent:
void bdrv_invalidate_cache(BlockDriverState *bs)
{
- if (bs->drv && bs->drv->bdrv_invalidate_cache) {
+ 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)
diff --git a/block/qcow2.c b/block/qcow2.c
index cfe80be..b5b1e8c 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -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));
diff --git a/block/qed.c b/block/qed.c
index 8802ad3..837accd 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -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);
}
--
1.8.5.3
- [Qemu-devel] [PULL v2 for-2.0 00/24] Block patches, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 01/24] qcow2-refcount: Sanitize refcount table entry, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 02/24] block: Update image size in bdrv_invalidate_cache(),
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 for-2.0 03/24] qcow2: Check bs->drv in copy_sectors(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 05/24] iotests: Test corruption during COW request, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 07/24] object: add object_get_canonical_path_component(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 08/24] rfifolock: add recursive FIFO lock, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 09/24] aio: add aio_context_acquire() and aio_context_release(), Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 06/24] block: Rewrite the snapshot authorization mechanism for block filters., Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 10/24] iothread: add I/O thread object, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 11/24] qdev: make get_pointer() handle temporary strings, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 12/24] iothread: add "iothread" qdev property type, Stefan Hajnoczi, 2014/03/13
- [Qemu-devel] [PULL v2 for-2.0 15/24] qmp: add query-iothreads command, Stefan Hajnoczi, 2014/03/13