diff options
Diffstat (limited to 'blockdev.c')
-rw-r--r-- | blockdev.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/blockdev.c b/blockdev.c index a44ab1f709..bcd766a1a2 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2813,7 +2813,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name, { BlockDriverState *bs; BdrvDirtyBitmap *bitmap; - AioContext *aio_context = NULL; if (!name || name[0] == '\0') { error_setg(errp, "Bitmap name cannot be empty"); @@ -2849,16 +2848,20 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name, } if (persistent) { - aio_context = bdrv_get_aio_context(bs); + AioContext *aio_context = bdrv_get_aio_context(bs); + bool ok; + aio_context_acquire(aio_context); - if (!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) { - goto out; + ok = bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp); + aio_context_release(aio_context); + if (!ok) { + return; } } bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp); if (bitmap == NULL) { - goto out; + return; } if (disabled) { @@ -2866,10 +2869,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name, } bdrv_dirty_bitmap_set_persistence(bitmap, persistent); - out: - if (aio_context) { - aio_context_release(aio_context); - } } void qmp_block_dirty_bitmap_remove(const char *node, const char *name, @@ -2877,8 +2876,6 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name, { BlockDriverState *bs; BdrvDirtyBitmap *bitmap; - Error *local_err = NULL; - AioContext *aio_context = NULL; bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp); if (!bitmap || !bs) { @@ -2891,20 +2888,19 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name, } if (bdrv_dirty_bitmap_get_persistence(bitmap)) { - aio_context = bdrv_get_aio_context(bs); + AioContext *aio_context = bdrv_get_aio_context(bs); + Error *local_err = NULL; + aio_context_acquire(aio_context); bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err); + aio_context_release(aio_context); if (local_err != NULL) { error_propagate(errp, local_err); - goto out; + return; } } bdrv_release_dirty_bitmap(bs, bitmap); - out: - if (aio_context) { - aio_context_release(aio_context); - } } /** |