diff options
author | Kevin Wolf <kwolf@redhat.com> | 2015-12-22 16:04:57 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2016-01-20 13:36:23 +0100 |
commit | ec6d891224f708b2cda2a1edf68ffc0ff1316fca (patch) | |
tree | 94b6d9d9aef27bccda744a04ce0dc58bb7e786f5 | |
parent | 76b1c7fe1cbc45f46b2cccd471369ccd4b49b6fd (diff) | |
download | qemu-ec6d891224f708b2cda2a1edf68ffc0ff1316fca.tar.gz qemu-ec6d891224f708b2cda2a1edf68ffc0ff1316fca.tar.bz2 qemu-ec6d891224f708b2cda2a1edf68ffc0ff1316fca.zip |
qcow2: Implement .bdrv_inactivate
The callback has to ensure that closing or flushing the image afterwards
wouldn't cause a write access to the image files. This means that just
the caches have to be written out, which is part of the existing
.bdrv_close implementation.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
-rw-r--r-- | block/qcow2.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/block/qcow2.c b/block/qcow2.c index 340ae8f8a3..bfc80ea2ff 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1686,6 +1686,32 @@ fail: return ret; } +static int qcow2_inactivate(BlockDriverState *bs) +{ + BDRVQcow2State *s = bs->opaque; + int ret, result = 0; + + ret = qcow2_cache_flush(bs, s->l2_table_cache); + if (ret) { + result = ret; + error_report("Failed to flush the L2 table cache: %s", + strerror(-ret)); + } + + ret = qcow2_cache_flush(bs, s->refcount_block_cache); + if (ret) { + result = ret; + error_report("Failed to flush the refcount block cache: %s", + strerror(-ret)); + } + + if (result == 0) { + qcow2_mark_clean(bs); + } + + return result; +} + static void qcow2_close(BlockDriverState *bs) { BDRVQcow2State *s = bs->opaque; @@ -1694,23 +1720,7 @@ static void qcow2_close(BlockDriverState *bs) s->l1_table = NULL; if (!(bs->open_flags & BDRV_O_INACTIVE)) { - int ret1, ret2; - - ret1 = qcow2_cache_flush(bs, s->l2_table_cache); - ret2 = qcow2_cache_flush(bs, s->refcount_block_cache); - - if (ret1) { - error_report("Failed to flush the L2 table cache: %s", - strerror(-ret1)); - } - if (ret2) { - error_report("Failed to flush the refcount block cache: %s", - strerror(-ret2)); - } - - if (!ret1 && !ret2) { - qcow2_mark_clean(bs); - } + qcow2_inactivate(bs); } cache_clean_timer_del(bs); @@ -3340,6 +3350,7 @@ BlockDriver bdrv_qcow2 = { .bdrv_refresh_limits = qcow2_refresh_limits, .bdrv_invalidate_cache = qcow2_invalidate_cache, + .bdrv_inactivate = qcow2_inactivate, .create_opts = &qcow2_create_opts, .bdrv_check = qcow2_check, |