From: Eric Blake <eblake@redhat.com>
To: Wen Congyang <wency@cn.fujitsu.com>,
qemu devel <qemu-devel@nongnu.org>,
Markus Armbruster <armbru@redhat.com>,
Alberto Garcia <berto@igalia.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
zhanghailiang <zhang.zhanghailiang@huawei.com>,
qemu block <qemu-block@nongnu.org>,
Jiang Yunhong <yunhong.jiang@intel.com>,
Dong Eddie <eddie.dong@intel.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
Gonglei <arei.gonglei@huawei.com>,
Yang Hongyang <yanghy@cn.fujitsu.com>
Subject: Re: [Qemu-devel] [Patch for-2.5 v2 4/6] quorum: implement bdrv_add_child() and bdrv_del_child()
Date: Mon, 31 Aug 2015 12:53:38 -0600 [thread overview]
Message-ID: <55E4A2B2.5060709@redhat.com> (raw)
In-Reply-To: <1439279489-13338-5-git-send-email-wency@cn.fujitsu.com>
[-- Attachment #1: Type: text/plain, Size: 4100 bytes --]
On 08/11/2015 01:51 AM, Wen Congyang wrote:
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
> Signed-off-by: Gonglei <arei.gonglei@huawei.com>
> Reviewed-by: Alberto Garcia <berto@igalia.com>
> ---
> block/quorum.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 73 insertions(+), 2 deletions(-)
>
> diff --git a/block/quorum.c b/block/quorum.c
> index 2f6c45f..1305086 100644
> --- a/block/quorum.c
> +++ b/block/quorum.c
> @@ -66,6 +66,9 @@ typedef struct QuorumVotes {
> typedef struct BDRVQuorumState {
> BlockDriverState **bs; /* children BlockDriverStates */
> int num_children; /* children count */
> + int max_children; /* The maximum children count, we need to reallocate
> + * bs if num_children will larger than maximum.
s/will/grows/
> @@ -995,6 +999,70 @@ static void quorum_attach_aio_context(BlockDriverState *bs,
> }
> }
>
> +static void quorum_add_child(BlockDriverState *bs, QDict *options, Error **errp)
> +{
> + BDRVQuorumState *s = bs->opaque;
> + int ret;
> + Error *local_err = NULL;
> +
> + bdrv_drain(bs);
> +
> + if (s->num_children == s->max_children) {
> + if (s->max_children >= INT_MAX) {
> + error_setg(errp, "Too many children");
> + return;
> + }
> +
> + s->bs = g_renew(BlockDriverState *, s->bs, s->max_children + 1);
> + s->bs[s->num_children] = NULL;
> + s->max_children += 1;
why not use ++?
> + }
> +
> + ret = bdrv_open_image(&s->bs[s->num_children], NULL, options, "child", bs,
> + &child_format, false, &local_err);
> + if (ret < 0) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + s->num_children++;
> +}
> +
> +static void quorum_del_child(BlockDriverState *bs, BlockDriverState *child_bs,
> + Error **errp)
> +{
> + BDRVQuorumState *s = bs->opaque;
> + int i;
> +
> + for (i = 0; i < s->num_children; i++) {
> + if (s->bs[i] == child_bs) {
> + break;
> + }
> + }
> +
> + if (i == s->num_children) {
> + error_setg(errp, "Invalid child");
> + return;
> + }
The previous patch already assert()ed that the child was present; can't
this one just assert(i < s->num_children)?
> +
> + if (s->num_children <= s->threshold) {
> + error_setg(errp,
> + "The number of children cannot be lower than the vote threshold");
> + return;
Might be nice to include the numeric value of that threshold in the
error message.
> + }
> +
> + if (s->num_children == 1) {
> + error_setg(errp, "Cannot remove the last child");
> + return;
> + }
Isn't this dead code, as the vote threshold always has to be at least 1,
so the previous 'if' already rejected an attempt to go lower than the
threshold?
> +
> + bdrv_drain(bs);
> + /* We can safely remove this child now */
> + memmove(&s->bs[i], &s->bs[i+1], (s->num_children - i - 1) * sizeof(void *));
Spaces around '+'.
> + s->num_children--;
> + s->bs[s->num_children] = NULL;
> + bdrv_unref(child_bs);
> +}
> +
> static void quorum_refresh_filename(BlockDriverState *bs)
> {
> BDRVQuorumState *s = bs->opaque;
> @@ -1049,6 +1117,9 @@ static BlockDriver bdrv_quorum = {
> .bdrv_detach_aio_context = quorum_detach_aio_context,
> .bdrv_attach_aio_context = quorum_attach_aio_context,
>
> + .bdrv_add_child = quorum_add_child,
> + .bdrv_del_child = quorum_del_child,
> +
> .is_filter = true,
> .bdrv_recurse_is_first_non_filter = quorum_recurse_is_first_non_filter,
> };
>
Overall seems reasonable.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2015-08-31 18:53 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-11 7:51 [Qemu-devel] [Patch for-2.5 v2 0/6] qapi: child add/delete support Wen Congyang
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 1/6] QAPI: move InetSocketAddress to qapi/common.json Wen Congyang
2015-08-31 17:04 ` Eric Blake
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 2/6] support nbd driver in blockdev-add Wen Congyang
2015-08-31 17:19 ` Eric Blake
2015-09-01 9:35 ` Wen Congyang
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 3/6] Add new block driver interface to add/delete a BDS's child Wen Congyang
2015-08-31 17:40 ` Eric Blake
2015-09-01 0:44 ` Wen Congyang
2015-09-01 15:30 ` Eric Blake
2015-09-08 9:10 ` Wen Congyang
2015-09-08 15:52 ` Eric Blake
2015-09-09 6:14 ` Wen Congyang
2015-09-01 3:06 ` Wen Congyang
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 4/6] quorum: implement bdrv_add_child() and bdrv_del_child() Wen Congyang
2015-08-31 18:53 ` Eric Blake [this message]
2015-09-01 0:48 ` Wen Congyang
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 5/6] qmp: add monitor command to add/remove a child Wen Congyang
2015-08-31 19:04 ` Eric Blake
2015-09-01 0:55 ` Wen Congyang
2015-09-01 15:34 ` Eric Blake
2015-09-02 1:25 ` Wen Congyang
2015-09-02 15:00 ` Eric Blake
2015-09-07 3:55 ` Wen Congyang
2015-09-08 15:53 ` Eric Blake
2015-09-01 5:51 ` Wen Congyang
2015-08-11 7:51 ` [Qemu-devel] [Patch for-2.5 v2 6/6] hmp: " Wen Congyang
2015-08-31 1:09 ` Wen Congyang
2015-08-31 7:07 ` Markus Armbruster
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=55E4A2B2.5060709@redhat.com \
--to=eblake@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=dgilbert@redhat.com \
--cc=eddie.dong@intel.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=wency@cn.fujitsu.com \
--cc=yanghy@cn.fujitsu.com \
--cc=yunhong.jiang@intel.com \
--cc=zhang.zhanghailiang@huawei.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.