diff options
author | Pavel Butsykin <pbutsykin@virtuozzo.com> | 2017-09-04 13:18:00 +0300 |
---|---|---|
committer | Michael Roth <mdroth@linux.vnet.ibm.com> | 2017-09-14 19:29:40 -0500 |
commit | c6841b112e995a0635db59fe25da9a308c595b7a (patch) | |
tree | 5919fed2e5136de3535be2e1a8004411461d5393 | |
parent | 65a24b5c448710d1d2cf2ecdaea620793a9437e5 (diff) | |
download | qemu-c6841b112e995a0635db59fe25da9a308c595b7a.tar.gz |
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 <pbutsykin@virtuozzo.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
(cherry picked from commit 83a8c775a8bf134eb18a719322939b74a818d750)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
-rw-r--r-- | block/qcow2.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/block/qcow2.c b/block/qcow2.c index 40ba26c111..a756bf9541 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2053,6 +2053,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; @@ -2067,14 +2075,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); } |