mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
block: GRAPH_RDLOCK for functions only called by co_wrappers
The generated coroutine wrappers already take care to take the lock in the non-coroutine path, and assume that the lock is already taken in the coroutine path. The only thing we need to do for the wrapped function is adding the GRAPH_RDLOCK annotation. Doing so also allows us to mark the corresponding callbacks in BlockDriver as GRAPH_RDLOCK_PTR. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20221207131838.239125-19-kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
90830f5950
commit
1b3ff9feb9
4 changed files with 23 additions and 18 deletions
2
block.c
2
block.c
|
@ -5402,6 +5402,7 @@ int coroutine_fn bdrv_co_check(BlockDriverState *bs,
|
||||||
BdrvCheckResult *res, BdrvCheckMode fix)
|
BdrvCheckResult *res, BdrvCheckMode fix)
|
||||||
{
|
{
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
if (bs->drv == NULL) {
|
if (bs->drv == NULL) {
|
||||||
return -ENOMEDIUM;
|
return -ENOMEDIUM;
|
||||||
}
|
}
|
||||||
|
@ -6617,6 +6618,7 @@ int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp)
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
|
||||||
assert(!(bs->open_flags & BDRV_O_INACTIVE));
|
assert(!(bs->open_flags & BDRV_O_INACTIVE));
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
|
|
||||||
if (bs->drv->bdrv_co_invalidate_cache) {
|
if (bs->drv->bdrv_co_invalidate_cache) {
|
||||||
bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
|
bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
|
||||||
|
|
|
@ -37,9 +37,11 @@
|
||||||
* the I/O API.
|
* the I/O API.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_check(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK
|
||||||
BdrvCheckResult *res, BdrvCheckMode fix);
|
bdrv_co_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
|
||||||
int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp);
|
|
||||||
|
int coroutine_fn GRAPH_RDLOCK
|
||||||
|
bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp);
|
||||||
|
|
||||||
int coroutine_fn
|
int coroutine_fn
|
||||||
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||||
|
@ -53,10 +55,11 @@ bdrv_co_common_block_status_above(BlockDriverState *bs,
|
||||||
BlockDriverState **file,
|
BlockDriverState **file,
|
||||||
int *depth);
|
int *depth);
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_readv_vmstate(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK
|
||||||
QEMUIOVector *qiov, int64_t pos);
|
bdrv_co_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
int coroutine_fn bdrv_co_writev_vmstate(BlockDriverState *bs,
|
|
||||||
QEMUIOVector *qiov, int64_t pos);
|
int coroutine_fn GRAPH_RDLOCK
|
||||||
|
bdrv_co_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
|
|
||||||
int coroutine_fn
|
int coroutine_fn
|
||||||
nbd_co_do_establish_connection(BlockDriverState *bs, bool blocking,
|
nbd_co_do_establish_connection(BlockDriverState *bs, bool blocking,
|
||||||
|
|
|
@ -2697,6 +2697,7 @@ bdrv_co_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos)
|
||||||
BlockDriverState *child_bs = bdrv_primary_bs(bs);
|
BlockDriverState *child_bs = bdrv_primary_bs(bs);
|
||||||
int ret;
|
int ret;
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
|
|
||||||
ret = bdrv_check_qiov_request(pos, qiov->size, qiov, 0, NULL);
|
ret = bdrv_check_qiov_request(pos, qiov->size, qiov, 0, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -2729,6 +2730,7 @@ bdrv_co_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos)
|
||||||
BlockDriverState *child_bs = bdrv_primary_bs(bs);
|
BlockDriverState *child_bs = bdrv_primary_bs(bs);
|
||||||
int ret;
|
int ret;
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
|
|
||||||
ret = bdrv_check_qiov_request(pos, qiov->size, qiov, 0, NULL);
|
ret = bdrv_check_qiov_request(pos, qiov->size, qiov, 0, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -641,8 +641,8 @@ struct BlockDriver {
|
||||||
/*
|
/*
|
||||||
* Invalidate any cached meta-data.
|
* Invalidate any cached meta-data.
|
||||||
*/
|
*/
|
||||||
void coroutine_fn (*bdrv_co_invalidate_cache)(BlockDriverState *bs,
|
void coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_invalidate_cache)(
|
||||||
Error **errp);
|
BlockDriverState *bs, Error **errp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flushes all data for all layers by calling bdrv_co_flush for underlying
|
* Flushes all data for all layers by calling bdrv_co_flush for underlying
|
||||||
|
@ -701,12 +701,11 @@ struct BlockDriver {
|
||||||
Error **errp);
|
Error **errp);
|
||||||
BlockStatsSpecific *(*bdrv_get_specific_stats)(BlockDriverState *bs);
|
BlockStatsSpecific *(*bdrv_get_specific_stats)(BlockDriverState *bs);
|
||||||
|
|
||||||
int coroutine_fn (*bdrv_save_vmstate)(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_save_vmstate)(
|
||||||
QEMUIOVector *qiov,
|
BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
int64_t pos);
|
|
||||||
int coroutine_fn (*bdrv_load_vmstate)(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_load_vmstate)(
|
||||||
QEMUIOVector *qiov,
|
BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
|
||||||
int64_t pos);
|
|
||||||
|
|
||||||
/* removable device specific */
|
/* removable device specific */
|
||||||
bool (*bdrv_is_inserted)(BlockDriverState *bs);
|
bool (*bdrv_is_inserted)(BlockDriverState *bs);
|
||||||
|
@ -724,9 +723,8 @@ struct BlockDriver {
|
||||||
* Returns 0 for completed check, -errno for internal errors.
|
* Returns 0 for completed check, -errno for internal errors.
|
||||||
* The check results are stored in result.
|
* The check results are stored in result.
|
||||||
*/
|
*/
|
||||||
int coroutine_fn (*bdrv_co_check)(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_check)(
|
||||||
BdrvCheckResult *result,
|
BlockDriverState *bs, BdrvCheckResult *result, BdrvCheckMode fix);
|
||||||
BdrvCheckMode fix);
|
|
||||||
|
|
||||||
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue