bdrv_close_all() cancels all block jobs by iterating over all BlockDriverStates. This patch simplifies the code by iterating directly over the block jobs using block_job_next().
Signed-off-by: Alberto Garcia <be...@igalia.com> --- block.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/block.c b/block.c index d36eb75..48638c9 100644 --- a/block.c +++ b/block.c @@ -2182,8 +2182,7 @@ static void bdrv_close(BlockDriverState *bs) void bdrv_close_all(void) { - BlockDriverState *bs; - AioContext *aio_context; + BlockJob *job; /* Drop references from requests still in flight, such as canceled block * jobs whose AIO context has not been polled yet */ @@ -2193,23 +2192,11 @@ void bdrv_close_all(void) blockdev_close_all_bdrv_states(); /* Cancel all block jobs */ - while (!QTAILQ_EMPTY(&all_bdrv_states)) { - QTAILQ_FOREACH(bs, &all_bdrv_states, bs_list) { - aio_context = bdrv_get_aio_context(bs); - - aio_context_acquire(aio_context); - if (bs->job) { - block_job_cancel_sync(bs->job); - aio_context_release(aio_context); - break; - } - aio_context_release(aio_context); - } - - /* All the remaining BlockDriverStates are referenced directly or - * indirectly from block jobs, so there needs to be at least one BDS - * directly used by a block job */ - assert(bs); + while ((job = block_job_next(NULL))) { + AioContext *aio_context = bdrv_get_aio_context(job->bs); + aio_context_acquire(aio_context); + block_job_cancel_sync(job); + aio_context_release(aio_context); } } -- 2.8.0.rc3