qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Anthony Liguori <aliguori@amazon.com>
Subject: [Qemu-devel] [PULL 02/24] block: Update image size in bdrv_invalidate_cache()
Date: Wed, 12 Mar 2014 11:29:10 +0100	[thread overview]
Message-ID: <1394620172-25071-3-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1394620172-25071-1-git-send-email-stefanha@redhat.com>

From: Kevin Wolf <kwolf@redhat.com>

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>
---
 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

  parent reply	other threads:[~2014-03-12 10:29 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-12 10:29 [Qemu-devel] [PULL 00/24] Block patches for QEMU 2.0 Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 01/24] qcow2-refcount: Sanitize refcount table entry Stefan Hajnoczi
2014-03-12 10:29 ` Stefan Hajnoczi [this message]
2014-03-12 10:29 ` [Qemu-devel] [PULL 03/24] qcow2: Check bs->drv in copy_sectors() Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 04/24] block: bs->drv may be NULL in bdrv_debug_resume() Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 05/24] iotests: Test corruption during COW request Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 06/24] block: Rewrite the snapshot authorization mechanism for block filters Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 07/24] object: add object_get_canonical_path_component() Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 08/24] rfifolock: add recursive FIFO lock Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 09/24] aio: add aio_context_acquire() and aio_context_release() Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 10/24] iothread: add I/O thread object Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 11/24] qdev: make get_pointer() handle temporary strings Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 12/24] iothread: add "iothread" qdev property type Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 13/24] dataplane: replace internal thread with IOThread Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 14/24] iothread: stash thread ID away Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 15/24] qmp: add query-iothreads command Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 16/24] qcow2: Keep option in qcow2_invalidate_cache() Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 17/24] qcow2: Don't write with BDRV_O_INCOMING Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 18/24] block: Unlink temporary file Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 19/24] qemu-io: Fix warnings from static code analysis Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 20/24] block/raw-posix: bdrv_parse_filename() for hdev Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 21/24] block/raw-posix: bdrv_parse_filename() for floppy Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 22/24] block/raw-posix: bdrv_parse_filename() for cdrom Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 23/24] block/raw-posix: Strip protocol prefix on creation Stefan Hajnoczi
2014-03-12 10:29 ` [Qemu-devel] [PULL 24/24] block/raw-win32: bdrv_parse_filename() for hdev Stefan Hajnoczi
2014-03-12 15:48 ` [Qemu-devel] [PULL 00/24] Block patches for QEMU 2.0 Peter Maydell
2014-03-13 12:33   ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1394620172-25071-3-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=aliguori@amazon.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).