From nobody Sun Feb 8 22:07:06 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487694301424777.9903840510551; Tue, 21 Feb 2017 08:25:01 -0800 (PST) Received: from localhost ([::1]:46679 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgDFL-0005ZH-Oh for importer@patchew.org; Tue, 21 Feb 2017 11:24:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43681) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cgBvI-0001Bp-Li for qemu-devel@nongnu.org; Tue, 21 Feb 2017 10:00:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cgBvH-0008OH-CT for qemu-devel@nongnu.org; Tue, 21 Feb 2017 10:00:12 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33304) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cgBvA-0008FT-4d; Tue, 21 Feb 2017 10:00:04 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1653180084; Tue, 21 Feb 2017 15:00:04 +0000 (UTC) Received: from noname.str.redhat.com (dhcp-192-197.str.redhat.com [10.33.192.197]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1LEwudS030565; Tue, 21 Feb 2017 10:00:02 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Tue, 21 Feb 2017 15:58:40 +0100 Message-Id: <1487689130-30373-45-git-send-email-kwolf@redhat.com> In-Reply-To: <1487689130-30373-1-git-send-email-kwolf@redhat.com> References: <1487689130-30373-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 21 Feb 2017 15:00:04 +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 44/54] mirror: Add filter-node-name to blockdev-mirror 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: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Management tools need to be able to know about every node in the graph and need a way to address them. This new option to blockdev-mirror allows the client to set a node-name for the automatically inserted filter driver, and at the same time serves as a witness that this version of qemu does automatically insert a filter driver. Signed-off-by: Kevin Wolf Reviewed-by: Max Reitz --- block/mirror.c | 14 ++++++++------ blockdev.c | 12 +++++++++++- include/block/block_int.h | 5 ++++- qapi/block-core.json | 8 +++++++- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 252107d..2e1cd16 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1046,7 +1046,7 @@ static void mirror_start_job(const char *job_id, Bloc= kDriverState *bs, void *opaque, Error **errp, const BlockJobDriver *driver, bool is_none_mode, BlockDriverState *base, - bool auto_complete) + bool auto_complete, const char *filter_node_n= ame) { MirrorBlockJob *s; BlockDriverState *mirror_top_bs; @@ -1071,8 +1071,8 @@ static void mirror_start_job(const char *job_id, Bloc= kDriverState *bs, =20 /* In the case of active commit, add dummy driver to provide consistent * reads on the top, while disabling it in the intermediate nodes */ - mirror_top_bs =3D bdrv_new_open_driver(&bdrv_mirror_top, NULL, BDRV_O_= RDWR, - errp); + mirror_top_bs =3D bdrv_new_open_driver(&bdrv_mirror_top, filter_node_n= ame, + BDRV_O_RDWR, errp); if (mirror_top_bs =3D=3D NULL) { return; } @@ -1181,7 +1181,7 @@ void mirror_start(const char *job_id, BlockDriverStat= e *bs, MirrorSyncMode mode, BlockMirrorBackingMode backing_mode, BlockdevOnError on_source_error, BlockdevOnError on_target_error, - bool unmap, Error **errp) + bool unmap, const char *filter_node_name, Error **errp) { bool is_none_mode; BlockDriverState *base; @@ -1195,7 +1195,8 @@ void mirror_start(const char *job_id, BlockDriverStat= e *bs, mirror_start_job(job_id, bs, BLOCK_JOB_DEFAULT, target, replaces, speed, granularity, buf_size, backing_mode, on_source_error, on_target_error, unmap, NULL, NULL, = errp, - &mirror_job_driver, is_none_mode, base, false); + &mirror_job_driver, is_none_mode, base, false, + filter_node_name); } =20 void commit_active_start(const char *job_id, BlockDriverState *bs, @@ -1216,7 +1217,8 @@ void commit_active_start(const char *job_id, BlockDri= verState *bs, mirror_start_job(job_id, bs, creation_flags, base, NULL, speed, 0, 0, MIRROR_LEAVE_BACKING_CHAIN, on_error, on_error, true, cb, opaque, &local_err, - &commit_active_job_driver, false, base, auto_complete= ); + &commit_active_job_driver, false, base, auto_complete, + NULL); if (local_err) { error_propagate(errp, local_err); goto error_restore_flags; diff --git a/blockdev.c b/blockdev.c index bcee23e..4314584 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3362,6 +3362,8 @@ static void blockdev_mirror_common(const char *job_id= , BlockDriverState *bs, bool has_on_target_error, BlockdevOnError on_target_error, bool has_unmap, bool unmap, + bool has_filter_node_name, + const char *filter_node_name, Error **errp) { =20 @@ -3383,6 +3385,9 @@ static void blockdev_mirror_common(const char *job_id= , BlockDriverState *bs, if (!has_unmap) { unmap =3D true; } + if (!has_filter_node_name) { + filter_node_name =3D NULL; + } =20 if (granularity !=3D 0 && (granularity < 512 || granularity > 1048576 = * 64)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "granularity", @@ -3412,7 +3417,8 @@ static void blockdev_mirror_common(const char *job_id= , BlockDriverState *bs, mirror_start(job_id, bs, target, has_replaces ? replaces : NULL, speed, granularity, buf_size, sync, backing_mode, - on_source_error, on_target_error, unmap, errp); + on_source_error, on_target_error, unmap, filter_node_name, + errp); } =20 void qmp_drive_mirror(DriveMirror *arg, Error **errp) @@ -3550,6 +3556,7 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) arg->has_on_source_error, arg->on_source_error, arg->has_on_target_error, arg->on_target_error, arg->has_unmap, arg->unmap, + false, NULL, &local_err); bdrv_unref(target_bs); error_propagate(errp, local_err); @@ -3568,6 +3575,8 @@ void qmp_blockdev_mirror(bool has_job_id, const char = *job_id, BlockdevOnError on_source_error, bool has_on_target_error, BlockdevOnError on_target_error, + bool has_filter_node_name, + const char *filter_node_name, Error **errp) { BlockDriverState *bs; @@ -3599,6 +3608,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char = *job_id, has_on_source_error, on_source_error, has_on_target_error, on_target_error, true, true, + has_filter_node_name, filter_node_name, &local_err); error_propagate(errp, local_err); =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index a5c704b..563b30c 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -824,6 +824,9 @@ void commit_active_start(const char *job_id, BlockDrive= rState *bs, * @on_source_error: The action to take upon error reading from the source. * @on_target_error: The action to take upon error writing to the target. * @unmap: Whether to unmap target where source sectors only contain zeroe= s. + * @filter_node_name: The node name that should be assigned to the filter + * driver that the mirror job inserts into the graph above @bs. NULL means= that + * a node name should be autogenerated. * @errp: Error object. * * Start a mirroring operation on @bs. Clusters that are allocated @@ -837,7 +840,7 @@ void mirror_start(const char *job_id, BlockDriverState = *bs, MirrorSyncMode mode, BlockMirrorBackingMode backing_mode, BlockdevOnError on_source_error, BlockdevOnError on_target_error, - bool unmap, Error **errp); + bool unmap, const char *filter_node_name, Error **errp); =20 /* * backup_job_create: diff --git a/qapi/block-core.json b/qapi/block-core.json index 932f5bb..893fa34 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1671,6 +1671,11 @@ # default 'report' (no limitations, since this applies to # a different block device than @device). # +# @filter-node-name: #optional the node name that should be assigned to the +# filter driver that the mirror job inserts into the gr= aph +# above @device. If this option is not given, a node na= me is +# autogenerated. (Since: 2.9) +# # Returns: nothing on success. # # Since: 2.6 @@ -1690,7 +1695,8 @@ 'sync': 'MirrorSyncMode', '*speed': 'int', '*granularity': 'uint32', '*buf-size': 'int', '*on-source-error': 'BlockdevOnError', - '*on-target-error': 'BlockdevOnError' } } + '*on-target-error': 'BlockdevOnError', + '*filter-node-name': 'str' } } =20 ## # @block_set_io_throttle: --=20 1.8.3.1