summary refs log tree commit diff stats
path: root/blockdev.c
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2022-12-07 14:18:30 +0100
committerKevin Wolf <kwolf@redhat.com>2022-12-15 16:08:23 +0100
commite13550558840422f980a0a71efe52ee83f37933d (patch)
tree4cf1f58f36d862ffb20da02e948f85aa7b5bf64f /blockdev.c
parent617f3a963589dbd54fe1f323eeac36411b352a0e (diff)
downloadfocaccia-qemu-e13550558840422f980a0a71efe52ee83f37933d.tar.gz
focaccia-qemu-e13550558840422f980a0a71efe52ee83f37933d.zip
block: Fix locking in external_snapshot_prepare()
bdrv_img_create() polls internally (when calling bdrv_create(), which is
a co_wrapper), so it can't be called while holding the lock of any
AioContext except the current one without causing deadlocks. Drop the
lock around the call in external_snapshot_prepare().

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20221207131838.239125-11-kwolf@redhat.com>
Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.c')
-rw-r--r--blockdev.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/blockdev.c b/blockdev.c
index d2f80b0386..ebf952cd21 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1507,10 +1507,14 @@ static void external_snapshot_prepare(BlkActionState *common,
                 goto out;
             }
             bdrv_refresh_filename(state->old_bs);
+
+            aio_context_release(aio_context);
             bdrv_img_create(new_image_file, format,
                             state->old_bs->filename,
                             state->old_bs->drv->format_name,
                             NULL, size, flags, false, &local_err);
+            aio_context_acquire(aio_context);
+
             if (local_err) {
                 error_propagate(errp, local_err);
                 goto out;