[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v12 03/19] block: Add block_job_add_bdrv()
From: |
Alberto Garcia |
Subject: |
[Qemu-block] [PATCH v12 03/19] block: Add block_job_add_bdrv() |
Date: |
Wed, 26 Oct 2016 13:29:17 +0300 |
When a block job is created on a certain BlockDriverState, operations
are blocked there while the job exists. However, some block jobs may
involve additional BDSs, which must be blocked separately when the job
is created and unblocked manually afterwards.
This patch adds block_job_add_bdrv(), that simplifies this process by
keeping a list of BDSs that are involved in the specified block job.
Signed-off-by: Alberto Garcia <address@hidden>
---
blockjob.c | 17 +++++++++++++++--
include/block/blockjob.h | 14 ++++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index 43fecbe..c67c46d 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -117,6 +117,13 @@ static void block_job_detach_aio_context(void *opaque)
block_job_unref(job);
}
+void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs)
+{
+ job->nodes = g_slist_prepend(job->nodes, bs);
+ bdrv_ref(bs);
+ bdrv_op_block_all(bs, job->blocker);
+}
+
void *block_job_create(const char *job_id, const BlockJobDriver *driver,
BlockDriverState *bs, int64_t speed,
BlockCompletionFunc *cb, void *opaque, Error **errp)
@@ -154,7 +161,7 @@ void *block_job_create(const char *job_id, const
BlockJobDriver *driver,
job = g_malloc0(driver->instance_size);
error_setg(&job->blocker, "block device is in use by block job: %s",
BlockJobType_lookup[driver->job_type]);
- bdrv_op_block_all(bs, job->blocker);
+ block_job_add_bdrv(job, bs);
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
job->driver = driver;
@@ -193,9 +200,15 @@ void block_job_ref(BlockJob *job)
void block_job_unref(BlockJob *job)
{
if (--job->refcnt == 0) {
+ GSList *l;
BlockDriverState *bs = blk_bs(job->blk);
bs->job = NULL;
- bdrv_op_unblock_all(bs, job->blocker);
+ for (l = job->nodes; l; l = l->next) {
+ bs = l->data;
+ bdrv_op_unblock_all(bs, job->blocker);
+ bdrv_unref(bs);
+ }
+ g_slist_free(job->nodes);
blk_remove_aio_context_notifier(job->blk,
block_job_attached_aio_context,
block_job_detach_aio_context, job);
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index 4ddb4ae..bab91b1 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -181,6 +181,9 @@ struct BlockJob {
/** Block other operations when block job is running */
Error *blocker;
+ /** BlockDriverStates that are involved in this block job */
+ GSList *nodes;
+
/** The opaque value that is passed to the completion function. */
void *opaque;
@@ -246,6 +249,17 @@ void *block_job_create(const char *job_id, const
BlockJobDriver *driver,
BlockCompletionFunc *cb, void *opaque, Error **errp);
/**
+ * block_job_add_bdrv:
+ * @job: A block job
+ * @bs: A BlockDriverState that is involved in @job
+ *
+ * Add @bs to the list of BlockDriverState that are involved in
+ * @job. This means that all operations will be blocked on @bs while
+ * @job exists.
+ */
+void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs);
+
+/**
* block_job_sleep_ns:
* @job: The job that calls the function.
* @clock: The clock to sleep on.
--
2.9.3
- [Qemu-block] [PATCH v12 19/19] qemu-iotests: Test the 'base-node' parameter of 'block-stream', (continued)
- [Qemu-block] [PATCH v12 19/19] qemu-iotests: Test the 'base-node' parameter of 'block-stream', Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 15/19] qemu-iotests: Test block-stream and block-commit in parallel, Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 12/19] qemu-iotests: Test streaming to an intermediate layer, Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 16/19] qemu-iotests: Add iotests.supports_quorum(), Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 17/19] qemu-iotests: Test streaming to a Quorum child, Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 03/19] block: Add block_job_add_bdrv(),
Alberto Garcia <=
- [Qemu-block] [PATCH v12 11/19] docs: Document how to stream to an intermediate layer, Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 13/19] qemu-iotests: Test block-stream operations in parallel, Alberto Garcia, 2016/10/26
- [Qemu-block] [PATCH v12 10/19] block: Add QMP support for streaming to an intermediate layer, Alberto Garcia, 2016/10/26