blockjob: Factor out block_job_remove_all_bdrv()
In some cases, we want to remove op blockers on intermediate nodes before the whole block job transaction has completed (because they block restoring the final graph state during completion). Provide a function for this. The whole block job lifecycle is a bit messed up and it's hard to actually do all things in the right order, but I'll leave simplifying this for another day. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Acked-by: Fam Zheng <famz@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
3e44c8e08a
commit
bbc02b90bc
20
blockjob.c
20
blockjob.c
@ -128,6 +128,18 @@ static void block_job_detach_aio_context(void *opaque)
|
|||||||
block_job_unref(job);
|
block_job_unref(job);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void block_job_remove_all_bdrv(BlockJob *job)
|
||||||
|
{
|
||||||
|
GSList *l;
|
||||||
|
for (l = job->nodes; l; l = l->next) {
|
||||||
|
BdrvChild *c = l->data;
|
||||||
|
bdrv_op_unblock_all(c->bs, job->blocker);
|
||||||
|
bdrv_root_unref_child(c);
|
||||||
|
}
|
||||||
|
g_slist_free(job->nodes);
|
||||||
|
job->nodes = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
|
int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
|
||||||
uint64_t perm, uint64_t shared_perm, Error **errp)
|
uint64_t perm, uint64_t shared_perm, Error **errp)
|
||||||
{
|
{
|
||||||
@ -258,15 +270,9 @@ void block_job_ref(BlockJob *job)
|
|||||||
void block_job_unref(BlockJob *job)
|
void block_job_unref(BlockJob *job)
|
||||||
{
|
{
|
||||||
if (--job->refcnt == 0) {
|
if (--job->refcnt == 0) {
|
||||||
GSList *l;
|
|
||||||
BlockDriverState *bs = blk_bs(job->blk);
|
BlockDriverState *bs = blk_bs(job->blk);
|
||||||
bs->job = NULL;
|
bs->job = NULL;
|
||||||
for (l = job->nodes; l; l = l->next) {
|
block_job_remove_all_bdrv(job);
|
||||||
BdrvChild *c = l->data;
|
|
||||||
bdrv_op_unblock_all(c->bs, job->blocker);
|
|
||||||
bdrv_root_unref_child(c);
|
|
||||||
}
|
|
||||||
g_slist_free(job->nodes);
|
|
||||||
blk_remove_aio_context_notifier(job->blk,
|
blk_remove_aio_context_notifier(job->blk,
|
||||||
block_job_attached_aio_context,
|
block_job_attached_aio_context,
|
||||||
block_job_detach_aio_context, job);
|
block_job_detach_aio_context, job);
|
||||||
|
@ -180,6 +180,15 @@ BlockJob *block_job_get(const char *id);
|
|||||||
int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
|
int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
|
||||||
uint64_t perm, uint64_t shared_perm, Error **errp);
|
uint64_t perm, uint64_t shared_perm, Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* block_job_remove_all_bdrv:
|
||||||
|
* @job: The block job
|
||||||
|
*
|
||||||
|
* Remove all BlockDriverStates from the list of nodes that are involved in the
|
||||||
|
* job. This removes the blockers added with block_job_add_bdrv().
|
||||||
|
*/
|
||||||
|
void block_job_remove_all_bdrv(BlockJob *job);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_job_set_speed:
|
* block_job_set_speed:
|
||||||
* @job: The job to set the speed for.
|
* @job: The job to set the speed for.
|
||||||
|
Loading…
Reference in New Issue
Block a user