387 lines
11 KiB
Diff
387 lines
11 KiB
Diff
From 7baea25be90e184175dd5a919ee5878cbd4970c2 Mon Sep 17 00:00:00 2001
|
|
From: Kevin Wolf <kwolf@redhat.com>
|
|
Date: Thu, 4 May 2023 13:57:33 +0200
|
|
Subject: [PATCH 52/56] block: bdrv/blk_co_unref() for calls in coroutine
|
|
context
|
|
|
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
RH-MergeRequest: 164: block: Fix hangs in qmp_block_resize()
|
|
RH-Bugzilla: 2185688
|
|
RH-Acked-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
|
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
|
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-Commit: [1/4] 8ebf8486b082c30ca1b39a6ede35e471eaaccfa3 (kmwolf/centos-qemu-kvm)
|
|
|
|
These functions must not be called in coroutine context, because they
|
|
need write access to the graph.
|
|
|
|
Cc: qemu-stable@nongnu.org
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Message-Id: <20230504115750.54437-4-kwolf@redhat.com>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
(cherry picked from commit b2ab5f545fa1eaaf2955dd617bee19a8b3279786)
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
---
|
|
block.c | 2 +-
|
|
block/crypto.c | 6 +++---
|
|
block/parallels.c | 6 +++---
|
|
block/qcow.c | 6 +++---
|
|
block/qcow2.c | 14 +++++++-------
|
|
block/qed.c | 6 +++---
|
|
block/vdi.c | 6 +++---
|
|
block/vhdx.c | 6 +++---
|
|
block/vmdk.c | 18 +++++++++---------
|
|
block/vpc.c | 6 +++---
|
|
include/block/block-global-state.h | 3 ++-
|
|
include/sysemu/block-backend-global-state.h | 5 ++++-
|
|
12 files changed, 44 insertions(+), 40 deletions(-)
|
|
|
|
diff --git a/block.c b/block.c
|
|
index d79a52ca74..a48112f945 100644
|
|
--- a/block.c
|
|
+++ b/block.c
|
|
@@ -680,7 +680,7 @@ int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
|
|
|
ret = 0;
|
|
out:
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/block/crypto.c b/block/crypto.c
|
|
index ca67289187..8fd3ad0054 100644
|
|
--- a/block/crypto.c
|
|
+++ b/block/crypto.c
|
|
@@ -355,7 +355,7 @@ block_crypto_co_create_generic(BlockDriverState *bs, int64_t size,
|
|
ret = 0;
|
|
cleanup:
|
|
qcrypto_block_free(crypto);
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
return ret;
|
|
}
|
|
|
|
@@ -661,7 +661,7 @@ block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
|
|
|
|
ret = 0;
|
|
fail:
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
return ret;
|
|
}
|
|
|
|
@@ -730,7 +730,7 @@ fail:
|
|
bdrv_co_delete_file_noerr(bs);
|
|
}
|
|
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_QCryptoBlockCreateOptions(create_opts);
|
|
qobject_unref(cryptoopts);
|
|
return ret;
|
|
diff --git a/block/parallels.c b/block/parallels.c
|
|
index 013684801a..b49c35929e 100644
|
|
--- a/block/parallels.c
|
|
+++ b/block/parallels.c
|
|
@@ -613,8 +613,8 @@ static int coroutine_fn parallels_co_create(BlockdevCreateOptions* opts,
|
|
|
|
ret = 0;
|
|
out:
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs);
|
|
return ret;
|
|
|
|
exit:
|
|
@@ -691,7 +691,7 @@ parallels_co_create_opts(BlockDriver *drv, const char *filename,
|
|
|
|
done:
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/block/qcow.c b/block/qcow.c
|
|
index 490e4f819e..a0c701f578 100644
|
|
--- a/block/qcow.c
|
|
+++ b/block/qcow.c
|
|
@@ -915,8 +915,8 @@ static int coroutine_fn qcow_co_create(BlockdevCreateOptions *opts,
|
|
g_free(tmp);
|
|
ret = 0;
|
|
exit:
|
|
- blk_unref(qcow_blk);
|
|
- bdrv_unref(bs);
|
|
+ blk_co_unref(qcow_blk);
|
|
+ bdrv_co_unref(bs);
|
|
qcrypto_block_free(crypto);
|
|
return ret;
|
|
}
|
|
@@ -1015,7 +1015,7 @@ qcow_co_create_opts(BlockDriver *drv, const char *filename,
|
|
fail:
|
|
g_free(backing_fmt);
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/block/qcow2.c b/block/qcow2.c
|
|
index 22084730f9..0b8beb8b47 100644
|
|
--- a/block/qcow2.c
|
|
+++ b/block/qcow2.c
|
|
@@ -3711,7 +3711,7 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
|
|
goto out;
|
|
}
|
|
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
blk = NULL;
|
|
|
|
/*
|
|
@@ -3791,7 +3791,7 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
|
|
}
|
|
}
|
|
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
blk = NULL;
|
|
|
|
/* Reopen the image without BDRV_O_NO_FLUSH to flush it before returning.
|
|
@@ -3816,9 +3816,9 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
|
|
|
|
ret = 0;
|
|
out:
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs);
|
|
- bdrv_unref(data_bs);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs);
|
|
+ bdrv_co_unref(data_bs);
|
|
return ret;
|
|
}
|
|
|
|
@@ -3949,8 +3949,8 @@ finish:
|
|
}
|
|
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
- bdrv_unref(data_bs);
|
|
+ bdrv_co_unref(bs);
|
|
+ bdrv_co_unref(data_bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/block/qed.c b/block/qed.c
|
|
index 0705a7b4e2..aff2a2076e 100644
|
|
--- a/block/qed.c
|
|
+++ b/block/qed.c
|
|
@@ -748,8 +748,8 @@ static int coroutine_fn bdrv_qed_co_create(BlockdevCreateOptions *opts,
|
|
ret = 0; /* success */
|
|
out:
|
|
g_free(l1_table);
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs);
|
|
return ret;
|
|
}
|
|
|
|
@@ -819,7 +819,7 @@ bdrv_qed_co_create_opts(BlockDriver *drv, const char *filename,
|
|
|
|
fail:
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/block/vdi.c b/block/vdi.c
|
|
index f2434d6153..08331d2dd7 100644
|
|
--- a/block/vdi.c
|
|
+++ b/block/vdi.c
|
|
@@ -886,8 +886,8 @@ static int coroutine_fn vdi_co_do_create(BlockdevCreateOptions *create_options,
|
|
|
|
ret = 0;
|
|
exit:
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs_file);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs_file);
|
|
g_free(bmap);
|
|
return ret;
|
|
}
|
|
@@ -975,7 +975,7 @@ vdi_co_create_opts(BlockDriver *drv, const char *filename,
|
|
done:
|
|
qobject_unref(qdict);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
- bdrv_unref(bs_file);
|
|
+ bdrv_co_unref(bs_file);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/block/vhdx.c b/block/vhdx.c
|
|
index 81420722a1..00777da91a 100644
|
|
--- a/block/vhdx.c
|
|
+++ b/block/vhdx.c
|
|
@@ -2053,8 +2053,8 @@ static int coroutine_fn vhdx_co_create(BlockdevCreateOptions *opts,
|
|
|
|
ret = 0;
|
|
delete_and_exit:
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs);
|
|
g_free(creator);
|
|
return ret;
|
|
}
|
|
@@ -2144,7 +2144,7 @@ vhdx_co_create_opts(BlockDriver *drv, const char *filename,
|
|
|
|
fail:
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/block/vmdk.c b/block/vmdk.c
|
|
index f5f49018fe..01ca13c82b 100644
|
|
--- a/block/vmdk.c
|
|
+++ b/block/vmdk.c
|
|
@@ -2306,7 +2306,7 @@ exit:
|
|
if (pbb) {
|
|
*pbb = blk;
|
|
} else {
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
blk = NULL;
|
|
}
|
|
}
|
|
@@ -2516,12 +2516,12 @@ vmdk_co_do_create(int64_t size,
|
|
if (strcmp(blk_bs(backing)->drv->format_name, "vmdk")) {
|
|
error_setg(errp, "Invalid backing file format: %s. Must be vmdk",
|
|
blk_bs(backing)->drv->format_name);
|
|
- blk_unref(backing);
|
|
+ blk_co_unref(backing);
|
|
ret = -EINVAL;
|
|
goto exit;
|
|
}
|
|
ret = vmdk_read_cid(blk_bs(backing), 0, &parent_cid);
|
|
- blk_unref(backing);
|
|
+ blk_co_unref(backing);
|
|
if (ret) {
|
|
error_setg(errp, "Failed to read parent CID");
|
|
goto exit;
|
|
@@ -2542,14 +2542,14 @@ vmdk_co_do_create(int64_t size,
|
|
blk_bs(extent_blk)->filename);
|
|
created_size += cur_size;
|
|
extent_idx++;
|
|
- blk_unref(extent_blk);
|
|
+ blk_co_unref(extent_blk);
|
|
}
|
|
|
|
/* Check whether we got excess extents */
|
|
extent_blk = extent_fn(-1, extent_idx, flat, split, compress, zeroed_grain,
|
|
opaque, NULL);
|
|
if (extent_blk) {
|
|
- blk_unref(extent_blk);
|
|
+ blk_co_unref(extent_blk);
|
|
error_setg(errp, "List of extents contains unused extents");
|
|
ret = -EINVAL;
|
|
goto exit;
|
|
@@ -2590,7 +2590,7 @@ vmdk_co_do_create(int64_t size,
|
|
ret = 0;
|
|
exit:
|
|
if (blk) {
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
}
|
|
g_free(desc);
|
|
g_free(parent_desc_line);
|
|
@@ -2641,7 +2641,7 @@ vmdk_co_create_opts_cb(int64_t size, int idx, bool flat, bool split,
|
|
errp)) {
|
|
goto exit;
|
|
}
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
exit:
|
|
g_free(ext_filename);
|
|
return blk;
|
|
@@ -2797,12 +2797,12 @@ static BlockBackend * coroutine_fn vmdk_co_create_cb(int64_t size, int idx,
|
|
return NULL;
|
|
}
|
|
blk_set_allow_write_beyond_eof(blk, true);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
|
|
if (size != -1) {
|
|
ret = vmdk_init_extent(blk, size, flat, compress, zeroed_grain, errp);
|
|
if (ret) {
|
|
- blk_unref(blk);
|
|
+ blk_co_unref(blk);
|
|
blk = NULL;
|
|
}
|
|
}
|
|
diff --git a/block/vpc.c b/block/vpc.c
|
|
index b89b0ff8e2..07ddda5b99 100644
|
|
--- a/block/vpc.c
|
|
+++ b/block/vpc.c
|
|
@@ -1082,8 +1082,8 @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
|
|
}
|
|
|
|
out:
|
|
- blk_unref(blk);
|
|
- bdrv_unref(bs);
|
|
+ blk_co_unref(blk);
|
|
+ bdrv_co_unref(bs);
|
|
return ret;
|
|
}
|
|
|
|
@@ -1162,7 +1162,7 @@ vpc_co_create_opts(BlockDriver *drv, const char *filename,
|
|
|
|
fail:
|
|
qobject_unref(qdict);
|
|
- bdrv_unref(bs);
|
|
+ bdrv_co_unref(bs);
|
|
qapi_free_BlockdevCreateOptions(create_options);
|
|
return ret;
|
|
}
|
|
diff --git a/include/block/block-global-state.h b/include/block/block-global-state.h
|
|
index 399200a9a3..cd4ea554bf 100644
|
|
--- a/include/block/block-global-state.h
|
|
+++ b/include/block/block-global-state.h
|
|
@@ -214,7 +214,8 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
|
bool quiet, Error **errp);
|
|
|
|
void bdrv_ref(BlockDriverState *bs);
|
|
-void bdrv_unref(BlockDriverState *bs);
|
|
+void no_coroutine_fn bdrv_unref(BlockDriverState *bs);
|
|
+void coroutine_fn no_co_wrapper bdrv_co_unref(BlockDriverState *bs);
|
|
void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child);
|
|
BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
|
|
BlockDriverState *child_bs,
|
|
diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/block-backend-global-state.h
|
|
index 2b6d27db7c..fa83f9389c 100644
|
|
--- a/include/sysemu/block-backend-global-state.h
|
|
+++ b/include/sysemu/block-backend-global-state.h
|
|
@@ -42,7 +42,10 @@ blk_co_new_open(const char *filename, const char *reference, QDict *options,
|
|
|
|
int blk_get_refcnt(BlockBackend *blk);
|
|
void blk_ref(BlockBackend *blk);
|
|
-void blk_unref(BlockBackend *blk);
|
|
+
|
|
+void no_coroutine_fn blk_unref(BlockBackend *blk);
|
|
+void coroutine_fn no_co_wrapper blk_co_unref(BlockBackend *blk);
|
|
+
|
|
void blk_remove_all_bs(void);
|
|
BlockBackend *blk_by_name(const char *name);
|
|
BlockBackend *blk_next(BlockBackend *blk);
|
|
--
|
|
2.39.1
|
|
|