From patchwork Wed May 24 02:52:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fam Zheng X-Patchwork-Id: 766302 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wXcfN0yH1z9s06 for ; Wed, 24 May 2017 13:03:24 +1000 (AEST) Received: from localhost ([::1]:52416 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDMa1-00006N-IS for incoming@patchwork.ozlabs.org; Tue, 23 May 2017 23:03:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34215) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDMQT-0000k9-E3 for qemu-devel@nongnu.org; Tue, 23 May 2017 22:53:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dDMQS-00075Y-CP for qemu-devel@nongnu.org; Tue, 23 May 2017 22:53:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:29956) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dDMQO-00073g-4N; Tue, 23 May 2017 22:53:24 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 13B4E80479; Wed, 24 May 2017 02:53:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 13B4E80479 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=famz@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 13B4E80479 Received: from lemon.redhat.com (ovpn-12-75.pek2.redhat.com [10.72.12.75]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5AC7918AD5; Wed, 24 May 2017 02:53:19 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 24 May 2017 10:52:29 +0800 Message-Id: <20170524025235.32190-11-famz@redhat.com> In-Reply-To: <20170524025235.32190-1-famz@redhat.com> References: <20170524025235.32190-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Wed, 24 May 2017 02:53:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 10/16] mirror: Do initial aio context move of target via BB interface X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-block@nongnu.org, Stefan Hajnoczi , Max Reitz Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" While blockdev-backup tried to verify before moving target's aio context, the same is missing for blockdev-mirror. Now that we have the right interface, fix this as well. As a bonus, the aio context move is now conditional, which avoids some unnecessary operations in bdrv_set_aio_context. Signed-off-by: Fam Zheng Reviewed-by: Stefan Hajnoczi --- block/mirror.c | 54 ++++++++++++++++++++++++++++++++---------------------- blockdev.c | 4 ---- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index a3337ee..4eccb8d 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1118,13 +1118,44 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, bool auto_complete, const char *filter_node_name, Error **errp) { + AioContext *aio_context, *target_context; MirrorBlockJob *s; BlockDriverState *mirror_top_bs; + BlockBackend *target_blk; bool target_graph_mod; bool target_is_backing; Error *local_err = NULL; int ret; + /* No resize for the target either; while the mirror is still running, a + * consistent read isn't necessarily possible. We could possibly allow + * writes and graph modifications, though it would likely defeat the + * purpose of a mirror, so leave them blocked for now. + * + * In the case of active commit, things look a bit different, though, + * because the target is an already populated backing file in active use. + * We can allow anything except resize there.*/ + target_is_backing = bdrv_chain_contains(bs, target); + target_graph_mod = (backing_mode != MIRROR_LEAVE_BACKING_CHAIN); + target_blk = blk_new(BLK_PERM_WRITE | BLK_PERM_RESIZE | + BLK_PERM_AIO_CONTEXT_CHANGE | + (target_graph_mod ? BLK_PERM_GRAPH_MOD : 0), + BLK_PERM_WRITE_UNCHANGED | + (target_is_backing ? BLK_PERM_CONSISTENT_READ | + BLK_PERM_WRITE | + BLK_PERM_GRAPH_MOD : 0)); + ret = blk_insert_bs(target_blk, target, errp); + if (ret < 0) { + blk_unref(target_blk); + return; + } + aio_context = bdrv_get_aio_context(bs); + target_context = bdrv_get_aio_context(target); + if (target_context != aio_context) { + aio_context_acquire(target_context); + blk_set_aio_context(target_blk, aio_context); + aio_context_release(target_context); + } if (granularity == 0) { granularity = bdrv_get_default_bitmap_granularity(target); } @@ -1179,28 +1210,7 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs, s->source = bs; s->mirror_top_bs = mirror_top_bs; - /* No resize for the target either; while the mirror is still running, a - * consistent read isn't necessarily possible. We could possibly allow - * writes and graph modifications, though it would likely defeat the - * purpose of a mirror, so leave them blocked for now. - * - * In the case of active commit, things look a bit different, though, - * because the target is an already populated backing file in active use. - * We can allow anything except resize there.*/ - target_is_backing = bdrv_chain_contains(bs, target); - target_graph_mod = (backing_mode != MIRROR_LEAVE_BACKING_CHAIN); - s->target = blk_new(BLK_PERM_WRITE | BLK_PERM_RESIZE | - BLK_PERM_AIO_CONTEXT_CHANGE | - (target_graph_mod ? BLK_PERM_GRAPH_MOD : 0), - BLK_PERM_WRITE_UNCHANGED | - (target_is_backing ? BLK_PERM_CONSISTENT_READ | - BLK_PERM_WRITE | - BLK_PERM_GRAPH_MOD : 0)); - ret = blk_insert_bs(s->target, target, errp); - if (ret < 0) { - goto fail; - } - + s->target = target_blk; s->replaces = g_strdup(replaces); s->on_source_error = on_source_error; s->on_target_error = on_target_error; diff --git a/blockdev.c b/blockdev.c index e8f72a1..52d81c4 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3545,8 +3545,6 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) goto out; } - bdrv_set_aio_context(target_bs, aio_context); - blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, target_bs, arg->has_replaces, arg->replaces, arg->sync, backing_mode, arg->has_speed, arg->speed, @@ -3597,8 +3595,6 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id, aio_context = bdrv_get_aio_context(bs); aio_context_acquire(aio_context); - bdrv_set_aio_context(target_bs, aio_context); - blockdev_mirror_common(has_job_id ? job_id : NULL, bs, target_bs, has_replaces, replaces, sync, backing_mode, has_speed, speed,