aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2016-07-05 17:28:55 +0300
committerKevin Wolf <kwolf@redhat.com>2016-07-13 13:26:02 +0200
commit3ddf3efefa364505ee44582873612dd8f6abb838 (patch)
tree2bcd32eebbb5130cbea387b1f6edb97e081d904b
parentffb1f10cd1118393627e1bd2dad0a68152d2e539 (diff)
downloadqemu-3ddf3efefa364505ee44582873612dd8f6abb838.zip
qemu-3ddf3efefa364505ee44582873612dd8f6abb838.tar.gz
qemu-3ddf3efefa364505ee44582873612dd8f6abb838.tar.bz2
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: Alberto Garcia <berto@igalia.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r--blockdev.c40
1 files changed, 13 insertions, 27 deletions
diff --git a/blockdev.c b/blockdev.c
index 0f8065c..e649521 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3704,42 +3704,28 @@ void qmp_blockdev_mirror(const char *device, const char *target,
aio_context_release(aio_context);
}
-/* Get the block job for a given device name and acquire its AioContext */
-static BlockJob *find_block_job(const char *device, AioContext **aio_context,
+/* Get a block job using its ID and acquire its AioContext */
+static BlockJob *find_block_job(const char *id, AioContext **aio_context,
Error **errp)
{
- BlockBackend *blk;
- BlockDriverState *bs;
+ BlockJob *job;
- *aio_context = NULL;
+ assert(id != NULL);
- blk = blk_by_name(device);
- if (!blk) {
- goto notfound;
- }
-
- *aio_context = blk_get_aio_context(blk);
- aio_context_acquire(*aio_context);
+ *aio_context = NULL;
- if (!blk_is_available(blk)) {
- goto notfound;
- }
- bs = blk_bs(blk);
+ job = block_job_get(id);
- if (!bs->job) {
- goto notfound;
+ if (!job) {
+ error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
+ "Block job '%s' not found", id);
+ return NULL;
}
- return bs->job;
+ *aio_context = blk_get_aio_context(job->blk);
+ aio_context_acquire(*aio_context);
-notfound:
- 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;
+ return job;
}
void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)