提交 3ddf3efe 编写于 作者: A Alberto Garcia 提交者: Kevin Wolf

block: Use block_job_get() in find_block_job()

find_block_job() looks for a block backend with a specified name,
checks whether it has a block job and acquires its AioContext.

We want to identify jobs by their ID and not by the block backend
they're attached to, so this patch ignores the backends altogether and
gets the job directly. Apart from making the code simpler, this will
allow us to find block jobs once they start having user-specified IDs.

To ensure backward compatibility we keep ERROR_CLASS_DEVICE_NOT_ACTIVE
as the error class if the job doesn't exist. In subsequent patches
we'll also need to keep the device name as the default job ID if the
user doesn't specify a different one.
Signed-off-by: NAlberto Garcia <berto@igalia.com>
Reviewed-by: NMax Reitz <mreitz@redhat.com>
Reviewed-by: NKevin Wolf <kwolf@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 ffb1f10c
...@@ -3704,42 +3704,28 @@ void qmp_blockdev_mirror(const char *device, const char *target, ...@@ -3704,42 +3704,28 @@ void qmp_blockdev_mirror(const char *device, const char *target,
aio_context_release(aio_context); aio_context_release(aio_context);
} }
/* Get the block job for a given device name and acquire its AioContext */ /* Get a block job using its ID and acquire its AioContext */
static BlockJob *find_block_job(const char *device, AioContext **aio_context, static BlockJob *find_block_job(const char *id, AioContext **aio_context,
Error **errp) Error **errp)
{ {
BlockBackend *blk; BlockJob *job;
BlockDriverState *bs;
*aio_context = NULL; assert(id != NULL);
blk = blk_by_name(device); *aio_context = NULL;
if (!blk) {
goto notfound;
}
*aio_context = blk_get_aio_context(blk); job = block_job_get(id);
aio_context_acquire(*aio_context);
if (!blk_is_available(blk)) { if (!job) {
goto notfound; error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
} "Block job '%s' not found", id);
bs = blk_bs(blk); return NULL;
if (!bs->job) {
goto notfound;
} }
return bs->job; *aio_context = blk_get_aio_context(job->blk);
aio_context_acquire(*aio_context);
notfound: return job;
error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
"No active block job on device '%s'", device);
if (*aio_context) {
aio_context_release(*aio_context);
*aio_context = NULL;
}
return NULL;
} }
void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp) void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册