mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
block: Call .bdrv_co_create(_opts) unlocked
These are functions that modify the graph, so they must be able to take
a writer lock. This is impossible if they already hold the reader lock.
If they need a reader lock for some of their operations, they should
take it internally.
Many of them go through blk_*(), which will always take the lock itself.
Direct calls of bdrv_*() need to take the reader lock. Note that while
locking for bdrv_co_*() calls is checked by TSA, this is not the case
for the mixed_coroutine_fns bdrv_*(). Holding the lock is still required
when they are called from coroutine context like here!
This effectively reverts 4ec8df0183
, but adds some internal locking
instead.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20230510203601.418015-2-kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
41f8b63339
commit
4db7ba3b87
14 changed files with 78 additions and 70 deletions
|
@ -99,12 +99,10 @@ struct BlockCryptoCreateData {
|
|||
};
|
||||
|
||||
|
||||
static int block_crypto_create_write_func(QCryptoBlock *block,
|
||||
size_t offset,
|
||||
const uint8_t *buf,
|
||||
size_t buflen,
|
||||
void *opaque,
|
||||
Error **errp)
|
||||
static int coroutine_fn GRAPH_UNLOCKED
|
||||
block_crypto_create_write_func(QCryptoBlock *block, size_t offset,
|
||||
const uint8_t *buf, size_t buflen, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
struct BlockCryptoCreateData *data = opaque;
|
||||
ssize_t ret;
|
||||
|
@ -117,10 +115,9 @@ static int block_crypto_create_write_func(QCryptoBlock *block,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int block_crypto_create_init_func(QCryptoBlock *block,
|
||||
size_t headerlen,
|
||||
void *opaque,
|
||||
Error **errp)
|
||||
static int coroutine_fn GRAPH_UNLOCKED
|
||||
block_crypto_create_init_func(QCryptoBlock *block, size_t headerlen,
|
||||
void *opaque, Error **errp)
|
||||
{
|
||||
struct BlockCryptoCreateData *data = opaque;
|
||||
Error *local_error = NULL;
|
||||
|
@ -314,7 +311,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
|
|||
}
|
||||
|
||||
|
||||
static int coroutine_fn
|
||||
static int coroutine_fn GRAPH_UNLOCKED
|
||||
block_crypto_co_create_generic(BlockDriverState *bs, int64_t size,
|
||||
QCryptoBlockCreateOptions *opts,
|
||||
PreallocMode prealloc, Error **errp)
|
||||
|
@ -627,7 +624,7 @@ static int block_crypto_open_luks(BlockDriverState *bs,
|
|||
bs, options, flags, errp);
|
||||
}
|
||||
|
||||
static int coroutine_fn
|
||||
static int coroutine_fn GRAPH_UNLOCKED
|
||||
block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
|
||||
{
|
||||
BlockdevCreateOptionsLUKS *luks_opts;
|
||||
|
@ -665,7 +662,7 @@ fail:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
static int coroutine_fn GRAPH_UNLOCKED
|
||||
block_crypto_co_create_opts_luks(BlockDriver *drv, const char *filename,
|
||||
QemuOpts *opts, Error **errp)
|
||||
{
|
||||
|
@ -727,7 +724,9 @@ fail:
|
|||
* beforehand, it has been truncated and corrupted in the process.
|
||||
*/
|
||||
if (ret) {
|
||||
bdrv_graph_co_rdlock();
|
||||
bdrv_co_delete_file_noerr(bs);
|
||||
bdrv_graph_co_rdunlock();
|
||||
}
|
||||
|
||||
bdrv_co_unref(bs);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue