Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
qemu-linux-user
0103-mirror-use-bdrv_drained_begin-bdrv_.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0103-mirror-use-bdrv_drained_begin-bdrv_.patch of Package qemu-linux-user
From: Paolo Bonzini <pbonzini@redhat.com> Date: Thu, 27 Oct 2016 12:48:51 +0200 Subject: mirror: use bdrv_drained_begin/bdrv_drained_end Ensure that there are no changes between the last check to bdrv_get_dirty_count and the switch to the target. There is already a bdrv_drained_end call, we only need to ensure that bdrv_drained_begin is not called twice. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-Id: <1477565348-5458-4-git-send-email-pbonzini@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> (cherry picked from commit 9a0cec664eefed475a5954006e29f2fd7cd29d2a) [BR: BSC#1013341] Signed-off-by: Bruce Rogers <brogers@suse.com> --- block/mirror.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 039f48125ea42a87d30cbec6b185..6e4a5b8926e23b6cd79eaf6e85c3 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -506,6 +506,7 @@ static void coroutine_fn mirror_run(void *opaque) MirrorBlockJob *s = opaque; MirrorExitData *data; BlockDriverState *bs = s->common.bs; + bool need_drain = true; int64_t sector_num, end, length; uint64_t last_pause_ns; BlockDriverInfo bdi; @@ -667,11 +668,26 @@ static void coroutine_fn mirror_run(void *opaque) * source has dirty data to copy! * * Note that I/O can be submitted by the guest while - * mirror_populate runs. + * mirror_populate runs, so pause it now. Before deciding + * whether to switch to target check one last time if I/O has + * come in the meanwhile, and if not flush the data to disk. */ trace_mirror_before_drain(s, cnt); - bdrv_co_drain(bs); + + bdrv_drained_begin(bs); cnt = bdrv_get_dirty_count(s->dirty_bitmap); + if (cnt > 0) { + bdrv_drained_end(bs); + continue; + } + + /* The two disks are in sync. Exit and report successful + * completion. + */ + assert(QLIST_EMPTY(&bs->tracked_requests)); + s->common.cancelled = false; + need_drain = false; + break; } ret = 0; @@ -684,13 +700,6 @@ static void coroutine_fn mirror_run(void *opaque) } else if (!should_complete) { delay_ns = (s->in_flight == 0 && cnt == 0 ? SLICE_TIME : 0); block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, delay_ns); - } else if (cnt == 0) { - /* The two disks are in sync. Exit and report successful - * completion. - */ - assert(QLIST_EMPTY(&bs->tracked_requests)); - s->common.cancelled = false; - break; } last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); } @@ -702,6 +711,7 @@ immediate_exit: * the target is a copy of the source. */ assert(ret < 0 || (!s->synced && block_job_is_cancelled(&s->common))); + assert(need_drain); mirror_drain(s); } @@ -716,9 +726,10 @@ immediate_exit: data = g_malloc(sizeof(*data)); data->ret = ret; - /* Before we switch to target in mirror_exit, make sure data doesn't - * change. */ - bdrv_drained_begin(s->common.bs); + + if (need_drain) { + bdrv_drained_begin(s->common.bs); + } if (qemu_get_aio_context() == bdrv_get_aio_context(bs)) { /* FIXME: virtio host notifiers run on iohandler_ctx, therefore the * above bdrv_drained_end isn't enough to quiesce it. This is ugly, we
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor