From: Fam Zheng <famz@redhat.com>
To: "Benoît Canet" <benoit@irqsave.net>
Cc: kwolf@redhat.com, jcody@redhat.com, qemu-devel@nongnu.org,
stefanha@redhat.com, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH V5 4/7] qmp: Allow to change password on named block driver states.
Date: Tue, 21 Jan 2014 11:27:55 +0800 [thread overview]
Message-ID: <20140121032755.GG29842@T430.redhat.com> (raw)
In-Reply-To: <1386862440-8003-5-git-send-email-benoit@irqsave.net>
On Thu, 12/12 16:33, Benoît Canet wrote:
> There was two candidate ways to implement named node manipulation:
>
> 1)
> { 'command': 'block_passwd', 'data': {'*device': 'str',
> '*node-name': 'str', 'password': 'str'}
> }
>
> 2)
>
> { 'command': 'block_passwd', 'data': {'device': 'str',
> '*device-is-node': 'bool',
> 'password': 'str'} }
>
> Luiz proposed 1 and says 2 was an abuse of the QMP interface and proposed to
> rewrite the QMP block interface for 2.0.
>
> Luiz does not like in 1 the fact that 2 fields are optional but one of them must
> be specified leading to an abuse of the QMP semantic.
>
> Kevin argumented that 2 what a clear abuse of the device field and would not be
> practical when reading fast some log file because the user would read "device"
> and think that a device is manipulated when it's in fact a node name.
> Documentation of 1 make it pretty clear what to do for the user.
>
> Kevin argued that all bs are node including devices ones so 2 does not make
> sense.
>
> Kevin also argued that rewriting the QMP block interface would not make disapear
> the current one.
>
> Kevin pushed the argument that making the QAPI generator compatible with the
> semantic of the operation would need a rewrite that no one has done yet.
>
> A vote has been done on the list to elect the version to use and 1 won.
>
> For reference the complete thread is:
> "[Qemu-devel] [PATCH V4 4/7] qmp: Allow to change password on names block driver
> states."
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> block.c | 32 ++++++++++++++++++++++++++++++++
> blockdev.c | 13 +++++++++----
> hmp.c | 2 +-
> include/block/block.h | 3 +++
> qapi-schema.json | 9 +++++++--
> qmp-commands.hx | 3 ++-
> 6 files changed, 54 insertions(+), 8 deletions(-)
>
> diff --git a/block.c b/block.c
> index 78d13e5..22190a4 100644
> --- a/block.c
> +++ b/block.c
> @@ -3207,6 +3207,38 @@ BlockDeviceInfoList *bdrv_named_nodes_list(void)
> return list;
> }
>
> +BlockDriverState *bdrv_lookup_bs(bool has_device, const char *device,
> + bool has_node_name, const char *node_name,
> + Error **errp)
> +{
> + BlockDriverState *bs = NULL;
> +
> + if (has_device == has_node_name) {
> + error_setg(errp, "Use either device or node-name but not both");
> + return NULL;
> + }
> +
> + if (has_device) {
> + bs = bdrv_find(device);
> +
> + if (!bs) {
> + error_set(errp, QERR_DEVICE_NOT_FOUND, device);
> + return NULL;
> + }
> +
> + return bs;
> + }
> +
> + bs = bdrv_find_node(node_name);
> +
> + if (!bs) {
> + error_set(errp, QERR_DEVICE_NOT_FOUND, node_name);
> + return NULL;
> + }
> +
> + return bs;
> +}
> +
> BlockDriverState *bdrv_next(BlockDriverState *bs)
> {
> if (!bs) {
> diff --git a/blockdev.c b/blockdev.c
> index 204ab40..838df50 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1474,14 +1474,19 @@ void qmp_eject(const char *device, bool has_force, bool force, Error **errp)
> eject_device(bs, force, errp);
> }
>
> -void qmp_block_passwd(const char *device, const char *password, Error **errp)
> +void qmp_block_passwd(bool has_device, const char *device,
> + bool has_node_name, const char *node_name,
> + const char *password, Error **errp)
> {
> + Error *local_err = NULL;
> BlockDriverState *bs;
> int err;
>
> - bs = bdrv_find(device);
> - if (!bs) {
> - error_set(errp, QERR_DEVICE_NOT_FOUND, device);
> + bs = bdrv_lookup_bs(has_device, device,
> + has_node_name, node_name,
> + &local_err);
> + if (error_is_set(&local_err)) {
> + error_propagate(errp, local_err);
> return;
> }
>
> diff --git a/hmp.c b/hmp.c
> index 32ee285..3820fbe 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -870,7 +870,7 @@ void hmp_block_passwd(Monitor *mon, const QDict *qdict)
> const char *password = qdict_get_str(qdict, "password");
> Error *errp = NULL;
>
> - qmp_block_passwd(device, password, &errp);
> + qmp_block_passwd(true, device, false, NULL, password, &errp);
> hmp_handle_error(mon, &errp);
> }
>
> diff --git a/include/block/block.h b/include/block/block.h
> index 8c10123..f7d8017 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -376,6 +376,9 @@ const char *bdrv_get_format_name(BlockDriverState *bs);
> BlockDriverState *bdrv_find(const char *name);
> BlockDriverState *bdrv_find_node(const char *node_name);
> BlockDeviceInfoList *bdrv_named_nodes_list(void);
> +BlockDriverState *bdrv_lookup_bs(bool has_device, const char *device,
> + bool has_node_name, const char *node_name,
> + Error **errp);
> BlockDriverState *bdrv_next(BlockDriverState *bs);
> void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
> void *opaque);
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 0dadd5d..903fcb6 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1676,7 +1676,11 @@
> # determine which ones are encrypted, set the passwords with this command, and
> # then start the guest with the @cont command.
> #
> -# @device: the name of the device to set the password on
> +# Either @device or @node-name must be set but not both.
> +#
> +# @device: #optional the name of the block backend device to set the password on
> +#
> +# @node-name: #optional graph node name to set the password on (Since 2.0)
> #
> # @password: the password to use for the device
> #
> @@ -1690,7 +1694,8 @@
> #
> # Since: 0.14.0
> ##
> -{ 'command': 'block_passwd', 'data': {'device': 'str', 'password': 'str'} }
> +{ 'command': 'block_passwd', 'data': {'*device': 'str',
> + '*node-name': 'str', 'password': 'str'} }
>
> ##
> # @balloon:
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index d644fe9..1451c1a 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -1452,7 +1452,7 @@ EQMP
>
> {
> .name = "block_passwd",
> - .args_type = "device:B,password:s",
> + .args_type = "device:s?,node-name:s?,password:s",
> .mhandler.cmd_new = qmp_marshal_input_block_passwd,
> },
>
> @@ -1465,6 +1465,7 @@ Set the password of encrypted block devices.
> Arguments:
>
> - "device": device name (json-string)
> +- "node-name": name in the block driver state graph (json-string)
> - "password": password (json-string)
>
> Example:
> --
> 1.8.3.2
>
>
Reviewed-by: Fam Zheng <famz@redhat.com>
next prev parent reply other threads:[~2014-01-21 3:28 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-12 15:33 [Qemu-devel] [PATCH V5 0/7] Giving names to BlockDriverState graph nodes Benoît Canet
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 1/7] block: Add bs->node_name to hold the name of a bs node of the bs graph Benoît Canet
2014-01-21 3:10 ` Fam Zheng
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 2/7] block: Allow the user to define "node-name" option Benoît Canet
2014-01-21 3:15 ` Fam Zheng
2014-01-21 14:12 ` Kevin Wolf
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 3/7] qmp: Add a command to list the named BlockDriverState nodes Benoît Canet
2014-01-21 3:23 ` Fam Zheng
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 4/7] qmp: Allow to change password on named block driver states Benoît Canet
2014-01-21 3:27 ` Fam Zheng [this message]
2014-01-21 14:17 ` Kevin Wolf
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 5/7] block: Create authorizations mechanism for external snapshot and resize Benoît Canet
2014-01-21 3:45 ` Fam Zheng
2013-12-12 15:33 ` [Qemu-devel] [PATCH V5 6/7] qmp: Allow block_resize to manipulate bs graph nodes Benoît Canet
2014-01-21 3:46 ` Fam Zheng
2013-12-12 15:34 ` [Qemu-devel] [PATCH V5 7/7] qmp: Allow to take external snapshots on bs graphs node Benoît Canet
2014-01-21 3:54 ` Fam Zheng
2014-01-21 14:28 ` Kevin Wolf
2014-01-22 21:33 ` Benoît Canet
2014-01-23 10:20 ` Kevin Wolf
2014-01-16 17:18 ` [Qemu-devel] [PATCH V5 0/7] Giving names to BlockDriverState graph nodes Benoît Canet
2014-01-21 4:04 ` Fam Zheng
2014-01-21 14:33 ` Kevin Wolf
2014-01-21 15:36 ` Benoît Canet
2014-01-21 15:44 ` Kevin Wolf
2014-01-22 21:44 ` Benoît Canet
2014-01-23 10:14 ` Kevin Wolf
2014-01-22 22:03 ` Benoît Canet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140121032755.GG29842@T430.redhat.com \
--to=famz@redhat.com \
--cc=armbru@redhat.com \
--cc=benoit@irqsave.net \
--cc=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.