On Tue 30 Jun 2015 05:34:30 AM CEST, Wen Congyang wrote:

> +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 / 2) {
> +            error_setg(errp, "Too many children");
> +            return;
> +        }
> +
> +        s->bs = g_renew(BlockDriverState *, s->bs, s->max_children * 2);
> +        memset(&s->bs[s->max_children], 0, s->max_children * sizeof(void *));
> +        s->max_children *= 2;
> +    }
> +
> +    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++;
> +
> +    /* TODO: Update vote_threshold */
> +}

A few comments:

1) Is there any reason why you grow the array exponentially instead of
   adding a fixed number of elements when the limit is reached? I guess
   in practice the number of children is never going to be too high
   anyway...

2) Did you think of any API to update vote_threshold? Currently it
   cannot be higher than num_children, so it's effectively limited by
   the number of children that are attached when the quorum device is
   created.

3) I don't think it's necessary to set to NULL the pointers in s->bs[i]
   when i >= num_children. There's no way to access those pointers
   anyway. Same for the ' s->bs[s->num_children] = NULL; ' bit in
   quorum_del_child(). I also think that using memset() for setting NULL
   pointers is not portable, although QEMU is already doing this in a
   few places.

Otherwise the code looks good to me. Thanks!

Berto

Reply via email to