[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 04/15] block: Simplify find_block_job() and make it
From: |
Alberto Garcia |
Subject: |
[Qemu-block] [PATCH 04/15] block: Simplify find_block_job() and make it accept a job ID |
Date: |
Thu, 9 Jun 2016 11:20:09 +0300 |
find_block_job() looks for a block backend with a specified name,
checks whether it has a block job and acquires its AioContext. This
patch uses block_job_next() and iterate directly over the block jobs.
In addition to that we want to identify jobs primarily by their ID, so
this patch updates find_block_job() to allow IDs too. Only one of ID
and device name can be specified when looking for a block job.
Signed-off-by: Alberto Garcia <address@hidden>
---
blockdev.c | 66 +++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 35 insertions(+), 31 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 52ec4ae..bd0d5a1 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3689,48 +3689,52 @@ 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,
- Error **errp)
+/* Get a block job using its ID or device name and acquire its AioContext */
+static BlockJob *find_block_job(const char *id, const char *device,
+ AioContext **aio_context, Error **errp)
{
- BlockBackend *blk;
- BlockDriverState *bs;
+ BlockJob *job = NULL;
*aio_context = NULL;
- blk = blk_by_name(device);
- if (!blk) {
- goto notfound;
+ if ((id && device) || (!id && !device)) {
+ error_setg(errp, "Only one of ID or device name "
+ "must be specified when looking for a block job");
+ return NULL;
}
- *aio_context = blk_get_aio_context(blk);
- aio_context_acquire(*aio_context);
-
- if (!blk_is_available(blk)) {
- goto notfound;
+ if (id) {
+ job = block_job_get(id);
+ } else {
+ BlockJob *j;
+ for (j = block_job_next(NULL); j; j = block_job_next(j)) {
+ if (!strcmp(device, j->device)) {
+ if (job) {
+ /* This scenario is currently not possible, but it
+ * could theoretically happen in the future. */
+ error_setg(errp, "More than one job on device '%s', "
+ "use the job ID instead", device);
+ return NULL;
+ }
+ job = j;
+ }
+ }
}
- bs = blk_bs(blk);
- if (!bs->job) {
- goto notfound;
+ if (job) {
+ *aio_context = blk_get_aio_context(job->blk);
+ aio_context_acquire(*aio_context);
+ } else {
+ error_setg(errp, "Block job '%s' not found", id ? id : device);
}
- return bs->job;
-
-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)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(device, &aio_context, errp);
+ BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
if (!job) {
return;
@@ -3744,7 +3748,7 @@ void qmp_block_job_cancel(const char *device,
bool has_force, bool force, Error **errp)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(device, &aio_context, errp);
+ BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
if (!job) {
return;
@@ -3769,7 +3773,7 @@ out:
void qmp_block_job_pause(const char *device, Error **errp)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(device, &aio_context, errp);
+ BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
if (!job || job->user_paused) {
return;
@@ -3784,7 +3788,7 @@ void qmp_block_job_pause(const char *device, Error **errp)
void qmp_block_job_resume(const char *device, Error **errp)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(device, &aio_context, errp);
+ BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
if (!job || !job->user_paused) {
return;
@@ -3799,7 +3803,7 @@ void qmp_block_job_resume(const char *device, Error
**errp)
void qmp_block_job_complete(const char *device, Error **errp)
{
AioContext *aio_context;
- BlockJob *job = find_block_job(device, &aio_context, errp);
+ BlockJob *job = find_block_job(NULL, device, &aio_context, errp);
if (!job) {
return;
--
2.8.1
- [Qemu-block] [PATCH 02/15] blockjob: Decouple the ID from the device name in the BlockJob struct, (continued)
[Qemu-block] [PATCH 12/15] blockjob: Add 'id' parameter to 'block-job-pause', Alberto Garcia, 2016/06/09