From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33497) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNJSV-0008UF-CA for qemu-devel@nongnu.org; Tue, 11 Mar 2014 05:58:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WNJSP-0000hb-CH for qemu-devel@nongnu.org; Tue, 11 Mar 2014 05:58:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48149) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WNJSP-0000hQ-5J for qemu-devel@nongnu.org; Tue, 11 Mar 2014 05:58:45 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2B9whus001634 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 11 Mar 2014 05:58:43 -0400 From: Kevin Wolf Date: Tue, 11 Mar 2014 10:58:39 +0100 Message-Id: <1394531919-14346-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH] block: Update image size in bdrv_invalidate_cache() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, stefanha@redhat.com, quintela@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 --- 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.1.4