summaryrefslogtreecommitdiff
path: root/block/io.c
diff options
context:
space:
mode:
authorFam Zheng <famz@redhat.com>2015-10-23 11:08:09 +0800
committerKevin Wolf <kwolf@redhat.com>2015-10-23 18:18:24 +0200
commit51288d7917e5c5b088985aaa7ff3592561fbc2ba (patch)
tree53511dc975f9f608dc4cc8e073c81055ba3565b0 /block/io.c
parentc1e1e5fa8f25f9061b076a05045a6d4950d1a891 (diff)
downloadqemu-51288d7917e5c5b088985aaa7ff3592561fbc2ba.zip
block: Introduce "drained begin/end" API
The semantics is that after bdrv_drained_begin(bs), bs will not get new external requests until the matching bdrv_drained_end(bs). Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block/io.c')
-rw-r--r--block/io.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/block/io.c b/block/io.c
index 2fd7a1d764..5ac6256ad3 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2624,3 +2624,20 @@ void bdrv_flush_io_queue(BlockDriverState *bs)
}
bdrv_start_throttled_reqs(bs);
}
+
+void bdrv_drained_begin(BlockDriverState *bs)
+{
+ if (!bs->quiesce_counter++) {
+ aio_disable_external(bdrv_get_aio_context(bs));
+ }
+ bdrv_drain(bs);
+}
+
+void bdrv_drained_end(BlockDriverState *bs)
+{
+ assert(bs->quiesce_counter > 0);
+ if (--bs->quiesce_counter > 0) {
+ return;
+ }
+ aio_enable_external(bdrv_get_aio_context(bs));
+}