All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: pbonzini@redhat.com, aliguori@us.ibm.com, qemu-devel@nongnu.org,
	armbru@redhat.com, mdroth@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH 09/16] qemu-option: qemu_opts_from_qdict(): use error_set()
Date: Fri, 18 May 2012 16:43:16 +0200	[thread overview]
Message-ID: <4FB66004.70500@redhat.com> (raw)
In-Reply-To: <1337265221-7136-10-git-send-email-lcapitulino@redhat.com>

comments in-line

On 05/17/12 16:33, Luiz Capitulino wrote:
> do_device_add() and do_netdev_add() call qerror_report_err() to maintain
> their QError semantics.
> 
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  hw/qdev-monitor.c |    7 +++++--
>  net.c             |    5 ++++-
>  qemu-option.c     |   31 ++++++++++++++++++++++++-------
>  qemu-option.h     |    3 ++-
>  4 files changed, 35 insertions(+), 11 deletions(-)
> 
> diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
> index eed781d..b01ef06 100644
> --- a/hw/qdev-monitor.c
> +++ b/hw/qdev-monitor.c
> @@ -554,10 +554,13 @@ void do_info_qdm(Monitor *mon)
>  
>  int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
>  {
> +    Error *local_err = NULL;
>      QemuOpts *opts;
>  
> -    opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict);
> -    if (!opts) {
> +    opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_err);
> +    if (error_is_set(&local_err)) {
> +        qerror_report_err(local_err);
> +        error_free(local_err);
>          return -1;
>      }
>      if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
> diff --git a/net.c b/net.c
> index f5d9cc7..246209f 100644
> --- a/net.c
> +++ b/net.c
> @@ -1237,11 +1237,14 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
>  
>  int do_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
>  {
> +    Error *local_err = NULL;
>      QemuOpts *opts;
>      int res;
>  
> -    opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict);
> +    opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &local_err);
>      if (!opts) {
> +        qerror_report_err(local_err);
> +        error_free(local_err);
>          return -1;
>      }

AFAICS the error condition is not the same in these two callers, but
looking at the new qemu_opts_from_qdict() below, they should be
equivalent. OK.


>  
> diff --git a/qemu-option.c b/qemu-option.c
> index afee3fb..a26c40a 100644
> --- a/qemu-option.c
> +++ b/qemu-option.c
> @@ -971,13 +971,19 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
>      assert(opts);
>  }
>  
> +typedef struct OptsFromQDictState {
> +    QemuOpts *opts;
> +    Error **errp;
> +} OptsFromQDictState;
> +
>  static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
>  {
> +    OptsFromQDictState *state = opaque;
>      char buf[32];
>      const char *value;
>      int n;
>  
> -    if (!strcmp(key, "id")) {
> +    if (!strcmp(key, "id") || error_is_set(state->errp)) {
>          return;
>      }

(Could have reversed the order, but I'm splitting hairs.)


>  
> @@ -1005,7 +1011,8 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
>      default:
>          return;
>      }
> -    qemu_opt_set(opaque, key, value);
> +
> +    qemu_opt_set_err(state->opts, key, value, state->errp);
>  }

Aha. qemu_opt_set() did report errors, we just didn't care in
qemu_opts_from_qdict_1(), and certainly didn't try to pass those
outwards, for stopping the iteration (or at least making the rest of the
iteration a no-op) or otherwise. This changed now.


>  
>  /*
> @@ -1014,21 +1021,31 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
>   * Only QStrings, QInts, QFloats and QBools are copied.  Entries with
>   * other types are silently ignored.
>   */
> -QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict)
> +QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
> +                               Error **errp)
>  {
> -    QemuOpts *opts;
> +    OptsFromQDictState state;
>      Error *local_err = NULL;
> +    QemuOpts *opts;
>  
>      opts = qemu_opts_create(list, qdict_get_try_str(qdict, "id"), 1,
>                              &local_err);
>      if (error_is_set(&local_err)) {
> -        qerror_report_err(local_err);
> -        error_free(local_err);
> +        error_propagate(errp, local_err);
>          return NULL;
>      }
>  
>      assert(opts != NULL);
> -    qdict_iter(qdict, qemu_opts_from_qdict_1, opts);
> +
> +    state.errp = &local_err;
> +    state.opts = opts;
> +    qdict_iter(qdict, qemu_opts_from_qdict_1, &state);
> +    if (error_is_set(&local_err)) {
> +        error_propagate(errp, local_err);
> +        qemu_opts_del(opts);
> +        return NULL;
> +    }
> +
>      return opts;
>  }

