[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v2 06/19] blockjob: Pause job on draining any job BD
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PATCH v2 06/19] blockjob: Pause job on draining any job BDS |
Date: |
Thu, 21 Dec 2017 15:22:38 +0100 |
Block jobs already paused themselves when their main BlockBackend
entered a drained section. This is not good enough: We also want to
pause a block job and may not submit new requests if, for example, the
mirror target node should be drained.
This implements .drained_begin/end callbacks in child_job in order to
consider all block nodes related to the job, and removes the
BlockBackend callbacks which are unnecessary now because the root of the
job main BlockBackend is always referenced with a child_job, too.
Signed-off-by: Kevin Wolf <address@hidden>
---
blockjob.c | 22 +++++++++-------------
1 file changed, 9 insertions(+), 13 deletions(-)
diff --git a/blockjob.c b/blockjob.c
index 6173e4728c..f5cea84e73 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -234,26 +234,23 @@ static char *child_job_get_parent_desc(BdrvChild *c)
job->id);
}
-static const BdrvChildRole child_job = {
- .get_parent_desc = child_job_get_parent_desc,
- .stay_at_node = true,
-};
-
-static void block_job_drained_begin(void *opaque)
+static void child_job_drained_begin(BdrvChild *c)
{
- BlockJob *job = opaque;
+ BlockJob *job = c->opaque;
block_job_pause(job);
}
-static void block_job_drained_end(void *opaque)
+static void child_job_drained_end(BdrvChild *c)
{
- BlockJob *job = opaque;
+ BlockJob *job = c->opaque;
block_job_resume(job);
}
-static const BlockDevOps block_job_dev_ops = {
- .drained_begin = block_job_drained_begin,
- .drained_end = block_job_drained_end,
+static const BdrvChildRole child_job = {
+ .get_parent_desc = child_job_get_parent_desc,
+ .drained_begin = child_job_drained_begin,
+ .drained_end = child_job_drained_end,
+ .stay_at_node = true,
};
void block_job_remove_all_bdrv(BlockJob *job)
@@ -715,7 +712,6 @@ void *block_job_create(const char *job_id, const
BlockJobDriver *driver,
block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
bs->job = job;
- blk_set_dev_ops(blk, &block_job_dev_ops, job);
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
QLIST_INSERT_HEAD(&block_jobs, job, job_list);
--
2.13.6
- [Qemu-block] [PATCH v2 00/19] Drain fixes and cleanups, part 2, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 01/19] block: Remove unused bdrv_requests_pending, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 02/19] block: Assert drain_all is only called from main AioContext, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 04/19] test-bdrv-drain: Test callback for bdrv_drain, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 06/19] blockjob: Pause job on draining any job BDS,
Kevin Wolf <=
- [Qemu-block] [PATCH v2 03/19] block: Make bdrv_drain() driver callbacks non-recursive, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 05/19] test-bdrv-drain: Test bs->quiesce_counter, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 07/19] test-bdrv-drain: Test drain vs. block jobs, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 08/19] block: Don't block_job_pause_all() in bdrv_drain_all(), Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 09/19] block: Nested drain_end must still call callbacks, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 11/19] block: Don't notify parents in drain call chain, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 12/19] block: Add bdrv_subtree_drained_begin/end(), Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 10/19] test-bdrv-drain: Test nested drain sections, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 13/19] test-bdrv-drain: Tests for bdrv_subtree_drain, Kevin Wolf, 2017/12/21
- [Qemu-block] [PATCH v2 14/19] test-bdrv-drain: Test behaviour in coroutine context, Kevin Wolf, 2017/12/21