Commit 7f0317cf authored by Alberto Garcia's avatar Alberto Garcia Committed by Kevin Wolf
Browse files

blockjob: Add 'job_id' parameter to block_job_create()



When a new job is created, the job ID is taken from the device name of
the BDS. This patch adds a new 'job_id' parameter to let the caller
provide one instead.

This patch also verifies that the ID is always unique and well-formed.
This causes problems in a couple of places where no ID is being set,
because the BDS does not have a device name.

In the case of test_block_job_start() (from test-blockjob-txn.c) we
can simply use this new 'job_id' parameter to set the missing ID.

In the case of img_commit() (from qemu-img.c) we still don't have the
API to make commit_active_start() set the job ID, so we solve it by
setting a default value. We'll get rid of this as soon as we extend
the API.

Signed-off-by: default avatarAlberto Garcia <berto@igalia.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 3ddf3efe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -541,7 +541,8 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
        goto error;
    }

    job = block_job_create(&backup_job_driver, bs, speed, cb, opaque, errp);
    job = block_job_create(NULL, &backup_job_driver, bs, speed,
                           cb, opaque, errp);
    if (!job) {
        goto error;
    }
+1 −1
Original line number Diff line number Diff line
@@ -236,7 +236,7 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base,
        return;
    }

    s = block_job_create(&commit_job_driver, bs, speed, cb, opaque, errp);
    s = block_job_create(NULL, &commit_job_driver, bs, speed, cb, opaque, errp);
    if (!s) {
        return;
    }
+1 −1
Original line number Diff line number Diff line
@@ -873,7 +873,7 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
        buf_size = DEFAULT_MIRROR_BUF_SIZE;
    }

    s = block_job_create(driver, bs, speed, cb, opaque, errp);
    s = block_job_create(NULL, driver, bs, speed, cb, opaque, errp);
    if (!s) {
        return;
    }
+1 −1
Original line number Diff line number Diff line
@@ -226,7 +226,7 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base,
{
    StreamBlockJob *s;

    s = block_job_create(&stream_job_driver, bs, speed, cb, opaque, errp);
    s = block_job_create(NULL, &stream_job_driver, bs, speed, cb, opaque, errp);
    if (!s) {
        return;
    }
+25 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "qapi/qmp/qerror.h"
#include "qapi/qmp/qjson.h"
#include "qemu/coroutine.h"
#include "qemu/id.h"
#include "qmp-commands.h"
#include "qemu/timer.h"
#include "qapi-event.h"
@@ -116,9 +117,9 @@ static void block_job_detach_aio_context(void *opaque)
    block_job_unref(job);
}

void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
                       int64_t speed, BlockCompletionFunc *cb,
                       void *opaque, Error **errp)
void *block_job_create(const char *job_id, const BlockJobDriver *driver,
                       BlockDriverState *bs, int64_t speed,
                       BlockCompletionFunc *cb, void *opaque, Error **errp)
{
    BlockBackend *blk;
    BlockJob *job;
@@ -129,6 +130,26 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
        return NULL;
    }

    if (job_id == NULL) {
        job_id = bdrv_get_device_name(bs);
        /* Assign a default ID if the BDS does not have a device
         * name. We'll get rid of this soon when we finish extending
         * the API of all commands that create block jobs. */
        if (job_id[0] == '\0') {
            job_id = "default_job";
        }
    }

    if (!id_wellformed(job_id)) {
        error_setg(errp, "Invalid job ID '%s'", job_id);
        return NULL;
    }

    if (block_job_get(job_id)) {
        error_setg(errp, "Job ID '%s' already in use", job_id);
        return NULL;
    }

    blk = blk_new();
    blk_insert_bs(blk, bs);

@@ -139,7 +160,7 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
    bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);

    job->driver        = driver;
    job->id            = g_strdup(bdrv_get_device_name(bs));
    job->id            = g_strdup(job_id);
    job->blk           = blk;
    job->cb            = cb;
    job->opaque        = opaque;
Loading