mirror of https://github.com/xemu-project/xemu.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 <pbutsykin@virtuozzo.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
1e13e2015b
commit
83a8c775a8
|
@ -2036,6 +2036,14 @@ static int qcow2_inactivate(BlockDriverState *bs)
|
||||||
int ret, result = 0;
|
int ret, result = 0;
|
||||||
Error *local_err = NULL;
|
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);
|
ret = qcow2_cache_flush(bs, s->l2_table_cache);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
result = ret;
|
result = ret;
|
||||||
|
@ -2050,14 +2058,6 @@ static int qcow2_inactivate(BlockDriverState *bs)
|
||||||
strerror(-ret));
|
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) {
|
if (result == 0) {
|
||||||
qcow2_mark_clean(bs);
|
qcow2_mark_clean(bs);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue