From: Pavel Butsykin Date: Mon, 4 Sep 2017 10:18:00 +0000 (+0300) Subject: qcow2: move qcow2_store_persistent_dirty_bitmaps() before cache flushing X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=83a8c775a8bf134eb18a719322939b74a818d750;p=qemu.git qcow2: move qcow2_store_persistent_dirty_bitmaps() before cache flushing After calling qcow2_inactivate(), all qcow2 caches must be flushed, but this may not happen, because the last call qcow2_store_persistent_dirty_bitmaps() can lead to marking l2/refcont cache as dirty. Let's move qcow2_store_persistent_dirty_bitmaps() before the caсhe flushing to fix it. Cc: qemu-stable@nongnu.org Signed-off-by: Pavel Butsykin Signed-off-by: Kevin Wolf --- diff --git a/block/qcow2.c b/block/qcow2.c index 2ec399663e..bae5893327 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2036,6 +2036,14 @@ static int qcow2_inactivate(BlockDriverState *bs) int ret, result = 0; Error *local_err = NULL; + qcow2_store_persistent_dirty_bitmaps(bs, &local_err); + if (local_err != NULL) { + result = -EINVAL; + error_report_err(local_err); + error_report("Persistent bitmaps are lost for node '%s'", + bdrv_get_device_or_node_name(bs)); + } + ret = qcow2_cache_flush(bs, s->l2_table_cache); if (ret) { result = ret; @@ -2050,14 +2058,6 @@ static int qcow2_inactivate(BlockDriverState *bs) strerror(-ret)); } - qcow2_store_persistent_dirty_bitmaps(bs, &local_err); - if (local_err != NULL) { - result = -EINVAL; - error_report_err(local_err); - error_report("Persistent bitmaps are lost for node '%s'", - bdrv_get_device_or_node_name(bs)); - } - if (result == 0) { qcow2_mark_clean(bs); }