Commit 83a8c775 authored by Pavel Butsykin's avatar Pavel Butsykin Committed by Kevin Wolf
Browse files

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: default avatarPavel Butsykin <pbutsykin@virtuozzo.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 1e13e201
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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);
    }