Message ID | 83fc54b59c1e1a729c2bb3c051b787cf4386b49a.1475757437.git.berto@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 06.10.2016 um 15:02 hat Alberto Garcia geschrieben: > When block-commit is launched without the top parameter, it uses > internally a mirror block job. In that case all intermediate nodes > between the active and base nodes must be blocked as well. > > Signed-off-by: Alberto Garcia <berto@igalia.com> Same as the patch before, dataplane is okay because AioContexts are switched together with the source image. On second thought, however, maybe both places should set a blocker that prevents attaching intermediate nodes to a new block device because you can't read consistent data there. That's a preexisting problem, though, and needs its own patch. Reviewed-by: Kevin Wolf <kwolf@redhat.com>
diff --git a/block/mirror.c b/block/mirror.c index 9b5159f..a5b71b7 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -965,6 +965,14 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, } block_job_add_bdrv(&s->common, target); + /* In commit_active_start() all intermediate nodes disappear, so + * any jobs in them must be blocked */ + if (bdrv_chain_contains(bs, target)) { + BlockDriverState *iter; + for (iter = backing_bs(bs); iter != target; iter = backing_bs(iter)) { + block_job_add_bdrv(&s->common, iter); + } + } s->common.co = qemu_coroutine_create(mirror_run, s); trace_mirror_start(bs, s, s->common.co, opaque);
When block-commit is launched without the top parameter, it uses internally a mirror block job. In that case all intermediate nodes between the active and base nodes must be blocked as well. Signed-off-by: Alberto Garcia <berto@igalia.com> --- block/mirror.c | 8 ++++++++ 1 file changed, 8 insertions(+)