diff --git a/block.c b/block.c index f1ef4b0109..7b306fb62f 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) { - bs->drv->bdrv_invalidate_cache(bs); + 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 cfe80befa0..b5b1e8c1b9 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 8802ad3845..837accd39b 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); }