Yes, this is new error handling here (and another possibility to return
NULL to our callers). Seems correct. Our callers had to handle NULL before.

>  
> diff --git a/qemu-option.h b/qemu-option.h
> index c0e022b..951dec3 100644
> --- a/qemu-option.h
> +++ b/qemu-option.h
> @@ -132,7 +132,8 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname
>  QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, int permit_abbrev);
>  void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
>                              int permit_abbrev);
> -QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict);
> +QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
> +                               Error **errp);
>  QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
>  
>  typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque);

Good.

Laszlo

  reply	other threads:[~2012-05-18 14:42 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-17 14:33 [Qemu-devel] [PATCH qmp-next v4 00/16]: qapi: convert netdev_add & netdev_del Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 01/16] qemu-option: qemu_opts_create(): use error_set() Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 02/16] qemu-option: parse_option_number(): " Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 03/16] qemu-option: parse_option_bool(): " Luiz Capitulino
2012-05-18 13:59   ` Laszlo Ersek
2012-05-17 14:33 ` [Qemu-devel] [PATCH 04/16] qemu-option: parse_option_size(): " Luiz Capitulino
2012-05-18 14:03   ` Laszlo Ersek
2012-05-18 14:49     ` Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 05/16] qemu-option: qemu_opt_parse(): " Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 06/16] qemu-option: qemu_opts_validate(): " Luiz Capitulino
2012-05-18 14:18   ` Laszlo Ersek
2012-05-17 14:33 ` [Qemu-devel] [PATCH 07/16] qemu-option: opt_set(): " Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 08/16] qemu-option: introduce qemu_opt_set_err() Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 09/16] qemu-option: qemu_opts_from_qdict(): use error_set() Luiz Capitulino
2012-05-18 14:43   ` Laszlo Ersek [this message]
2012-05-18 14:51     ` Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 10/16] qerror: introduce QERR_INVALID_OPTION_GROUP Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 11/16] qemu-config: find_list(): use error_set() Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 12/16] qemu-config: introduce qemu_find_opts_err() Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 13/16] net: purge the monitor object from all init functions Luiz Capitulino
2012-05-17 14:33 ` [Qemu-devel] [PATCH 14/16] net: net_client_init(): use error_set() Luiz Capitulino
2012-05-18 15:09   ` Laszlo Ersek
2012-05-17 14:33 ` [Qemu-devel] [PATCH 15/16] qapi: convert netdev_add Luiz Capitulino
2012-05-18 15:51   ` Laszlo Ersek
2012-05-18 17:41     ` Luiz Capitulino
2012-05-18 17:48       ` Paolo Bonzini
2012-05-17 14:33 ` [Qemu-devel] [PATCH 16/16] qapi: convert netdev_del Luiz Capitulino
2012-05-18 16:15   ` Laszlo Ersek
2012-05-18 17:49     ` Luiz Capitulino
  -- strict thread matches above, loose matches on Subject: below --
2012-05-21 17:41 [Qemu-devel] [PATCH qmp-next v5 00/16]: qapi: convert netdev_add & netdev_del Luiz Capitulino
2012-05-21 17:41 ` [Qemu-devel] [PATCH 09/16] qemu-option: qemu_opts_from_qdict(): use error_set() Luiz Capitulino

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=4FB66004.70500@redhat.com \
    --to=lersek@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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.