What qcow2_invalidate_cache() should do is closing the image with BDRV_O_INCOMING set and reopening it with the flag cleared. In fact, it used to do exactly the opposite: qcow2_close() relied on bs->open_flags, which is already updated to have cleared BDRV_O_INCOMING at this point, whereas qcow2_open() was called with s->flags, which has the flag still set. Fix this.
Signed-off-by: Kevin Wolf <kw...@redhat.com> --- block/qcow2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/qcow2.c b/block/qcow2.c index 2cba276..de50b80 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1718,7 +1718,7 @@ static void qcow2_close(BlockDriverState *bs) /* else pre-write overlap checks in cache_destroy may crash */ s->l1_table = NULL; - if (!(bs->open_flags & BDRV_O_INCOMING)) { + if (!(s->flags & BDRV_O_INCOMING)) { qcow2_inactivate(bs); } @@ -1769,6 +1769,7 @@ static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp) memset(s, 0, sizeof(BDRVQcow2State)); options = qdict_clone_shallow(bs->options); + flags &= ~BDRV_O_INCOMING; ret = qcow2_open(bs, options, flags, &local_err); QDECREF(options); if (local_err) { -- 1.8.3.1