[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 18/29] blockjob: Store device name at job creation
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 18/29] blockjob: Store device name at job creation |
Date: |
Fri, 16 Oct 2015 17:06:03 +0200 |
Some block jobs change the block device graph on completion. This means
that the device that owns the job and originally was addressed with its
device name may no longer be what the corresponding BlockBackend points
to.
Previously, the effects of bdrv_swap() ensured that the job was (at
least partially) transferred to the target image. Events that contain
the device name could still use bdrv_get_device_name(job->bs) and get
the same result.
After removing bdrv_swap(), this won't work any more. Instead, save the
device name at job creation and use that copy for QMP events and
anything else identifying the job.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
Reviewed-by: Alberto Garcia <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
---
block/mirror.c | 3 +--
blockjob.c | 15 ++++++++-------
include/block/blockjob.h | 8 ++++++++
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 6247b27..c277691 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -645,8 +645,7 @@ static void mirror_complete(BlockJob *job, Error **errp)
return;
}
if (!s->synced) {
- error_setg(errp, QERR_BLOCK_JOB_NOT_READY,
- bdrv_get_device_name(job->bs));
+ error_setg(errp, QERR_BLOCK_JOB_NOT_READY, job->id);
return;
}
diff --git a/blockjob.c b/blockjob.c
index 62bb906..d87869c 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -54,6 +54,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->bs = bs;
job->cb = cb;
job->opaque = opaque;
@@ -81,6 +82,7 @@ void block_job_release(BlockDriverState *bs)
bs->job = NULL;
bdrv_op_unblock_all(bs, job->blocker);
error_free(job->blocker);
+ g_free(job->id);
g_free(job);
}
@@ -113,8 +115,7 @@ void block_job_set_speed(BlockJob *job, int64_t speed,
Error **errp)
void block_job_complete(BlockJob *job, Error **errp)
{
if (job->pause_count || job->cancelled || !job->driver->complete) {
- error_setg(errp, QERR_BLOCK_JOB_NOT_READY,
- bdrv_get_device_name(job->bs));
+ error_setg(errp, QERR_BLOCK_JOB_NOT_READY, job->id);
return;
}
@@ -269,7 +270,7 @@ BlockJobInfo *block_job_query(BlockJob *job)
{
BlockJobInfo *info = g_new0(BlockJobInfo, 1);
info->type = g_strdup(BlockJobType_lookup[job->driver->job_type]);
- info->device = g_strdup(bdrv_get_device_name(job->bs));
+ info->device = g_strdup(job->id);
info->len = job->len;
info->busy = job->busy;
info->paused = job->pause_count > 0;
@@ -291,7 +292,7 @@ static void block_job_iostatus_set_err(BlockJob *job, int
error)
void block_job_event_cancelled(BlockJob *job)
{
qapi_event_send_block_job_cancelled(job->driver->job_type,
- bdrv_get_device_name(job->bs),
+ job->id,
job->len,
job->offset,
job->speed,
@@ -301,7 +302,7 @@ void block_job_event_cancelled(BlockJob *job)
void block_job_event_completed(BlockJob *job, const char *msg)
{
qapi_event_send_block_job_completed(job->driver->job_type,
- bdrv_get_device_name(job->bs),
+ job->id,
job->len,
job->offset,
job->speed,
@@ -315,7 +316,7 @@ void block_job_event_ready(BlockJob *job)
job->ready = true;
qapi_event_send_block_job_ready(job->driver->job_type,
- bdrv_get_device_name(job->bs),
+ job->id,
job->len,
job->offset,
job->speed, &error_abort);
@@ -344,7 +345,7 @@ BlockErrorAction block_job_error_action(BlockJob *job,
BlockDriverState *bs,
default:
abort();
}
- qapi_event_send_block_job_error(bdrv_get_device_name(job->bs),
+ qapi_event_send_block_job_error(job->id,
is_read ? IO_OPERATION_TYPE_READ :
IO_OPERATION_TYPE_WRITE,
action, &error_abort);
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index dd9d5e6..289b13f 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -65,6 +65,14 @@ struct BlockJob {
BlockDriverState *bs;
/**
+ * The ID of the block job. Currently the BlockBackend name of the BDS
+ * owning the job at the time when the job is started.
+ *
+ * TODO Decouple block job IDs from BlockBackend names
+ */
+ char *id;
+
+ /**
* The coroutine that executes the job. If not NULL, it is
* reentered when busy is false and the job is cancelled.
*/
--
1.8.3.1
- [Qemu-devel] [PULL 03/29] qmp-commands.hx: Update the supported 'transaction' operations, (continued)
- [Qemu-devel] [PULL 03/29] qmp-commands.hx: Update the supported 'transaction' operations, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 05/29] block: Introduce BDS.file_child, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 06/29] vmdk: Use BdrvChild instead of BDS for references to extents, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 04/29] block: qemu-iotests - fix vmdk test 059.out, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 07/29] blkverify: Convert s->test_file to BdrvChild, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 10/29] block: Remove bdrv_open_image(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 13/29] block: Split bdrv_move_feature_fields(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 08/29] quorum: Convert to BdrvChild, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 14/29] block/io: Make bdrv_requests_pending() public, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 16/29] block: Introduce parents list, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 18/29] blockjob: Store device name at job creation,
Kevin Wolf <=
- [Qemu-devel] [PULL 11/29] block: Convert bs->backing_hd to BdrvChild, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 15/29] block-backend: Add blk_set_bs(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 17/29] block: Implement bdrv_append() without bdrv_swap(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 12/29] block: Manage backing file references in bdrv_set_backing_hd(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 21/29] block: Allow bdrv_unref_child(bs, NULL), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 20/29] block: Remove bdrv_swap(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 22/29] blkverify: Fix BDS leak in .bdrv_open error path, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 19/29] block: Add and use bdrv_replace_in_backing_chain(), Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 23/29] util - add automated ID generation utility, Kevin Wolf, 2015/10/16
- [Qemu-devel] [PULL 25/29] raw-posix: warn about BDRV_O_NATIVE_AIO if libaio is unavailable, Kevin Wolf, 2015/10/16