diff options
author | Fam Zheng <famz@redhat.com> | 2015-10-23 11:08:09 +0800 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2015-10-23 18:18:24 +0200 |
commit | 51288d7917e5c5b088985aaa7ff3592561fbc2ba (patch) | |
tree | 53511dc975f9f608dc4cc8e073c81055ba3565b0 /block | |
parent | c1e1e5fa8f25f9061b076a05045a6d4950d1a891 (diff) |
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')
-rw-r--r-- | block/io.c | 17 |
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)); +} |