[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v13 01/19] block: Add bdrv_drain_all_{begin, end}()
From: |
Alberto Garcia |
Subject: |
[Qemu-devel] [PATCH v13 01/19] block: Add bdrv_drain_all_{begin, end}() |
Date: |
Fri, 28 Oct 2016 10:08:02 +0300 |
bdrv_drain_all() doesn't allow the caller to do anything after all
pending requests have been completed but before block jobs are
resumed.
This patch splits bdrv_drain_all() into _begin() and _end() for that
purpose. It also adds aio_{disable,enable}_external() calls to disable
external clients in the meantime.
An important restriction of this split is that no new block jobs or
BlockDriverStates can be created between the bdrv_drain_all_begin()
and bdrv_drain_all_end() calls. This is not a concern now because
we'll only be using this in bdrv_reopen_multiple(), but it must be
dealt with if we ever have other uses cases in the future.
Signed-off-by: Alberto Garcia <address@hidden>
Cc: Paolo Bonzini <address@hidden>
Reviewed-by: Kevin Wolf <address@hidden>
---
block/io.c | 27 ++++++++++++++++++++++++---
include/block/block.h | 2 ++
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/block/io.c b/block/io.c
index b136c89..d694336 100644
--- a/block/io.c
+++ b/block/io.c
@@ -275,8 +275,14 @@ void bdrv_drain(BlockDriverState *bs)
*
* This function does not flush data to disk, use bdrv_flush_all() for that
* after calling this function.
+ *
+ * This pauses all block jobs and disables external clients. It must
+ * be paired with bdrv_drain_all_end().
+ *
+ * NOTE: no new block jobs or BlockDriverStates can be created between
+ * the bdrv_drain_all_begin() and bdrv_drain_all_end() calls.
*/
-void bdrv_drain_all(void)
+void bdrv_drain_all_begin(void)
{
/* Always run first iteration so any pending completion BHs run */
bool busy = true;
@@ -300,6 +306,7 @@ void bdrv_drain_all(void)
bdrv_parent_drained_begin(bs);
bdrv_io_unplugged_begin(bs);
bdrv_drain_recurse(bs);
+ aio_disable_external(aio_context);
aio_context_release(aio_context);
if (!g_slist_find(aio_ctxs, aio_context)) {
@@ -333,17 +340,25 @@ void bdrv_drain_all(void)
}
}
+ g_slist_free(aio_ctxs);
+}
+
+void bdrv_drain_all_end(void)
+{
+ BlockDriverState *bs;
+ BdrvNextIterator it;
+ BlockJob *job = NULL;
+
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
AioContext *aio_context = bdrv_get_aio_context(bs);
aio_context_acquire(aio_context);
+ aio_enable_external(aio_context);
bdrv_io_unplugged_end(bs);
bdrv_parent_drained_end(bs);
aio_context_release(aio_context);
}
- g_slist_free(aio_ctxs);
- job = NULL;
while ((job = block_job_next(job))) {
AioContext *aio_context = blk_get_aio_context(job->blk);
@@ -353,6 +368,12 @@ void bdrv_drain_all(void)
}
}
+void bdrv_drain_all(void)
+{
+ bdrv_drain_all_begin();
+ bdrv_drain_all_end();
+}
+
/**
* Remove an active request from the tracked requests list
*
diff --git a/include/block/block.h b/include/block/block.h
index 107c603..301d713 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -338,6 +338,8 @@ int bdrv_flush_all(void);
void bdrv_close_all(void);
void bdrv_drain(BlockDriverState *bs);
void coroutine_fn bdrv_co_drain(BlockDriverState *bs);
+void bdrv_drain_all_begin(void);
+void bdrv_drain_all_end(void);
void bdrv_drain_all(void);
int bdrv_pdiscard(BlockDriverState *bs, int64_t offset, int count);
--
2.9.3
- [Qemu-devel] [PATCH v13 00/19] Support streaming to an intermediate layer, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 03/19] block: Add block_job_add_bdrv(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 02/19] block: Pause all jobs during bdrv_reopen_multiple(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 06/19] block: Check blockers in all nodes involved in a block-commit job, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 04/19] block: Use block_job_add_bdrv() in mirror_start_job(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 07/19] block: Block all nodes involved in the block-commit operation, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 01/19] block: Add bdrv_drain_all_{begin, end}(),
Alberto Garcia <=
- [Qemu-devel] [PATCH v13 12/19] qemu-iotests: Test streaming to an intermediate layer, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 09/19] block: Support streaming to an intermediate layer, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 19/19] qemu-iotests: Test the 'base-node' parameter of 'block-stream', Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 17/19] qemu-iotests: Test streaming to a Quorum child, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 05/19] block: Use block_job_add_bdrv() in backup_start(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 08/19] block: Block all intermediate nodes in commit_active_start(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 15/19] qemu-iotests: Test block-stream and block-commit in parallel, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 16/19] qemu-iotests: Add iotests.supports_quorum(), Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 13/19] qemu-iotests: Test block-stream operations in parallel, Alberto Garcia, 2016/10/28
- [Qemu-devel] [PATCH v13 14/19] qemu-iotests: Test overlapping stream and commit operations, Alberto Garcia, 2016/10/28