block: Take AioContext lock in bdrv_open_driver()
bdrv_refresh_total_sectors() and bdrv_refresh_limits() expect to be called under the AioContext lock of the node. Take the lock. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230525124713.401149-10-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
9102f2ebdb
commit
8dc8a60c9e
7
block.c
7
block.c
@ -1613,6 +1613,7 @@ static int no_coroutine_fn GRAPH_UNLOCKED
|
|||||||
bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, const char *node_name,
|
bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, const char *node_name,
|
||||||
QDict *options, int open_flags, Error **errp)
|
QDict *options, int open_flags, Error **errp)
|
||||||
{
|
{
|
||||||
|
AioContext *ctx;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
@ -1660,15 +1661,21 @@ bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, const char *node_name,
|
|||||||
bs->supported_read_flags |= BDRV_REQ_REGISTERED_BUF;
|
bs->supported_read_flags |= BDRV_REQ_REGISTERED_BUF;
|
||||||
bs->supported_write_flags |= BDRV_REQ_REGISTERED_BUF;
|
bs->supported_write_flags |= BDRV_REQ_REGISTERED_BUF;
|
||||||
|
|
||||||
|
/* Get the context after .bdrv_open, it can change the context */
|
||||||
|
ctx = bdrv_get_aio_context(bs);
|
||||||
|
aio_context_acquire(ctx);
|
||||||
|
|
||||||
ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
|
ret = bdrv_refresh_total_sectors(bs, bs->total_sectors);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg_errno(errp, -ret, "Could not refresh total sector count");
|
error_setg_errno(errp, -ret, "Could not refresh total sector count");
|
||||||
|
aio_context_release(ctx);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_graph_rdlock_main_loop();
|
bdrv_graph_rdlock_main_loop();
|
||||||
bdrv_refresh_limits(bs, NULL, &local_err);
|
bdrv_refresh_limits(bs, NULL, &local_err);
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
|
aio_context_release(ctx);
|
||||||
|
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user