diff options
author | Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | 2019-07-29 16:35:54 -0400 |
---|---|---|
committer | John Snow <jsnow@redhat.com> | 2019-08-16 16:28:02 -0400 |
commit | 2899f41eef2806cf8eb119811c9d6fcf15ce80f6 (patch) | |
tree | d47fe3f04ad7c4bb6c4b9d8b3e9468c607da0f6d /blockdev.c | |
parent | b30ffbef531bb851dd96f335de4788e90471234e (diff) |
blockdev: reduce aio_context locked sections in bitmap add/remove
Commit 0a6c86d024c52 returned these locks back to add/remove
functionality, to protect from intersection of persistent bitmap
related IO with other IO. But other bitmap-related functions called
here are unrelated to the problem, and there are no needs to keep these
calls inside critical sections.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-id: 20190708220502.12977-2-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
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); - } } /** |