Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
block: Mark BlockDriver callbacks for amend job GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of amend
callbacks in BlockDriver need to hold a reader lock for the graph.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
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-17-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
esposem authored and Kevin Wolf committed May 10, 2023
1 parent cb2bfaa commit 840428a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
8 changes: 7 additions & 1 deletion block/amend.c
Expand Up @@ -46,6 +46,7 @@ static int coroutine_fn blockdev_amend_run(Job *job, Error **errp)
{
BlockdevAmendJob *s = container_of(job, BlockdevAmendJob, common);
int ret;
GRAPH_RDLOCK_GUARD();

job_progress_set_remaining(&s->common, 1);
ret = s->bs->drv->bdrv_co_amend(s->bs, s->opts, s->force, errp);
Expand All @@ -54,7 +55,8 @@ static int coroutine_fn blockdev_amend_run(Job *job, Error **errp)
return ret;
}

static int blockdev_amend_pre_run(BlockdevAmendJob *s, Error **errp)
static int GRAPH_RDLOCK
blockdev_amend_pre_run(BlockdevAmendJob *s, Error **errp)
{
if (s->bs->drv->bdrv_amend_pre_run) {
return s->bs->drv->bdrv_amend_pre_run(s->bs, errp);
Expand All @@ -67,9 +69,11 @@ static void blockdev_amend_free(Job *job)
{
BlockdevAmendJob *s = container_of(job, BlockdevAmendJob, common);

bdrv_graph_rdlock_main_loop();
if (s->bs->drv->bdrv_amend_clean) {
s->bs->drv->bdrv_amend_clean(s->bs);
}
bdrv_graph_rdunlock_main_loop();

bdrv_unref(s->bs);
}
Expand All @@ -93,6 +97,8 @@ void qmp_x_blockdev_amend(const char *job_id,
BlockDriver *drv = bdrv_find_format(fmt);
BlockDriverState *bs;

GRAPH_RDLOCK_GUARD_MAINLOOP();

bs = bdrv_lookup_bs(NULL, node_name, errp);
if (!bs) {
return;
Expand Down
12 changes: 6 additions & 6 deletions include/block/block_int-common.h
Expand Up @@ -204,12 +204,13 @@ struct BlockDriver {
* to allow driver-specific initialization code that requires
* the BQL, like setting up specific permission flags.
*/
int (*bdrv_amend_pre_run)(BlockDriverState *bs, Error **errp);
int GRAPH_RDLOCK_PTR (*bdrv_amend_pre_run)(
BlockDriverState *bs, Error **errp);
/*
* This function is invoked under BQL after .bdrv_co_amend()
* to allow cleaning up what was done in .bdrv_amend_pre_run().
*/
void (*bdrv_amend_clean)(BlockDriverState *bs);
void GRAPH_RDLOCK_PTR (*bdrv_amend_clean)(BlockDriverState *bs);

/*
* Return true if @to_replace can be replaced by a BDS with the
Expand Down Expand Up @@ -463,10 +464,9 @@ struct BlockDriver {

int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);

int coroutine_fn (*bdrv_co_amend)(BlockDriverState *bs,
BlockdevAmendOptions *opts,
bool force,
Error **errp);
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_amend)(
BlockDriverState *bs, BlockdevAmendOptions *opts, bool force,
Error **errp);

/* aio */
BlockAIOCB * GRAPH_RDLOCK_PTR (*bdrv_aio_preadv)(BlockDriverState *bs,
Expand Down

0 comments on commit 840428a

Please sign in to comment.