All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends
@ 2018-10-08 17:30 Markus Armbruster
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
                   ` (30 more replies)
  0 siblings, 31 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() or similar in a function that takes an Error **
argument is suspicious.  Fux a number of instances that are actually
wrong.  Clean up a few more that are merely fragile / bad examples.

Markus Armbruster (31):
  Use error_fatal to simplify obvious fatal errors (again)
  block: Use warn_report() & friends to report warnings
  cpus hw target: Use warn_report() & friends to report warnings
  vfio: Use warn_report() & friends to report warnings
  vfio: Clean up error reporting after previous commit
  char: Use error_printf() to print help and such
  9pfs: Fix CLI parsing crash on error
  pc: Fix machine property nvdimm-persistence error handling
  ioapic: Fix error handling in realize()
  smbios: Clean up error handling in smbios_add()
  migration: Fix !replay_can_snapshot() error handling
  l2tpv3: Improve -netdev/netdev_add/-net/... error reporting
  net/socket: Fix invalid socket type error handling
  numa: Fix QMP command set-numa-node error handling
  xen/pt: Fix incomplete conversion to realize()
  seccomp: Clean up error reporting in parse_sandbox()
  vl: Clean up error reporting in parse_add_fd()
  qom: Clean up error reporting in user_creatable_add_opts_foreach()
  vl: Clean up error reporting in parse_add_fd()
  vl: Clean up error reporting in machine_set_property()
  vl: Clean up error reporting in mon_init_func()
  vl: Clean up error reporting in parse_fw_cfg()
  vl: Clean up error reporting in device_init_func()
  vl: Clean up error reporting in vnc_init_func()
  numa: Clean up error reporting in parse_numa()
  tpm: Clean up error reporting in tpm_init_tpmdev()
  spice: Clean up error reporting in add_channel()
  fsdev: Clean up error reporting in qemu_fsdev_add()
  vl: Assert drive_new() does not fail in default_drive()
  blockdev: Convert drive_new() to Error
  vl: Simplify call of parse_name()

 block/bochs.c                            |   8 +-
 block/cloop.c                            |   8 +-
 block/dmg.c                              |   8 +-
 block/iscsi.c                            |   2 +-
 block/rbd.c                              |  12 +-
 block/sheepdog.c                         |   2 +-
 block/vvfat.c                            |   8 +-
 blockdev.c                               |  27 ++---
 chardev/char-pty.c                       |   2 +-
 chardev/char.c                           |   2 +-
 cpus.c                                   |   8 +-
 device-hotplug.c                         |   5 +-
 fsdev/qemu-fsdev-dummy.c                 |   2 +-
 fsdev/qemu-fsdev.c                       |  12 +-
 fsdev/qemu-fsdev.h                       |   2 +-
 hw/9pfs/9p-handle.c                      |   6 +-
 hw/9pfs/xen-9p-backend.c                 |   7 +-
 hw/display/cg3.c                         |   2 +-
 hw/display/tcx.c                         |   2 +-
 hw/i386/pc.c                             |   5 +-
 hw/intc/ioapic.c                         |   8 +-
 hw/intc/xics_kvm.c                       |   7 +-
 hw/misc/ivshmem.c                        |   4 +-
 hw/net/virtio-net.c                      |   8 +-
 hw/smbios/smbios.c                       |  90 ++++++++++-----
 hw/vfio/pci-quirks.c                     |   4 +-
 hw/vfio/pci.c                            |  22 ++--
 hw/vfio/platform.c                       |   6 +-
 hw/virtio/virtio-pci.c                   |   4 +-
 hw/xen/xen_pt.c                          |   2 +-
 include/hw/vfio/vfio-common.h            |   3 +-
 include/sysemu/blockdev.h                |   3 +-
 include/sysemu/numa.h                    |   1 -
 include/sysemu/tpm.h                     |   2 +-
 migration/savevm.c                       |   8 +-
 net/l2tpv3.c                             |  26 ++---
 net/socket.c                             |   4 +-
 numa.c                                   |  21 ++--
 qemu-io.c                                |   8 +-
 qemu-nbd.c                               |  14 +--
 qemu-seccomp.c                           |  18 +--
 qom/object_interfaces.c                  |   4 +-
 scripts/coccinelle/use-error_fatal.cocci |  20 ++++
 stubs/tpm.c                              |   3 +-
 target/i386/cpu.c                        |  17 +--
 target/ppc/translate_init.inc.c          |   4 +-
 tpm.c                                    |  22 ++--
 ui/spice-core.c                          |  13 ++-
 ui/vnc.c                                 |   5 +-
 vl.c                                     | 140 +++++++++--------------
 50 files changed, 317 insertions(+), 304 deletions(-)
 create mode 100644 scripts/coccinelle/use-error_fatal.cocci

-- 
2.17.1

^ permalink raw reply	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again)
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
@ 2018-10-08 17:30 ` Markus Armbruster
  2018-10-08 20:32   ` Eric Blake
  2018-10-08 22:25   ` David Gibson
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings Markus Armbruster
                   ` (29 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: David Gibson, Alexander Graf, Eric Blake, Paolo Bonzini

Add a slight improvement of the Coccinelle semantic patch from commit
07d04a0219b, and use it to clean up.  It leaves dead Error * variables
behind, cleaned up manually.

Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: Alexander Graf <agraf@suse.de>
Cc: Eric Blake <eblake@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/intc/xics_kvm.c                       |  7 +------
 qemu-nbd.c                               |  6 +-----
 scripts/coccinelle/use-error_fatal.cocci | 20 ++++++++++++++++++++
 vl.c                                     |  7 +------
 4 files changed, 23 insertions(+), 17 deletions(-)
 create mode 100644 scripts/coccinelle/use-error_fatal.cocci

diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index 30c3769a20..e8fa9a53ae 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -198,17 +198,12 @@ static void ics_get_kvm_state(ICSState *ics)
 {
     uint64_t state;
     int i;
-    Error *local_err = NULL;
 
     for (i = 0; i < ics->nr_irqs; i++) {
         ICSIRQState *irq = &ics->irqs[i];
 
         kvm_device_access(kernel_xics_fd, KVM_DEV_XICS_GRP_SOURCES,
-                          i + ics->offset, &state, false, &local_err);
-        if (local_err) {
-            error_report_err(local_err);
-            exit(1);
-        }
+                          i + ics->offset, &state, false, &error_fatal);
 
         irq->server = state & KVM_XICS_DESTINATION_MASK;
         irq->saved_priority = (state >> KVM_XICS_PRIORITY_SHIFT)
diff --git a/qemu-nbd.c b/qemu-nbd.c
index e76fe3082a..7874bc973c 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -1002,11 +1002,7 @@ int main(int argc, char **argv)
     }
 
     exp = nbd_export_new(bs, dev_offset, fd_size, nbdflags, nbd_export_closed,
-                         writethrough, NULL, &local_err);
-    if (!exp) {
-        error_report_err(local_err);
-        exit(EXIT_FAILURE);
-    }
+                         writethrough, NULL, &error_fatal);
     nbd_export_set_name(exp, export_name);
     nbd_export_set_description(exp, export_description);
 
diff --git a/scripts/coccinelle/use-error_fatal.cocci b/scripts/coccinelle/use-error_fatal.cocci
new file mode 100644
index 0000000000..10fff0aec4
--- /dev/null
+++ b/scripts/coccinelle/use-error_fatal.cocci
@@ -0,0 +1,20 @@
+@@
+type T;
+identifier FUN, RET;
+expression list ARGS;
+expression ERR, EC, FAIL;
+@@
+(
+-    T RET = FUN(ARGS, &ERR);
++    T RET = FUN(ARGS, &error_fatal);
+|
+-    RET = FUN(ARGS, &ERR);
++    RET = FUN(ARGS, &error_fatal);
+|
+-    FUN(ARGS, &ERR);
++    FUN(ARGS, &error_fatal);
+)
+-    if (FAIL) {
+-        error_report_err(ERR);
+-        exit(EC);
+-    }
diff --git a/vl.c b/vl.c
index a867c9c4d9..9d2b38a31f 100644
--- a/vl.c
+++ b/vl.c
@@ -2002,15 +2002,10 @@ static void select_vgahw(const char *p)
 
 static void parse_display_qapi(const char *optarg)
 {
-    Error *err = NULL;
     DisplayOptions *opts;
     Visitor *v;
 
-    v = qobject_input_visitor_new_str(optarg, "type", &err);
-    if (!v) {
-        error_report_err(err);
-        exit(1);
-    }
+    v = qobject_input_visitor_new_str(optarg, "type", &error_fatal);
 
     visit_type_DisplayOptions(v, NULL, &opts, &error_fatal);
     QAPI_CLONE_MEMBERS(DisplayOptions, &dpy, opts);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
@ 2018-10-08 17:30 ` Markus Armbruster
  2018-10-08 20:35   ` Eric Blake
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
                   ` (28 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Ronnie Sahlberg, Paolo Bonzini, Peter Lieven,
	Hitoshi Mitake, Liu Yuan

Calling error_report() in a function that takes an Error ** argument
is suspicious.  Convert a few that are actually warnings to
warn_report().

While there, split warnings consisting of multiple sentences to
conform to conventions spelled out in warn_report()'s contract, and
improve a rather useless warning in sheepdog.c.

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Ronnie Sahlberg <ronniesahlberg@gmail.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Lieven <pl@kamp.de>
Cc: Hitoshi Mitake <mitake.hitoshi@lab.ntt.co.jp>
Cc: Liu Yuan <namei.unix@gmail.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/bochs.c    |  8 ++++----
 block/cloop.c    |  8 ++++----
 block/dmg.c      |  8 ++++----
 block/iscsi.c    |  2 +-
 block/rbd.c      | 12 ++++++------
 block/sheepdog.c |  2 +-
 block/vvfat.c    |  8 ++++----
 7 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/block/bochs.c b/block/bochs.c
index 50c630047b..36c1b45bd2 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -112,10 +112,10 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     if (!bdrv_is_read_only(bs)) {
-        error_report("Opening bochs images without an explicit read-only=on "
-                     "option is deprecated. Future versions will refuse to "
-                     "open the image instead of automatically marking the "
-                     "image read-only.");
+        warn_report("Opening bochs images without an explicit read-only=on "
+                    "option is deprecated");
+        error_printf("Future versions may refuse to open the image "
+                     "instead of automatically marking it read-only.\n");
         ret = bdrv_set_read_only(bs, true, errp); /* no write support yet */
         if (ret < 0) {
             return ret;
diff --git a/block/cloop.c b/block/cloop.c
index 2be68987bd..a558e67cb0 100644
--- a/block/cloop.c
+++ b/block/cloop.c
@@ -74,10 +74,10 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     if (!bdrv_is_read_only(bs)) {
-        error_report("Opening cloop images without an explicit read-only=on "
-                     "option is deprecated. Future versions will refuse to "
-                     "open the image instead of automatically marking the "
-                     "image read-only.");
+        warn_report("Opening cloop images without an explicit read-only=on "
+                    "option is deprecated");
+        error_printf("Future versions may refuse to open the image "
+                     "instead of automatically marking it read-only.\n");
         ret = bdrv_set_read_only(bs, true, errp);
         if (ret < 0) {
             return ret;
diff --git a/block/dmg.c b/block/dmg.c
index c9b3c519c4..9fb814460d 100644
--- a/block/dmg.c
+++ b/block/dmg.c
@@ -420,10 +420,10 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     if (!bdrv_is_read_only(bs)) {
-        error_report("Opening dmg images without an explicit read-only=on "
-                     "option is deprecated. Future versions will refuse to "
-                     "open the image instead of automatically marking the "
-                     "image read-only.");
+        warn_report("Opening dmg images without an explicit read-only=on "
+                    "option is deprecated");
+        error_printf("Future versions may refuse to open the image "
+                     "instead of automatically marking it read-only.\n");
         ret = bdrv_set_read_only(bs, true, errp);
         if (ret < 0) {
             return ret;
diff --git a/block/iscsi.c b/block/iscsi.c
index bb69faf34a..73998c2860 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1844,7 +1844,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     iscsi_set_timeout(iscsi, timeout);
 #else
     if (timeout) {
-        error_report("iSCSI: ignoring timeout value for libiscsi <1.15.0");
+        warn_report("iSCSI: ignoring timeout value for libiscsi <1.15.0");
     }
 #endif
 
diff --git a/block/rbd.c b/block/rbd.c
index 014c68d629..6e26bac170 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -750,8 +750,8 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
         /* Take care whenever deciding to actually deprecate; once this ability
          * is removed, we will not be able to open any images with legacy-styled
          * backing image strings. */
-        error_report("RBD options encoded in the filename as keyvalue pairs "
-                     "is deprecated");
+        warn_report("RBD options encoded in the filename as keyvalue pairs "
+                    "is deprecated");
     }
 
     /* Remove the processed options from the QDict (the visitor processes
@@ -781,10 +781,10 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
      * leave as-is */
     if (s->snap != NULL) {
         if (!bdrv_is_read_only(bs)) {
-            error_report("Opening rbd snapshots without an explicit "
-                         "read-only=on option is deprecated. Future versions "
-                         "will refuse to open the image instead of "
-                         "automatically marking the image read-only.");
+            warn_report("Opening rbd snapshots without an explicit "
+                        "read-only=on option is deprecated");
+            error_printf("Future versions may refuse to open the image "
+                         "instead of automatically marking it read-only.\n");
             r = bdrv_set_read_only(bs, true, &local_err);
             if (r < 0) {
                 error_propagate(errp, local_err);
diff --git a/block/sheepdog.c b/block/sheepdog.c
index b229a664d9..0125df9d49 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -572,7 +572,7 @@ static int connect_to_sdog(BDRVSheepdogState *s, Error **errp)
     if (s->addr->type == SOCKET_ADDRESS_TYPE_INET && fd >= 0) {
         int ret = socket_set_nodelay(fd);
         if (ret < 0) {
-            error_report("%s", strerror(errno));
+            warn_report("can't set TCP_NODELAY: %s", strerror(errno));
         }
     }
 
diff --git a/block/vvfat.c b/block/vvfat.c
index fc41841a5c..8f3f9e9a93 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1263,10 +1263,10 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
             goto fail;
         }
     } else  if (!bdrv_is_read_only(bs)) {
-        error_report("Opening non-rw vvfat images without an explicit "
-                     "read-only=on option is deprecated. Future versions "
-                     "will refuse to open the image instead of "
-                     "automatically marking the image read-only.");
+        warn_report("Opening non-rw vvfat images without an explicit "
+                    "read-only=on option is deprecated");
+        error_printf("Future versions may refuse to open the image "
+                     "instead of automatically marking it read-only.\n");
         /* read only is the default for safety */
         ret = bdrv_set_read_only(bs, true, &local_err);
         if (ret < 0) {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 03/31] cpus hw target: Use warn_report() & friends to report warnings
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings Markus Armbruster
@ 2018-10-08 17:30 ` Markus Armbruster
  2018-10-08 22:25   ` David Gibson
  2018-10-09  9:56   ` Alex Bennée
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 04/31] vfio: " Markus Armbruster
                   ` (27 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alex Bennée, Mark Cave-Ayland, Alex Williamson, Fam Zheng,
	Wei Huang, David Gibson

Calling error_report() in a function that takes an Error ** argument
is suspicious.  Convert a few that are actually warnings to
warn_report().

While there, split a warning consisting of multiple sentences to
conform to conventions spelled out in warn_report()'s contract.

Cc: Alex Bennée <alex.bennee@linaro.org>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: Alex Williamson <alex.williamson@redhat.com>
Cc: Fam Zheng <famz@redhat.com>
Cc: Wei Huang <wei@redhat.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 cpus.c                          |  8 ++++----
 hw/display/cg3.c                |  2 +-
 hw/display/tcx.c                |  2 +-
 hw/misc/ivshmem.c               |  4 ++--
 hw/net/virtio-net.c             |  8 ++++----
 hw/virtio/virtio-pci.c          |  4 ++--
 target/i386/cpu.c               | 17 +++++++++--------
 target/ppc/translate_init.inc.c |  4 ++--
 8 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/cpus.c b/cpus.c
index 361678e459..7804071872 100644
--- a/cpus.c
+++ b/cpus.c
@@ -211,12 +211,12 @@ void qemu_tcg_configure(QemuOpts *opts, Error **errp)
                 error_setg(errp, "No MTTCG when icount is enabled");
             } else {
 #ifndef TARGET_SUPPORTS_MTTCG
-                error_report("Guest not yet converted to MTTCG - "
-                             "you may get unexpected results");
+                warn_report("Guest not yet converted to MTTCG - "
+                            "you may get unexpected results");
 #endif
                 if (!check_tcg_memory_orders_compatible()) {
-                    error_report("Guest expects a stronger memory ordering "
-                                 "than the host provides");
+                    warn_report("Guest expects a stronger memory ordering "
+                                "than the host provides");
                     error_printf("This may cause strange/hard to debug errors\n");
                 }
                 mttcg_enabled = true;
diff --git a/hw/display/cg3.c b/hw/display/cg3.c
index 1c199ab369..e50d97e48c 100644
--- a/hw/display/cg3.c
+++ b/hw/display/cg3.c
@@ -307,7 +307,7 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
         ret = load_image_mr(fcode_filename, &s->rom);
         g_free(fcode_filename);
         if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
-            error_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
+            warn_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
         }
     }
 
diff --git a/hw/display/tcx.c b/hw/display/tcx.c
index b2786ee8d0..66f2459226 100644
--- a/hw/display/tcx.c
+++ b/hw/display/tcx.c
@@ -823,7 +823,7 @@ static void tcx_realizefn(DeviceState *dev, Error **errp)
         ret = load_image_mr(fcode_filename, &s->rom);
         g_free(fcode_filename);
         if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
-            error_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
+            warn_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
         }
     }
 
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index 6febbabcaa..4794518b2c 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -1292,8 +1292,8 @@ static void ivshmem_realize(PCIDevice *dev, Error **errp)
     IVShmemState *s = IVSHMEM_COMMON(dev);
 
     if (!qtest_enabled()) {
-        error_report("ivshmem is deprecated, please use ivshmem-plain"
-                     " or ivshmem-doorbell instead");
+        warn_report("ivshmem is deprecated, please use ivshmem-plain"
+                    " or ivshmem-doorbell instead");
     }
 
     if (qemu_chr_fe_backend_connected(&s->server_chr) + !!s->shmobj != 1) {
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 4bdd5b8532..385b1a03e9 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -2020,10 +2020,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
 
     if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer")
                        && strcmp(n->net_conf.tx, "bh")) {
-        error_report("virtio-net: "
-                     "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
-                     n->net_conf.tx);
-        error_report("Defaulting to \"bh\"");
+        warn_report("virtio-net: "
+                    "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
+                    n->net_conf.tx);
+        error_printf("Defaulting to \"bh\"");
     }
 
     n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n),
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 3a01fe90f0..a954799267 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1683,8 +1683,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
         if (err) {
             /* Notice when a system that supports MSIx can't initialize it */
             if (err != -ENOTSUP) {
-                error_report("unable to init msix vectors to %" PRIu32,
-                             proxy->nvectors);
+                warn_report("unable to init msix vectors to %" PRIu32,
+                            proxy->nvectors);
             }
             proxy->nvectors = 0;
         }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index c88876dfe3..9d4217afba 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -5123,14 +5123,15 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
      * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
      * cs->nr_threads hasn't be populated yet and the checking is incorrect.
      */
-     if (IS_AMD_CPU(env) &&
-         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
-         cs->nr_threads > 1 && !ht_warned) {
-            error_report("This family of AMD CPU doesn't support "
-                         "hyperthreading(%d). Please configure -smp "
-                         "options properly or try enabling topoext feature.",
-                         cs->nr_threads);
-        ht_warned = true;
+    if (IS_AMD_CPU(env) &&
+        !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
+        cs->nr_threads > 1 && !ht_warned) {
+            warn_report("This family of AMD CPU doesn't support "
+                        "hyperthreading(%d)",
+                        cs->nr_threads);
+            error_printf("Please configure -smp options properly"
+                         " or try enabling topoext feature.\n");
+            ht_warned = true;
     }
 
     x86_cpu_apic_realize(cpu, &local_err);
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index 263e63cb03..ee9432eb15 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8381,8 +8381,8 @@ static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name,
     QNull *null = NULL;
 
     if (!qtest_enabled()) {
-        error_report("CPU 'compat' property is deprecated and has no effect; "
-                     "use max-cpu-compat machine property instead");
+        warn_report("CPU 'compat' property is deprecated and has no effect; "
+                    "use max-cpu-compat machine property instead");
     }
     visit_type_null(v, name, &null, NULL);
     qobject_unref(null);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 04/31] vfio: Use warn_report() & friends to report warnings
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (2 preceding siblings ...)
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
@ 2018-10-08 17:30 ` Markus Armbruster
  2018-10-08 19:04   ` Alex Williamson
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit Markus Armbruster
                   ` (26 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Williamson

The vfio code reports warnings like

    error_report(WARN_PREFIX "Could not frobnicate", DEV-NAME);

where WARN_PREFIX is defined so the message comes out as

    vfio warning: DEV-NAME: Could not frobnicate

This usage predates the introduction of warn_report() & friends in
commit 97f40301f1d.  It's time to convert to that interface.  Since
these functions already prefix the message with "warning: ", replace
WARN_PREFIX by VFIO_MSG_PREFIX, so the messages come out like

    warning: vfio DEV-NAME: Could not frobnicate

The next commit will replace ERR_PREFIX.

Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/vfio/pci.c                 | 14 +++++++-------
 hw/vfio/platform.c            |  4 ++--
 include/hw/vfio/vfio-common.h |  2 +-
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 866f0deeb7..36f1182249 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -249,7 +249,7 @@ static void vfio_intx_update(PCIDevice *pdev)
 
     vfio_intx_enable_kvm(vdev, &err);
     if (err) {
-        error_reportf_err(err, WARN_PREFIX, vdev->vbasedev.name);
+        warn_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     }
 
     /* Re-enable the interrupt in cased we missed an EOI */
@@ -314,7 +314,7 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp)
 
     vfio_intx_enable_kvm(vdev, &err);
     if (err) {
-        error_reportf_err(err, WARN_PREFIX, vdev->vbasedev.name);
+        warn_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     }
 
     vdev->interrupt = VFIO_INT_INTx;
@@ -1555,7 +1555,7 @@ static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos, Error **errp)
                     &err);
     if (ret < 0) {
         if (ret == -ENOTSUP) {
-            error_report_err(err);
+            warn_report_err(err);
             return 0;
         }
 
@@ -2588,9 +2588,9 @@ static void vfio_populate_device(VFIOPCIDevice *vdev, Error **errp)
     } else if (irq_info.count == 1) {
         vdev->pci_aer = true;
     } else {
-        error_report(WARN_PREFIX
-                     "Could not enable error recovery for the device",
-                     vbasedev->name);
+        warn_report(VFIO_MSG_PREFIX
+                    "Could not enable error recovery for the device",
+                    vbasedev->name);
     }
 }
 
@@ -2715,7 +2715,7 @@ static void vfio_req_notifier_handler(void *opaque)
 
     qdev_unplug(&vdev->pdev.qdev, &err);
     if (err) {
-        error_reportf_err(err, WARN_PREFIX, vdev->vbasedev.name);
+        warn_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     }
 }
 
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index 57c4a0ee2b..c1aecac43c 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -657,8 +657,8 @@ static void vfio_platform_realize(DeviceState *dev, Error **errp)
 
     for (i = 0; i < vbasedev->num_regions; i++) {
         if (vfio_region_mmap(vdev->regions[i])) {
-            error_report("%s mmap unsupported. Performance may be slow",
-                         memory_region_name(vdev->regions[i]->mem));
+            warn_report("%s mmap unsupported, performance may be slow",
+                        memory_region_name(vdev->regions[i]->mem));
         }
         sysbus_init_mmio(sbdev, vdev->regions[i]->mem);
     }
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 821def0565..ad747aab7f 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -31,7 +31,7 @@
 #endif
 
 #define ERR_PREFIX "vfio error: %s: "
-#define WARN_PREFIX "vfio warning: %s: "
+#define VFIO_MSG_PREFIX "vfio %s: "
 
 enum {
     VFIO_DEVICE_TYPE_PCI = 0,
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (3 preceding siblings ...)
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 04/31] vfio: " Markus Armbruster
@ 2018-10-08 17:30 ` Markus Armbruster
  2018-10-08 19:04   ` Alex Williamson
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such Markus Armbruster
                   ` (25 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alex Williamson

The previous commit changed vfio's warning messages from

    vfio warning: DEV-NAME: Could not frobnicate

to

    warning: vfio DEV-NAME: Could not frobnicate

To match this change, change error messages from

    vfio error: DEV-NAME: On fire

to

    vfio DEV-NAME: On fire

Note the loss of "error".  If we think marking error messages that way
is a good idea, we should mark *all* error messages, i.e. make
error_report() print it.

Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/vfio/pci-quirks.c          | 4 ++--
 hw/vfio/pci.c                 | 8 ++++----
 hw/vfio/platform.c            | 2 +-
 include/hw/vfio/vfio-common.h | 1 -
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
index 481fd08df7..eae31c74d6 100644
--- a/hw/vfio/pci-quirks.c
+++ b/hw/vfio/pci-quirks.c
@@ -1670,7 +1670,7 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
      * but also no point in us enabling VGA if disabled in hardware.
      */
     if (!(gmch & 0x2) && !vdev->vga && vfio_populate_vga(vdev, &err)) {
-        error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
+        error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
         error_report("IGD device %s failed to enable VGA access, "
                      "legacy mode disabled", vdev->vbasedev.name);
         goto out;
@@ -1696,7 +1696,7 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
     ret = vfio_pci_igd_opregion_init(vdev, opregion, &err);
     if (ret) {
         error_append_hint(&err, "IGD legacy mode disabled\n");
-        error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
+        error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
         goto out;
     }
 
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 36f1182249..fedf81e386 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -742,7 +742,7 @@ static void vfio_msi_disable_common(VFIOPCIDevice *vdev)
 
     vfio_intx_enable(vdev, &err);
     if (err) {
-        error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
+        error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     }
 }
 
@@ -2194,7 +2194,7 @@ static void vfio_pci_post_reset(VFIOPCIDevice *vdev)
 
     vfio_intx_enable(vdev, &err);
     if (err) {
-        error_reportf_err(err, ERR_PREFIX, vdev->vbasedev.name);
+        error_reportf_err(err, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     }
 
     for (nr = 0; nr < PCI_NUM_REGIONS - 1; ++nr) {
@@ -2828,7 +2828,7 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
 
     if (stat(vdev->vbasedev.sysfsdev, &st) < 0) {
         error_setg_errno(errp, errno, "no such host device");
-        error_prepend(errp, ERR_PREFIX, vdev->vbasedev.sysfsdev);
+        error_prepend(errp, VFIO_MSG_PREFIX, vdev->vbasedev.sysfsdev);
         return;
     }
 
@@ -3079,7 +3079,7 @@ out_teardown:
     vfio_teardown_msi(vdev);
     vfio_bars_exit(vdev);
 error:
-    error_prepend(errp, ERR_PREFIX, vdev->vbasedev.name);
+    error_prepend(errp, VFIO_MSG_PREFIX, vdev->vbasedev.name);
 }
 
 static void vfio_instance_finalize(Object *obj)
diff --git a/hw/vfio/platform.c b/hw/vfio/platform.c
index c1aecac43c..61852f711b 100644
--- a/hw/vfio/platform.c
+++ b/hw/vfio/platform.c
@@ -668,7 +668,7 @@ out:
     }
 
     if (vdev->vbasedev.name) {
-        error_prepend(errp, ERR_PREFIX, vdev->vbasedev.name);
+        error_prepend(errp, VFIO_MSG_PREFIX, vdev->vbasedev.name);
     } else {
         error_prepend(errp, "vfio error: ");
     }
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index ad747aab7f..89ed6a5743 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -30,7 +30,6 @@
 #include <linux/vfio.h>
 #endif
 
-#define ERR_PREFIX "vfio error: %s: "
 #define VFIO_MSG_PREFIX "vfio %s: "
 
 enum {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (4 preceding siblings ...)
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:09   ` Philippe Mathieu-Daudé
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error Markus Armbruster
                   ` (24 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini, Marc-André Lureau

Calling error_report() in a function that takes an Error ** argument
is suspicious.  Convert a few that are actually help and such to
error_printf().

Improves output of -chardev help from

    qemu-system-x86_64: -chardev help: Available chardev backend types:
    serial
    ...

to

    Available chardev backend types:
    serial
    ...

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 chardev/char-pty.c | 2 +-
 chardev/char.c     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index e8d9a53476..f681d637c1 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -259,7 +259,7 @@ static void char_pty_open(Chardev *chr,
     qemu_set_nonblock(master_fd);
 
     chr->filename = g_strdup_printf("pty:%s", pty_name);
-    error_report("char device redirected to %s (label %s)",
+    error_printf("char device redirected to %s (label %s)\n",
                  pty_name, chr->label);
 
     s = PTY_CHARDEV(chr);
diff --git a/chardev/char.c b/chardev/char.c
index e115166995..7f07a1bfbd 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -634,7 +634,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
 
         chardev_name_foreach(help_string_append, str);
 
-        error_report("Available chardev backend types: %s", str->str);
+        error_printf("Available chardev backend types: %s\n", str->str);
         g_string_free(str, true);
         return NULL;
     }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (5 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  7:38   ` Greg Kurz
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling Markus Armbruster
                   ` (23 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Greg Kurz

Calling error_report() in a function that takes an Error ** argument
is suspicious.  9p-handle.c's handle_parse_opts() does that, and then
fails without setting an error.  Wrong.  Its caller crashes when it
tries to report the error:

    $ qemu-system-x86_64 -nodefaults -fsdev id=foo,fsdriver=handle
    qemu-system-x86_64: -fsdev id=foo,fsdriver=handle: warning: handle backend is deprecated
    qemu-system-x86_64: -fsdev id=foo,fsdriver=handle: fsdev: No path specified
    Segmentation fault (core dumped)

Screwed up when commit 91cda4e8f37 (v2.12.0) converted the function to
Error.  Fix by calling error_setg() instead of error_report().

Fixes: 91cda4e8f372602795e3a2f4bd2e3adaf9f82255
Cc: Greg Kurz <groug@kaod.org>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/9pfs/9p-handle.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/9pfs/9p-handle.c b/hw/9pfs/9p-handle.c
index f3641dbe4a..3465b1ef30 100644
--- a/hw/9pfs/9p-handle.c
+++ b/hw/9pfs/9p-handle.c
@@ -19,6 +19,7 @@
 #include <grp.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include "qapi/error.h"
 #include "qemu/xattr.h"
 #include "qemu/cutils.h"
 #include "qemu/error-report.h"
@@ -655,12 +656,13 @@ static int handle_parse_opts(QemuOpts *opts, FsDriverEntry *fse, Error **errp)
     warn_report("handle backend is deprecated");
 
     if (sec_model) {
-        error_report("Invalid argument security_model specified with handle fsdriver");
+        error_setg(errp,
+                   "Invalid argument security_model specified with handle fsdriver");
         return -1;
     }
 
     if (!path) {
-        error_report("fsdev: No path specified");
+        error_setg(errp, "fsdev: No path specified");
         return -1;
     }
     fse->path = g_strdup(path);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (6 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:15   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
                   ` (22 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael S. Tsirkin

Calling error_report() in a function that takes an Error ** argument
is suspicious.  pc.c's pc_machine_set_nvdimm_persistence() does that,
and then exit()s.  Wrong.  Attempting to set machine property
nvdimm-persistence to a bad value instantly kills the VM:

    $ qemu-system-x86_64 -nodefaults -S -display none -qmp stdio
    {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
    {"execute": "qmp_capabilities"}
    {"return": {}}
    {"execute": "qom-set", "arguments": {"path": "/machine", "property": "nvdimm-persistence", "value": "instadeath"}}
    -machine nvdimm-persistence=instadeath: unsupported option
    $ echo $?
    1

Broken when commit 11c39b5cd96 (v3.0.0) replaced error_propagate();
return by error_report(); exit() instead of error_setg(); return.  Fix
that.

Fixes: 11c39b5cd966ddc067a1ca0c5392ec9b666c45b7
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/i386/pc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index cd5029c149..eab8572f2a 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -2209,8 +2209,9 @@ static void pc_machine_set_nvdimm_persistence(Object *obj, const char *value,
     else if (strcmp(value, "mem-ctrl") == 0)
         nvdimm_state->persistence = 2;
     else {
-        error_report("-machine nvdimm-persistence=%s: unsupported option", value);
-        exit(EXIT_FAILURE);
+        error_setg(errp, "-machine nvdimm-persistence=%s: unsupported option",
+                   value);
+        return;
     }
 
     g_free(nvdimm_state->persistence_string);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (7 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  3:24   ` Peter Xu
  2018-10-09  9:18   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
                   ` (21 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Xu

Calling error_report() in a function that takes an Error ** argument
is suspicious.  ioapic_realize() does that, and then exit()s.
Currently mostly harmless, as the device cannot be hot-plugged.

Fixes: 20fd4b7b6d9282fe0cb83601f1821f31bd257458
Cc: Peter Xu <peterx@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/intc/ioapic.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
index b6896ac4ce..4e529729b4 100644
--- a/hw/intc/ioapic.c
+++ b/hw/intc/ioapic.c
@@ -21,7 +21,7 @@
  */
 
 #include "qemu/osdep.h"
-#include "qemu/error-report.h"
+#include "qapi/error.h"
 #include "monitor/monitor.h"
 #include "hw/hw.h"
 #include "hw/i386/pc.h"
@@ -393,9 +393,9 @@ static void ioapic_realize(DeviceState *dev, Error **errp)
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
 
     if (s->version != 0x11 && s->version != 0x20) {
-        error_report("IOAPIC only supports version 0x11 or 0x20 "
-                     "(default: 0x%x).", IOAPIC_VER_DEF);
-        exit(1);
+        error_setg(errp, "IOAPIC only supports version 0x11 or 0x20 "
+                   "(default: 0x%x).", IOAPIC_VER_DEF);
+        return;
     }
 
     memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (8 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:25   ` Marc-André Lureau
  2018-10-09 17:02   ` Paolo Bonzini
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling Markus Armbruster
                   ` (20 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini

Calling error_report() in a function that takes an Error ** argument
is suspicious.  smbios_entry_add() does that, and then exit()s.  It
also passes &error_fatal to qemu_opts_validate().  Both wrong, but
currently harmless, as its only caller passes &error_fatal.  Messed up
in commit 1007a37e208.  Clean it up.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/smbios/smbios.c | 90 +++++++++++++++++++++++++++++++---------------
 1 file changed, 62 insertions(+), 28 deletions(-)

diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index a27e54b2fa..920939454e 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -950,6 +950,7 @@ static void save_opt_list(size_t *ndest, const char ***dest,
 
 void smbios_entry_add(QemuOpts *opts, Error **errp)
 {
+    Error *err = NULL;
     const char *val;
 
     assert(!smbios_immutable);
@@ -960,12 +961,16 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
         int size;
         struct smbios_table *table; /* legacy mode only */
 
-        qemu_opts_validate(opts, qemu_smbios_file_opts, &error_fatal);
+        qemu_opts_validate(opts, qemu_smbios_file_opts, &err);
+        if (err) {
+            error_propagate(errp, err);
+            return;
+        }
 
         size = get_image_size(val);
         if (size == -1 || size < sizeof(struct smbios_structure_header)) {
-            error_report("Cannot read SMBIOS file %s", val);
-            exit(1);
+            error_setg(errp, "Cannot read SMBIOS file %s", val);
+            return;
         }
 
         /*
@@ -978,14 +983,15 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
                                                     smbios_tables_len);
 
         if (load_image(val, (uint8_t *)header) != size) {
-            error_report("Failed to load SMBIOS file %s", val);
-            exit(1);
+            error_setg(errp, "Failed to load SMBIOS file %s", val);
+            return;
         }
 
         if (test_bit(header->type, have_fields_bitmap)) {
-            error_report("can't load type %d struct, fields already specified!",
-                         header->type);
-            exit(1);
+            error_setg(errp,
+                       "can't load type %d struct, fields already specified!",
+                       header->type);
+            return;
         }
         set_bit(header->type, have_binfile_bitmap);
 
@@ -1030,19 +1036,23 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
         unsigned long type = strtoul(val, NULL, 0);
 
         if (type > SMBIOS_MAX_TYPE) {
-            error_report("out of range!");
-            exit(1);
+            error_setg(errp, "out of range!");
+            return;
         }
 
         if (test_bit(type, have_binfile_bitmap)) {
-            error_report("can't add fields, binary file already loaded!");
-            exit(1);
+            error_setg(errp, "can't add fields, binary file already loaded!");
+            return;
         }
         set_bit(type, have_fields_bitmap);
 
         switch (type) {
         case 0:
-            qemu_opts_validate(opts, qemu_smbios_type0_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type0_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type0.vendor, opts, "vendor");
             save_opt(&type0.version, opts, "version");
             save_opt(&type0.date, opts, "date");
@@ -1051,14 +1061,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             val = qemu_opt_get(opts, "release");
             if (val) {
                 if (sscanf(val, "%hhu.%hhu", &type0.major, &type0.minor) != 2) {
-                    error_report("Invalid release");
-                    exit(1);
+                    error_setg(errp, "Invalid release");
+                    return;
                 }
                 type0.have_major_minor = true;
             }
             return;
         case 1:
-            qemu_opts_validate(opts, qemu_smbios_type1_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type1_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type1.manufacturer, opts, "manufacturer");
             save_opt(&type1.product, opts, "product");
             save_opt(&type1.version, opts, "version");
@@ -1069,14 +1083,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             val = qemu_opt_get(opts, "uuid");
             if (val) {
                 if (qemu_uuid_parse(val, &qemu_uuid) != 0) {
-                    error_report("Invalid UUID");
-                    exit(1);
+                    error_setg(errp, "Invalid UUID");
+                    return;
                 }
                 qemu_uuid_set = true;
             }
             return;
         case 2:
-            qemu_opts_validate(opts, qemu_smbios_type2_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type2_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type2.manufacturer, opts, "manufacturer");
             save_opt(&type2.product, opts, "product");
             save_opt(&type2.version, opts, "version");
@@ -1085,7 +1103,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             save_opt(&type2.location, opts, "location");
             return;
         case 3:
-            qemu_opts_validate(opts, qemu_smbios_type3_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type3_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type3.manufacturer, opts, "manufacturer");
             save_opt(&type3.version, opts, "version");
             save_opt(&type3.serial, opts, "serial");
@@ -1093,7 +1115,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             save_opt(&type3.sku, opts, "sku");
             return;
         case 4:
-            qemu_opts_validate(opts, qemu_smbios_type4_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type4_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type4.sock_pfx, opts, "sock_pfx");
             save_opt(&type4.manufacturer, opts, "manufacturer");
             save_opt(&type4.version, opts, "version");
@@ -1102,11 +1128,19 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             save_opt(&type4.part, opts, "part");
             return;
         case 11:
-            qemu_opts_validate(opts, qemu_smbios_type11_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type11_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt_list(&type11.nvalues, &type11.values, opts, "value");
             return;
         case 17:
-            qemu_opts_validate(opts, qemu_smbios_type17_opts, &error_fatal);
+            qemu_opts_validate(opts, qemu_smbios_type17_opts, &err);
+            if (err) {
+                error_propagate(errp, err);
+                return;
+            }
             save_opt(&type17.loc_pfx, opts, "loc_pfx");
             save_opt(&type17.bank, opts, "bank");
             save_opt(&type17.manufacturer, opts, "manufacturer");
@@ -1116,12 +1150,12 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             type17.speed = qemu_opt_get_number(opts, "speed", 0);
             return;
         default:
-            error_report("Don't know how to build fields for SMBIOS type %ld",
-                         type);
-            exit(1);
+            error_setg(errp,
+                       "Don't know how to build fields for SMBIOS type %ld",
+                       type);
+            return;
         }
     }
 
-    error_report("Must specify type= or file=");
-    exit(1);
+    error_setg(errp, "Must specify type= or file=");
 }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (9 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:27   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting Markus Armbruster
                   ` (19 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini

Calling error_report() in a function that takes an Error ** argument
is suspicious.  save_snapshot() and load_snapshot() do that, and then
fail without setting an error.  Wrong.  The HMP commands survive this
unscathed, since hmp_handle_error() does nothing when no error has
been set.  Callers main() (on behalf of -loadvm) and
replay_vmstate_init() crash, but I'm not sure the error is possible
there.

Screwed up when commit 377b21ccea1 (v2.12.0) added incorrect error
handling right next to correct examples.  Fix by calling error_setg()
instead of error_report().

Fixes: 377b21ccea1755a8b0dae822c29567c58dda6939
Cc: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 migration/savevm.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/migration/savevm.c b/migration/savevm.c
index 2d10e45582..5f8eb38676 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2414,8 +2414,8 @@ int save_snapshot(const char *name, Error **errp)
     AioContext *aio_context;
 
     if (!replay_can_snapshot()) {
-        error_report("Record/replay does not allow making snapshot "
-                     "right now. Try once more later.");
+        error_setg(errp, "Record/replay does not allow making snapshot "
+                   "right now. Try once more later.");
         return ret;
     }
 
@@ -2611,8 +2611,8 @@ int load_snapshot(const char *name, Error **errp)
     MigrationIncomingState *mis = migration_incoming_get_current();
 
     if (!replay_can_snapshot()) {
-        error_report("Record/replay does not allow loading snapshot "
-                     "right now. Try once more later.");
+        error_setg(errp, "Record/replay does not allow loading snapshot "
+                   "right now. Try once more later.");
         return -EINVAL;
     }
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (10 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:32   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling Markus Armbruster
                   ` (18 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jason Wang

When -netdev l2tpv3 fails, it first reports a specific error, then a
generic one, like this:

    $ qemu-system-x86_64 -netdev l2tpv3,id=foo,src=,dst=,txsession=1
    qemu-system-x86_64: -netdev l2tpv3,id=foo,src=,dst=,txsession=1: l2tpv3_open : could not resolve src, errno = Name or service not known
    qemu-system-x86_64: Device 'l2tpv3' could not be initialized

With the command line, the messages go to stderr.  In HMP, they go to
the monitor.  In QMP, the second one becomes the error reply, and the
first one goes to stderr.

Convert net_init_tap() to Error.  This suppresses the unwanted second
message, and makes the specific error the QMP error reply.

Cc: Jason Wang <jasowang@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 net/l2tpv3.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/net/l2tpv3.c b/net/l2tpv3.c
index 6745b78990..0c5dd22ef7 100644
--- a/net/l2tpv3.c
+++ b/net/l2tpv3.c
@@ -28,6 +28,7 @@
 #include <netdb.h>
 #include "net/net.h"
 #include "clients.h"
+#include "qapi/error.h"
 #include "qemu-common.h"
 #include "qemu/error-report.h"
 #include "qemu/option.h"
@@ -528,7 +529,6 @@ int net_init_l2tpv3(const Netdev *netdev,
                     const char *name,
                     NetClientState *peer, Error **errp)
 {
-    /* FIXME error_setg(errp, ...) on failure */
     const NetdevL2TPv3Options *l2tpv3;
     NetL2TPV3State *s;
     NetClientState *nc;
@@ -555,7 +555,7 @@ int net_init_l2tpv3(const Netdev *netdev,
     }
 
     if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) {
-        error_report("l2tpv3_open : offset must be less than 256 bytes");
+        error_setg(errp, "l2tpv3_open : offset must be less than 256 bytes");
         goto outerr;
     }
 
@@ -563,6 +563,8 @@ int net_init_l2tpv3(const Netdev *netdev,
         if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) {
             s->cookie = true;
         } else {
+            error_setg(errp,
+                       "require both 'rxcookie' and 'txcookie' or neither");
             goto outerr;
         }
     } else {
@@ -578,7 +580,8 @@ int net_init_l2tpv3(const Netdev *netdev,
     if (l2tpv3->has_udp && l2tpv3->udp) {
         s->udp = true;
         if (!(l2tpv3->has_srcport && l2tpv3->has_dstport)) {
-            error_report("l2tpv3_open : need both src and dst port for udp");
+            error_setg(errp,
+                       "l2tpv3_open : need both src and dst port for udp");
             goto outerr;
         } else {
             srcport = l2tpv3->srcport;
@@ -639,20 +642,19 @@ int net_init_l2tpv3(const Netdev *netdev,
     gairet = getaddrinfo(l2tpv3->src, srcport, &hints, &result);
 
     if ((gairet != 0) || (result == NULL)) {
-        error_report(
-            "l2tpv3_open : could not resolve src, errno = %s",
-            gai_strerror(gairet)
-        );
+        error_setg(errp, "l2tpv3_open : could not resolve src, errno = %s",
+                   gai_strerror(gairet));
         goto outerr;
     }
     fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
     if (fd == -1) {
         fd = -errno;
-        error_report("l2tpv3_open : socket creation failed, errno = %d", -fd);
+        error_setg(errp, "l2tpv3_open : socket creation failed, errno = %d",
+                   -fd);
         goto outerr;
     }
     if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) {
-        error_report("l2tpv3_open :  could not bind socket err=%i", errno);
+        error_setg(errp, "l2tpv3_open :  could not bind socket err=%i", errno);
         goto outerr;
     }
     if (result) {
@@ -677,10 +679,8 @@ int net_init_l2tpv3(const Netdev *netdev,
     result = NULL;
     gairet = getaddrinfo(l2tpv3->dst, dstport, &hints, &result);
     if ((gairet != 0) || (result == NULL)) {
-        error_report(
-            "l2tpv3_open : could not resolve dst, error = %s",
-            gai_strerror(gairet)
-        );
+        error_setg(errp, "l2tpv3_open : could not resolve dst, error = %s",
+                   gai_strerror(gairet));
         goto outerr;
     }
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (11 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:47   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
                   ` (17 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jason Wang

Calling error_report() in a function that takes an Error ** argument
is suspicious.  net_socket_fd_init() does that, and then fails without
setting an error.  Wrong.  I didn't analyze how exactly this can
break.  A caller that reports the error on failure would crash.

Broken when commit c37f0bb1d0d (v2.11.0) converted the function to
Error.  Fix by calling error_setg() instead of error_report().

Fixes: c37f0bb1d0d24e3a6b5f4659bb305913dcb798a6
Cc: Jason Wang <jasowang@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 net/socket.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index 6917fbcbf5..90ef3517be 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -453,8 +453,8 @@ static NetSocketState *net_socket_fd_init(NetClientState *peer,
     case SOCK_STREAM:
         return net_socket_fd_init_stream(peer, model, name, fd, is_connected);
     default:
-        error_report("socket type=%d for fd=%d must be either"
-                     " SOCK_DGRAM or SOCK_STREAM", so_type, fd);
+        error_setg(errp, "socket type=%d for fd=%d must be either"
+                   " SOCK_DGRAM or SOCK_STREAM", so_type, fd);
         closesocket(fd);
     }
     return NULL;
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node error handling
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (12 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 18:03   ` Eduardo Habkost
  2018-10-12 14:35   ` Igor Mammedov
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize() Markus Armbruster
                   ` (16 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Igor Mammedov

Calling error_report() in a function that takes an Error ** argument
is suspicious.  parse_numa_node() does that, and then exit()s.  It
also passes &error_fatal to machine_set_cpu_numa_node().  Both wrong.
Attempting to configure numa when the machine doesn't support it kills
the VM:

    $ qemu-system-x86_64 -nodefaults -S -display none -M none -preconfig -qmp stdio
    {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
    {"execute": "qmp_capabilities"}
    {"return": {}}
    {"execute": "set-numa-node", "arguments": {"type": "node"}}
    NUMA is not supported by this machine-type
    $ echo $?
    1

Messed up when commit 64c2a8f6d3f and 7c88e65d9e9 (v2.10.0) added
incorrect error handling right next to correct examples.  Latent bug
until commit f3be67812c2 (v3.0.0) made it accessible via QMP.  Fairly
harmless in practice, because it's limited to RUN_STATE_PRECONFIG.
The fix is obvious: replace error_report(); exit() by error_setg();
return.

This affects parse_numa_node()'s other caller
numa_complete_configuration(): since it ignores errors, the "NUMA is
not supported by this machine-type" is now ignored, too.  But that
error is as unexpected there as any other.  Change it to abort on
error instead.

Fixes: f3be67812c226162f86ce92634bd913714445420
Cc: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>

fixup! numa: Fix QMP command set-numa-node error handling
---
 numa.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/numa.c b/numa.c
index 81542d4ebb..1d7c49ad43 100644
--- a/numa.c
+++ b/numa.c
@@ -60,6 +60,7 @@ NodeInfo numa_info[MAX_NODES];
 static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
                             Error **errp)
 {
+    Error *err = NULL;
     uint16_t nodenr;
     uint16List *cpus = NULL;
     MachineClass *mc = MACHINE_GET_CLASS(ms);
@@ -82,8 +83,8 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
     }
 
     if (!mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id) {
-        error_report("NUMA is not supported by this machine-type");
-        exit(1);
+        error_setg(errp, "NUMA is not supported by this machine-type");
+        return;
     }
     for (cpus = node->cpus; cpus; cpus = cpus->next) {
         CpuInstanceProperties props;
@@ -97,7 +98,11 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
         props = mc->cpu_index_to_instance_props(ms, cpus->value);
         props.node_id = nodenr;
         props.has_node_id = true;
-        machine_set_cpu_numa_node(ms, &props, &error_fatal);
+        machine_set_cpu_numa_node(ms, &props, &err);
+        if (err) {
+            error_propagate(errp, err);
+            return;
+        }
     }
 
     if (node->has_mem && node->has_memdev) {
@@ -367,7 +372,7 @@ void numa_complete_configuration(MachineState *ms)
     if (ms->ram_slots > 0 && nb_numa_nodes == 0 &&
         mc->auto_enable_numa_with_memhp) {
             NumaNodeOptions node = { };
-            parse_numa_node(ms, &node, NULL);
+            parse_numa_node(ms, &node, &error_abort);
     }
 
     assert(max_numa_nodeid <= MAX_NODES);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (13 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-10 13:31   ` Anthony PERARD
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
                   ` (15 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefano Stabellini, Anthony Perard

The conversion of "xen-pci-passthrough" to realize() (commit
5a11d0f7549, v2.6.0) neglected to convert the xen_pt_config_init()
error path.  If xen_pt_config_init() fails, xen_pt_realize() reports
the error, then returns success without completing its job.  I don't
know the exact impact, but it can't be good.

Belatedly convert the error path.

Fixes: 5a11d0f7549e24a10e178a9dc8ff5e698031d9a6
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Anthony Perard <anthony.perard@citrix.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/xen/xen_pt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
index e5a6eff44f..f1f3a3727c 100644
--- a/hw/xen/xen_pt.c
+++ b/hw/xen/xen_pt.c
@@ -830,7 +830,7 @@ static void xen_pt_realize(PCIDevice *d, Error **errp)
     xen_pt_config_init(s, &err);
     if (err) {
         error_append_hint(&err, "PCI Config space initialisation failed");
-        error_report_err(err);
+        error_propagate(errp, err);
         rc = -1;
         goto err_out;
     }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (14 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  9:53   ` Marc-André Lureau
  2018-10-10 12:39   ` Eduardo Otubo
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
                   ` (14 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Eduardo Otubo

Calling error_report() in a function that takes an Error ** argument
is suspicious.  parse_sandbox() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Cc: Eduardo Otubo <otubo@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qemu-seccomp.c | 18 +++++++++---------
 vl.c           |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/qemu-seccomp.c b/qemu-seccomp.c
index 1baa5c69ed..6d27699409 100644
--- a/qemu-seccomp.c
+++ b/qemu-seccomp.c
@@ -12,11 +12,12 @@
  * Contributions after 2012-01-13 are licensed under the terms of the
  * GNU GPL, version 2 or (at your option) any later version.
  */
+
 #include "qemu/osdep.h"
+#include "qapi/error.h"
 #include "qemu/config-file.h"
 #include "qemu/option.h"
 #include "qemu/module.h"
-#include "qemu/error-report.h"
 #include <sys/prctl.h>
 #include <seccomp.h>
 #include "sysemu/seccomp.h"
@@ -190,7 +191,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
                  * to provide a little bit of consistency for
                  * the command line */
             } else {
-                error_report("invalid argument for obsolete");
+                error_setg(errp, "invalid argument for obsolete");
                 return -1;
             }
         }
@@ -205,14 +206,13 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
                 /* calling prctl directly because we're
                  * not sure if host has CAP_SYS_ADMIN set*/
                 if (prctl(PR_SET_NO_NEW_PRIVS, 1)) {
-                    error_report("failed to set no_new_privs "
-                                 "aborting");
+                    error_setg(errp, "failed to set no_new_privs " "aborting");
                     return -1;
                 }
             } else if (g_str_equal(value, "allow")) {
                 /* default value */
             } else {
-                error_report("invalid argument for elevateprivileges");
+                error_setg(errp, "invalid argument for elevateprivileges");
                 return -1;
             }
         }
@@ -224,7 +224,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
             } else if (g_str_equal(value, "allow")) {
                 /* default value */
             } else {
-                error_report("invalid argument for spawn");
+                error_setg(errp, "invalid argument for spawn");
                 return -1;
             }
         }
@@ -236,14 +236,14 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
             } else if (g_str_equal(value, "allow")) {
                 /* default value */
             } else {
-                error_report("invalid argument for resourcecontrol");
+                error_setg(errp, "invalid argument for resourcecontrol");
                 return -1;
             }
         }
 
         if (seccomp_start(seccomp_opts) < 0) {
-            error_report("failed to install seccomp syscall filter "
-                         "in the kernel");
+            error_setg(errp, "failed to install seccomp syscall filter "
+                       "in the kernel");
             return -1;
         }
     }
diff --git a/vl.c b/vl.c
index 9d2b38a31f..485c3fc008 100644
--- a/vl.c
+++ b/vl.c
@@ -3925,8 +3925,8 @@ int main(int argc, char **argv, char **envp)
 
 #ifdef CONFIG_SECCOMP
     olist = qemu_find_opts_err("sandbox", NULL);
-    if (olist && qemu_opts_foreach(olist, parse_sandbox, NULL, NULL)) {
-        exit(1);
+    if (olist) {
+        qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
     }
 #endif
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (15 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09 10:11   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
                   ` (13 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  parse_add_fd() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Also change call of cleanup_add_fd(), which can't fail, for symmetry.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/vl.c b/vl.c
index 485c3fc008..7ce8299d9d 100644
--- a/vl.c
+++ b/vl.c
@@ -1059,12 +1059,12 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
     fd_opaque = qemu_opt_get(opts, "opaque");
 
     if (fd < 0) {
-        error_report("fd option is required and must be non-negative");
+        error_setg(errp, "fd option is required and must be non-negative");
         return -1;
     }
 
     if (fd <= STDERR_FILENO) {
-        error_report("fd cannot be a standard I/O stream");
+        error_setg(errp, "fd cannot be a standard I/O stream");
         return -1;
     }
 
@@ -1074,12 +1074,12 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
      */
     flags = fcntl(fd, F_GETFD);
     if (flags == -1 || (flags & FD_CLOEXEC)) {
-        error_report("fd is not valid or already in use");
+        error_setg(errp, "fd is not valid or already in use");
         return -1;
     }
 
     if (fdset_id < 0) {
-        error_report("set option is required and must be non-negative");
+        error_setg(errp, "set option is required and must be non-negative");
         return -1;
     }
 
@@ -1092,7 +1092,7 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
     }
 #endif
     if (dupfd == -1) {
-        error_report("error duplicating fd: %s", strerror(errno));
+        error_setg(errp, "error duplicating fd: %s", strerror(errno));
         return -1;
     }
 
@@ -3936,15 +3936,11 @@ int main(int argc, char **argv, char **envp)
     }
 
 #ifndef _WIN32
-    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
-                          parse_add_fd, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("add-fd"),
+                      parse_add_fd, NULL, &error_fatal);
 
-    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
-                          cleanup_add_fd, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("add-fd"),
+                      cleanup_add_fd, NULL, &error_fatal);
 #endif
 
     current_machine = MACHINE(object_new(object_class_get_name(
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (16 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 20:43   ` Eric Blake
                     ` (2 more replies)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
                   ` (12 subsequent siblings)
  30 siblings, 3 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  user_creatable_add_opts_foreach() does that, and then
fails without setting an error.  Its caller main(), via
qemu_opts_foreach(), is fine with it, but clean it up anyway.

Cc: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qemu-io.c               |  8 +++-----
 qemu-nbd.c              |  8 +++-----
 qom/object_interfaces.c |  4 +---
 vl.c                    | 16 ++++++----------
 4 files changed, 13 insertions(+), 23 deletions(-)

diff --git a/qemu-io.c b/qemu-io.c
index 13829f5e21..6df7731af4 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -620,11 +620,9 @@ int main(int argc, char **argv)
         exit(1);
     }
 
-    if (qemu_opts_foreach(&qemu_object_opts,
-                          user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(&qemu_object_opts,
+                      user_creatable_add_opts_foreach,
+                      NULL, &error_fatal);
 
     if (!trace_init_backends()) {
         exit(1);
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 7874bc973c..ca7109652e 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -766,11 +766,9 @@ int main(int argc, char **argv)
         exit(EXIT_FAILURE);
     }
 
-    if (qemu_opts_foreach(&qemu_object_opts,
-                          user_creatable_add_opts_foreach,
-                          NULL, NULL)) {
-        exit(EXIT_FAILURE);
-    }
+    qemu_opts_foreach(&qemu_object_opts,
+                      user_creatable_add_opts_foreach,
+                      NULL, &error_fatal);
 
     if (!trace_init_backends()) {
         exit(1);
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 72b97a8bed..4052d6c4a7 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -143,7 +143,6 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
 {
     bool (*type_predicate)(const char *) = opaque;
     Object *obj = NULL;
-    Error *err = NULL;
     const char *type;
 
     type = qemu_opt_get(opts, "qom-type");
@@ -152,9 +151,8 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
         return 0;
     }
 
-    obj = user_creatable_add_opts(opts, &err);
+    obj = user_creatable_add_opts(opts, errp);
     if (!obj) {
-        error_report_err(err);
         return -1;
     }
     object_unref(obj);
diff --git a/vl.c b/vl.c
index 7ce8299d9d..b8576f8f10 100644
--- a/vl.c
+++ b/vl.c
@@ -4181,11 +4181,9 @@ int main(int argc, char **argv, char **envp)
     page_size_init();
     socket_init();
 
-    if (qemu_opts_foreach(qemu_find_opts("object"),
-                          user_creatable_add_opts_foreach,
-                          object_create_initial, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("object"),
+                      user_creatable_add_opts_foreach,
+                      object_create_initial, &error_fatal);
 
     if (qemu_opts_foreach(qemu_find_opts("chardev"),
                           chardev_init_func, NULL, NULL)) {
@@ -4316,11 +4314,9 @@ int main(int argc, char **argv, char **envp)
         exit(1);
     }
 
-    if (qemu_opts_foreach(qemu_find_opts("object"),
-                          user_creatable_add_opts_foreach,
-                          object_create_delayed, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("object"),
+                      user_creatable_add_opts_foreach,
+                      object_create_delayed, &error_fatal);
 
     if (tpm_init() < 0) {
         exit(1);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (17 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:07   ` Philippe Mathieu-Daudé
  2018-10-09 11:13   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
                   ` (11 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  chardev_init_func() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/vl.c b/vl.c
index b8576f8f10..ecb70f87d8 100644
--- a/vl.c
+++ b/vl.c
@@ -2239,7 +2239,7 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
 
     if (!qemu_chr_new_from_opts(opts, &local_err)) {
         if (local_err) {
-            error_report_err(local_err);
+            error_propagate(errp, local_err);
             return -1;
         }
         exit(0);
@@ -4185,10 +4185,8 @@ int main(int argc, char **argv, char **envp)
                       user_creatable_add_opts_foreach,
                       object_create_initial, &error_fatal);
 
-    if (qemu_opts_foreach(qemu_find_opts("chardev"),
-                          chardev_init_func, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("chardev"),
+                      chardev_init_func, NULL, &error_fatal);
 
 #ifdef CONFIG_VIRTFS
     if (qemu_opts_foreach(qemu_find_opts("fsdev"),
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (18 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:02   ` Philippe Mathieu-Daudé
  2018-10-09 11:18   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
                   ` (10 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  machine_set_property() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/vl.c b/vl.c
index ecb70f87d8..3adc9dbe4f 100644
--- a/vl.c
+++ b/vl.c
@@ -2676,7 +2676,7 @@ static int machine_set_property(void *opaque,
     g_free(qom_name);
 
     if (local_err) {
-        error_report_err(local_err);
+        error_propagate(errp, local_err);
         return -1;
     }
 
@@ -4201,11 +4201,8 @@ int main(int argc, char **argv, char **envp)
     }
 
     machine_opts = qemu_get_machine_opts();
-    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
-                         NULL)) {
-        object_unref(OBJECT(current_machine));
-        exit(1);
-    }
+    qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
+                     &error_fatal);
 
     configure_accelerator(current_machine);
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (19 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:02   ` Philippe Mathieu-Daudé
  2018-10-09 11:21   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg() Markus Armbruster
                   ` (9 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  mon_init_func() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/vl.c b/vl.c
index 3adc9dbe4f..1009d708a0 100644
--- a/vl.c
+++ b/vl.c
@@ -2270,8 +2270,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
     } else if (strcmp(mode, "control") == 0) {
         flags = MONITOR_USE_CONTROL;
     } else {
-        error_report("unknown monitor mode \"%s\"", mode);
-        exit(1);
+        error_setg(errp, "unknown monitor mode \"%s\"", mode);
+        return -1;
     }
 
     if (qemu_opt_get_bool(opts, "pretty", 0))
@@ -2285,8 +2285,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
     chardev = qemu_opt_get(opts, "chardev");
     chr = qemu_chr_find(chardev);
     if (chr == NULL) {
-        error_report("chardev \"%s\" not found", chardev);
-        exit(1);
+        error_setg(errp, "chardev \"%s\" not found", chardev);
+        return -1;
     }
 
     monitor_init(chr, flags);
@@ -4365,10 +4365,8 @@ int main(int argc, char **argv, char **envp)
     default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
     default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
 
-    if (qemu_opts_foreach(qemu_find_opts("mon"),
-                          mon_init_func, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("mon"),
+                      mon_init_func, NULL, &error_fatal);
 
     if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
         exit(1);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (20 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09 11:25   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func() Markus Armbruster
                   ` (8 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  parse_fw_cfg() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/vl.c b/vl.c
index 1009d708a0..a3a39ec06b 100644
--- a/vl.c
+++ b/vl.c
@@ -2174,7 +2174,7 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
     FWCfgState *fw_cfg = (FWCfgState *) opaque;
 
     if (fw_cfg == NULL) {
-        error_report("fw_cfg device not available");
+        error_setg(errp, "fw_cfg device not available");
         return -1;
     }
     name = qemu_opt_get(opts, "name");
@@ -2183,15 +2183,16 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
 
     /* we need name and either a file or the content string */
     if (!(nonempty_str(name) && (nonempty_str(file) || nonempty_str(str)))) {
-        error_report("invalid argument(s)");
+        error_setg(errp, "invalid argument(s)");
         return -1;
     }
     if (nonempty_str(file) && nonempty_str(str)) {
-        error_report("file and string are mutually exclusive");
+        error_setg(errp, "file and string are mutually exclusive");
         return -1;
     }
     if (strlen(name) > FW_CFG_MAX_FILE_PATH - 1) {
-        error_report("name too long (max. %d char)", FW_CFG_MAX_FILE_PATH - 1);
+        error_setg(errp, "name too long (max. %d char)",
+                   FW_CFG_MAX_FILE_PATH - 1);
         return -1;
     }
     if (strncmp(name, "opt/", 4) != 0) {
@@ -2203,7 +2204,7 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
         buf = g_memdup(str, size);
     } else {
         if (!g_file_get_contents(file, &buf, &size, NULL)) {
-            error_report("can't load %s", file);
+            error_setg(errp, "can't load %s", file);
             return -1;
         }
     }
@@ -4429,10 +4430,8 @@ int main(int argc, char **argv, char **envp)
         hax_sync_vcpus();
     }
 
-    if (qemu_opts_foreach(qemu_find_opts("fw_cfg"),
-                          parse_fw_cfg, fw_cfg_find(), NULL) != 0) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("fw_cfg"),
+                      parse_fw_cfg, fw_cfg_find(), &error_fatal);
 
     /* init USB devices */
     if (machine_usb(current_machine)) {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (21 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:05   ` Philippe Mathieu-Daudé
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
                   ` (7 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

Calling error_report() in a function that takes an Error ** argument
is suspicious.  device_init_func() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/vl.c b/vl.c
index a3a39ec06b..86eee4c798 100644
--- a/vl.c
+++ b/vl.c
@@ -2222,12 +2222,10 @@ static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
 
 static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
 {
-    Error *err = NULL;
     DeviceState *dev;
 
-    dev = qdev_device_add(opts, &err);
+    dev = qdev_device_add(opts, errp);
     if (!dev) {
-        error_report_err(err);
         return -1;
     }
     object_unref(OBJECT(dev));
@@ -4444,10 +4442,8 @@ int main(int argc, char **argv, char **envp)
 
     /* init generic devices */
     rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
-    if (qemu_opts_foreach(qemu_find_opts("device"),
-                          device_init_func, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("device"),
+                      device_init_func, NULL, &error_fatal);
 
     cpu_synchronize_all_post_init();
 
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (22 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09 11:35   ` Marc-André Lureau
  2018-10-11 17:48   ` Markus Armbruster
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa() Markus Armbruster
                   ` (6 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Calling error_report() in a function that takes an Error ** argument
is suspicious.  vnc_init_func() does that, and then fails without
setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
with it, but clean it up anyway.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 ui/vnc.c | 5 +++--
 vl.c     | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/ui/vnc.c b/ui/vnc.c
index cf221c83cc..df6c84b802 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -4082,8 +4082,9 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
     vnc_display_init(id);
     vnc_display_open(id, &local_err);
     if (local_err != NULL) {
-        error_reportf_err(local_err, "Failed to start VNC server: ");
-        exit(1);
+        error_propagate(errp, local_err);
+        error_prepend(errp, "Failed to start VNC server: ");
+        return -1;
     }
     return 0;
 }
diff --git a/vl.c b/vl.c
index 86eee4c798..5c159ca45c 100644
--- a/vl.c
+++ b/vl.c
@@ -4479,7 +4479,7 @@ int main(int argc, char **argv, char **envp)
     /* init remote displays */
 #ifdef CONFIG_VNC
     qemu_opts_foreach(qemu_find_opts("vnc"),
-                      vnc_init_func, NULL, NULL);
+                      vnc_init_func, NULL, &error_fatal);
 #endif
 
     if (using_spice) {
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (23 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 18:01   ` Eduardo Habkost
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
                   ` (5 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Eduardo Habkost

Calling error_report() in a function that takes an Error ** argument
is suspicious.  parse_numa() does that, and then fails without setting
an error.  Its caller main(), via qemu_opts_foreach(), is fine with
it, but clean it up anyway.

While there, give parse_numa() internal linkage.

Cc: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/sysemu/numa.h | 1 -
 numa.c                | 8 +++-----
 2 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/include/sysemu/numa.h b/include/sysemu/numa.h
index 7a0ae751aa..21713b7e2f 100644
--- a/include/sysemu/numa.h
+++ b/include/sysemu/numa.h
@@ -22,7 +22,6 @@ struct NumaNodeMem {
 };
 
 extern NodeInfo numa_info[MAX_NODES];
-int parse_numa(void *opaque, QemuOpts *opts, Error **errp);
 void parse_numa_opts(MachineState *ms);
 void numa_complete_configuration(MachineState *ms);
 void query_numa_node_mem(NumaNodeMem node_mem[]);
diff --git a/numa.c b/numa.c
index 1d7c49ad43..50ec016013 100644
--- a/numa.c
+++ b/numa.c
@@ -215,7 +215,7 @@ end:
     error_propagate(errp, err);
 }
 
-int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
+static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
 {
     NumaOptions *object = NULL;
     MachineState *ms = MACHINE(opaque);
@@ -239,7 +239,7 @@ int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
 end:
     qapi_free_NumaOptions(object);
     if (err) {
-        error_report_err(err);
+        error_propagate(errp, err);
         return -1;
     }
 
@@ -444,9 +444,7 @@ void numa_complete_configuration(MachineState *ms)
 
 void parse_numa_opts(MachineState *ms)
 {
-    if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, ms, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, ms, &error_fatal);
 }
 
 void qmp_set_numa_node(NumaOptions *cmd, Error **errp)
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (24 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09 10:57   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel() Markus Armbruster
                   ` (4 subsequent siblings)
  30 siblings, 3 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Berger

Calling error_report() in a function that takes an Error ** argument
is suspicious.  tpm_init_tpmdev() does that, and then fails without
setting an error.  Its caller main(), via tpm_init() and
qemu_opts_foreach(), is fine with it, but clean it up anyway.

Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/sysemu/tpm.h |  2 +-
 stubs/tpm.c          |  3 +--
 tpm.c                | 22 +++++++++-------------
 vl.c                 |  4 +---
 4 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/include/sysemu/tpm.h b/include/sysemu/tpm.h
index 9ae1ab6da3..17a97ed77a 100644
--- a/include/sysemu/tpm.h
+++ b/include/sysemu/tpm.h
@@ -16,7 +16,7 @@
 #include "qom/object.h"
 
 int tpm_config_parse(QemuOptsList *opts_list, const char *optarg);
-int tpm_init(void);
+void tpm_init(void);
 void tpm_cleanup(void);
 
 typedef enum TPMVersion {
diff --git a/stubs/tpm.c b/stubs/tpm.c
index 6729bc8517..80939cd3db 100644
--- a/stubs/tpm.c
+++ b/stubs/tpm.c
@@ -9,9 +9,8 @@
 #include "qapi/qapi-commands-tpm.h"
 #include "sysemu/tpm.h"
 
-int tpm_init(void)
+void tpm_init(void)
 {
-    return 0;
 }
 
 void tpm_cleanup(void)
diff --git a/tpm.c b/tpm.c
index 93031723ad..9c9e20bbb7 100644
--- a/tpm.c
+++ b/tpm.c
@@ -89,19 +89,19 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
     int i;
 
     if (!QLIST_EMPTY(&tpm_backends)) {
-        error_report("Only one TPM is allowed.");
+        error_setg(errp, "Only one TPM is allowed.");
         return 1;
     }
 
     id = qemu_opts_id(opts);
     if (id == NULL) {
-        error_report(QERR_MISSING_PARAMETER, "id");
+        error_setg(errp, QERR_MISSING_PARAMETER, "id");
         return 1;
     }
 
     value = qemu_opt_get(opts, "type");
     if (!value) {
-        error_report(QERR_MISSING_PARAMETER, "type");
+        error_setg(errp, QERR_MISSING_PARAMETER, "type");
         tpm_display_backend_drivers();
         return 1;
     }
@@ -109,8 +109,8 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
     i = qapi_enum_parse(&TpmType_lookup, value, -1, NULL);
     be = i >= 0 ? tpm_be_find_by_type(i) : NULL;
     if (be == NULL) {
-        error_report(QERR_INVALID_PARAMETER_VALUE,
-                     "type", "a TPM backend type");
+        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
+                   "a TPM backend type");
         tpm_display_backend_drivers();
         return 1;
     }
@@ -118,7 +118,7 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
     /* validate backend specific opts */
     qemu_opts_validate(opts, be->opts, &local_err);
     if (local_err) {
-        error_report_err(local_err);
+        error_propagate(errp, local_err);
         return 1;
     }
 
@@ -151,14 +151,10 @@ void tpm_cleanup(void)
  * Initialize the TPM. Process the tpmdev command line options describing the
  * TPM backend.
  */
-int tpm_init(void)
+void tpm_init(void)
 {
-    if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
-                          tpm_init_tpmdev, NULL, NULL)) {
-        return -1;
-    }
-
-    return 0;
+    qemu_opts_foreach(qemu_find_opts("tpmdev"),
+                      tpm_init_tpmdev, NULL, &error_fatal);
 }
 
 /*
diff --git a/vl.c b/vl.c
index 5c159ca45c..b6f9212f09 100644
--- a/vl.c
+++ b/vl.c
@@ -4312,9 +4312,7 @@ int main(int argc, char **argv, char **envp)
                       user_creatable_add_opts_foreach,
                       object_create_delayed, &error_fatal);
 
-    if (tpm_init() < 0) {
-        exit(1);
-    }
+    tpm_init();
 
     /* init the bluetooth world */
     if (foreach_device_config(DEV_BT, bt_parse))
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (25 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09 11:46   ` Marc-André Lureau
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
                   ` (3 subsequent siblings)
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Calling error_report() in a function that takes an Error ** argument
is suspicious.  add_channel() does that, and then exit()s.  Its caller
main(), via qemu_opts_foreach(), is fine with it, but clean it up
anyway.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 ui/spice-core.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/ui/spice-core.c b/ui/spice-core.c
index a4fbbc3898..ebaae24643 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -597,9 +597,9 @@ static int add_channel(void *opaque, const char *name, const char *value,
     if (strcmp(name, "tls-channel") == 0) {
         int *tls_port = opaque;
         if (!*tls_port) {
-            error_report("spice: tried to setup tls-channel"
-                         " without specifying a TLS port");
-            exit(1);
+            error_setg(errp, "spice: tried to setup tls-channel"
+                       " without specifying a TLS port");
+            return -1;
         }
         security = SPICE_CHANNEL_SECURITY_SSL;
     }
@@ -615,8 +615,9 @@ static int add_channel(void *opaque, const char *name, const char *value,
         rc = spice_server_set_channel_security(spice_server, value, security);
     }
     if (rc != 0) {
-        error_report("spice: failed to set channel security for %s", value);
-        exit(1);
+        error_setg(errp, "spice: failed to set channel security for %s",
+                   value);
+        return -1;
     }
     return 0;
 }
@@ -787,7 +788,7 @@ void qemu_spice_init(void)
     spice_server_set_playback_compression
         (spice_server, qemu_opt_get_bool(opts, "playback-compression", 1));
 
-    qemu_opt_foreach(opts, add_channel, &tls_port, NULL);
+    qemu_opt_foreach(opts, add_channel, &tls_port, &error_fatal);
 
     spice_server_set_name(spice_server, qemu_name);
     spice_server_set_uuid(spice_server, (unsigned char *)&qemu_uuid);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (26 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 20:46   ` Eric Blake
  2018-10-09  7:45   ` Greg Kurz
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
                   ` (2 subsequent siblings)
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Greg Kurz

Calling error_report() from within a a function that takes an Error **
argument is suspicious.  qemu_fsdev_add() does that, and its caller
fsdev_init_func() then fails without setting an error.  Its caller
main(), via qemu_opts_foreach(), is fine with it, but clean it up
anyway.

Cc: Greg Kurz <groug@kaod.org>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 fsdev/qemu-fsdev-dummy.c |  2 +-
 fsdev/qemu-fsdev.c       | 12 +++++-------
 fsdev/qemu-fsdev.h       |  2 +-
 hw/9pfs/xen-9p-backend.c |  7 ++++++-
 vl.c                     |  8 +++-----
 5 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/fsdev/qemu-fsdev-dummy.c b/fsdev/qemu-fsdev-dummy.c
index 6dc0fbc4c4..489cd29081 100644
--- a/fsdev/qemu-fsdev-dummy.c
+++ b/fsdev/qemu-fsdev-dummy.c
@@ -15,7 +15,7 @@
 #include "qemu/config-file.h"
 #include "qemu/module.h"
 
-int qemu_fsdev_add(QemuOpts *opts)
+int qemu_fsdev_add(QemuOpts *opts, Error **errp)
 {
     return 0;
 }
diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c
index 8a4afbffbd..7a3b87cc9e 100644
--- a/fsdev/qemu-fsdev.c
+++ b/fsdev/qemu-fsdev.c
@@ -30,7 +30,7 @@ static FsDriverTable FsDrivers[] = {
     { .name = "proxy", .ops = &proxy_ops},
 };
 
-int qemu_fsdev_add(QemuOpts *opts)
+int qemu_fsdev_add(QemuOpts *opts, Error **errp)
 {
     int i;
     struct FsDriverListEntry *fsle;
@@ -38,10 +38,9 @@ int qemu_fsdev_add(QemuOpts *opts)
     const char *fsdriver = qemu_opt_get(opts, "fsdriver");
     const char *writeout = qemu_opt_get(opts, "writeout");
     bool ro = qemu_opt_get_bool(opts, "readonly", 0);
-    Error *local_err = NULL;
 
     if (!fsdev_id) {
-        error_report("fsdev: No id specified");
+        error_setg(errp, "fsdev: No id specified");
         return -1;
     }
 
@@ -53,11 +52,11 @@ int qemu_fsdev_add(QemuOpts *opts)
         }
 
         if (i == ARRAY_SIZE(FsDrivers)) {
-            error_report("fsdev: fsdriver %s not found", fsdriver);
+            error_setg(errp, "fsdev: fsdriver %s not found", fsdriver);
             return -1;
         }
     } else {
-        error_report("fsdev: No fsdriver specified");
+        error_setg(errp, "fsdev: No fsdriver specified");
         return -1;
     }
 
@@ -76,8 +75,7 @@ int qemu_fsdev_add(QemuOpts *opts)
     }
 
     if (fsle->fse.ops->parse_opts) {
-        if (fsle->fse.ops->parse_opts(opts, &fsle->fse, &local_err)) {
-            error_report_err(local_err);
+        if (fsle->fse.ops->parse_opts(opts, &fsle->fse, errp)) {
             g_free(fsle->fse.fsdev_id);
             g_free(fsle);
             return -1;
diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h
index 65e4b1cfab..d9716b4144 100644
--- a/fsdev/qemu-fsdev.h
+++ b/fsdev/qemu-fsdev.h
@@ -38,7 +38,7 @@ typedef struct FsDriverListEntry {
     QTAILQ_ENTRY(FsDriverListEntry) next;
 } FsDriverListEntry;
 
-int qemu_fsdev_add(QemuOpts *opts);
+int qemu_fsdev_add(QemuOpts *opts, Error **errp);
 FsDriverEntry *get_fsdev_fsentry(char *id);
 extern FileOperations local_ops;
 extern FileOperations handle_ops;
diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c
index 6026780f95..3f54a21c76 100644
--- a/hw/9pfs/xen-9p-backend.c
+++ b/hw/9pfs/xen-9p-backend.c
@@ -14,6 +14,7 @@
 #include "hw/9pfs/9p.h"
 #include "hw/xen/xen_backend.h"
 #include "hw/9pfs/xen-9pfs.h"
+#include "qapi/error.h"
 #include "qemu/config-file.h"
 #include "qemu/option.h"
 #include "fsdev/qemu-fsdev.h"
@@ -355,6 +356,7 @@ static int xen_9pfs_free(struct XenDevice *xendev)
 
 static int xen_9pfs_connect(struct XenDevice *xendev)
 {
+    Error *err = NULL;
     int i;
     Xen9pfsDev *xen_9pdev = container_of(xendev, Xen9pfsDev, xendev);
     V9fsState *s = &xen_9pdev->state;
@@ -452,7 +454,10 @@ static int xen_9pfs_connect(struct XenDevice *xendev)
     qemu_opt_set(fsdev, "path", xen_9pdev->path, NULL);
     qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model, NULL);
     qemu_opts_set_id(fsdev, s->fsconf.fsdev_id);
-    qemu_fsdev_add(fsdev);
+    qemu_fsdev_add(fsdev, &err);
+    if (err) {
+        error_report_err(err);
+    }
     v9fs_device_realize_common(s, &xen_9p_transport, NULL);
 
     return 0;
diff --git a/vl.c b/vl.c
index b6f9212f09..4aa976c4cc 100644
--- a/vl.c
+++ b/vl.c
@@ -2249,7 +2249,7 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
 #ifdef CONFIG_VIRTFS
 static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
 {
-    return qemu_fsdev_add(opts);
+    return qemu_fsdev_add(opts, errp);
 }
 #endif
 
@@ -4188,10 +4188,8 @@ int main(int argc, char **argv, char **envp)
                       chardev_init_func, NULL, &error_fatal);
 
 #ifdef CONFIG_VIRTFS
-    if (qemu_opts_foreach(qemu_find_opts("fsdev"),
-                          fsdev_init_func, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("fsdev"),
+                      fsdev_init_func, NULL, &error_fatal);
 #endif
 
     if (qemu_opts_foreach(qemu_find_opts("device"),
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (27 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 20:48   ` Eric Blake
  2018-10-08 21:08   ` Max Reitz
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name() Markus Armbruster
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Max Reitz

If creating (empty) default drives fails, it's a bug.  Therefore,
assert() is more appropriate than exit(1).

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Max Reitz <mreitz@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/vl.c b/vl.c
index 4aa976c4cc..0d25956b2f 100644
--- a/vl.c
+++ b/vl.c
@@ -1156,9 +1156,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
     }
 
     dinfo = drive_new(opts, type);
-    if (!dinfo) {
-        exit(1);
-    }
+    assert(dinfo);
     dinfo->is_default = true;
 
 }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (28 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-08 20:48   ` Eric Blake
  2018-10-08 21:22   ` Max Reitz
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name() Markus Armbruster
  30 siblings, 2 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf, Max Reitz

Calling error_report() from within a a function that takes an Error **
argument is suspicious.  drive_new() does that, and its caller
drive_init_func() then exit()s.  Its caller main(), via
qemu_opts_foreach(), is fine with it, but clean it up anyway:

* Convert drive_new() to Error

* Update add_init_drive() to report the error received from
  drive_new().

* Make main() pass &error_fatal through qemu_opts_foreach(),
  drive_init_func() to drive_new()

* Make default_drive() pass &error_abort through qemu_opts_foreach(),
  drive_init_func() to drive_new()

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Max Reitz <mreitz@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 blockdev.c                | 27 ++++++++++++++-------------
 device-hotplug.c          |  5 ++++-
 include/sysemu/blockdev.h |  3 ++-
 vl.c                      | 11 ++++-------
 4 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index a8755bd908..574adbcb7f 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -759,7 +759,8 @@ QemuOptsList qemu_legacy_drive_opts = {
     },
 };
 
-DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
+DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
+                     Error **errp)
 {
     const char *value;
     BlockBackend *blk;
@@ -808,7 +809,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
         qemu_opt_rename(all_opts, opt_renames[i].from, opt_renames[i].to,
                         &local_err);
         if (local_err) {
-            error_report_err(local_err);
+            error_propagate(errp, local_err);
             return NULL;
         }
     }
@@ -819,7 +820,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
         bool writethrough;
 
         if (bdrv_parse_cache_mode(value, &flags, &writethrough) != 0) {
-            error_report("invalid cache option");
+            error_setg(errp, "invalid cache option");
             return NULL;
         }
 
@@ -847,7 +848,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
                                    &error_abort);
     qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
     if (local_err) {
-        error_report_err(local_err);
+        error_propagate(errp, local_err);
         goto fail;
     }
 
@@ -860,7 +861,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
             media = MEDIA_CDROM;
             read_only = true;
         } else {
-            error_report("'%s' invalid media", value);
+            error_setg(errp, "'%s' invalid media", value);
             goto fail;
         }
     }
@@ -885,7 +886,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
              type++) {
         }
         if (type == IF_COUNT) {
-            error_report("unsupported bus type '%s'", value);
+            error_setg(errp, "unsupported bus type '%s'", value);
             goto fail;
         }
     } else {
@@ -902,7 +903,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
 
     if (index != -1) {
         if (bus_id != 0 || unit_id != -1) {
-            error_report("index cannot be used with bus and unit");
+            error_setg(errp, "index cannot be used with bus and unit");
             goto fail;
         }
         bus_id = drive_index_to_bus_id(type, index);
@@ -921,13 +922,13 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     }
 
     if (max_devs && unit_id >= max_devs) {
-        error_report("unit %d too big (max is %d)", unit_id, max_devs - 1);
+        error_setg(errp, "unit %d too big (max is %d)", unit_id, max_devs - 1);
         goto fail;
     }
 
     if (drive_get(type, bus_id, unit_id) != NULL) {
-        error_report("drive with bus=%d, unit=%d (index=%d) exists",
-                     bus_id, unit_id, index);
+        error_setg(errp, "drive with bus=%d, unit=%d (index=%d) exists",
+                   bus_id, unit_id, index);
         goto fail;
     }
 
@@ -970,7 +971,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     if (werror != NULL) {
         if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO &&
             type != IF_NONE) {
-            error_report("werror is not supported by this bus type");
+            error_setg(errp, "werror is not supported by this bus type");
             goto fail;
         }
         qdict_put_str(bs_opts, "werror", werror);
@@ -980,7 +981,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     if (rerror != NULL) {
         if (type != IF_IDE && type != IF_VIRTIO && type != IF_SCSI &&
             type != IF_NONE) {
-            error_report("rerror is not supported by this bus type");
+            error_setg(errp, "rerror is not supported by this bus type");
             goto fail;
         }
         qdict_put_str(bs_opts, "rerror", rerror);
@@ -991,7 +992,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     bs_opts = NULL;
     if (!blk) {
         if (local_err) {
-            error_report_err(local_err);
+            error_propagate(errp, local_err);
         }
         goto fail;
     } else {
diff --git a/device-hotplug.c b/device-hotplug.c
index cd427e2c76..6090d5f1e9 100644
--- a/device-hotplug.c
+++ b/device-hotplug.c
@@ -28,6 +28,7 @@
 #include "sysemu/block-backend.h"
 #include "sysemu/blockdev.h"
 #include "qapi/qmp/qdict.h"
+#include "qapi/error.h"
 #include "qemu/config-file.h"
 #include "qemu/option.h"
 #include "sysemu/sysemu.h"
@@ -36,6 +37,7 @@
 
 static DriveInfo *add_init_drive(const char *optstr)
 {
+    Error *err = NULL;
     DriveInfo *dinfo;
     QemuOpts *opts;
     MachineClass *mc;
@@ -45,8 +47,9 @@ static DriveInfo *add_init_drive(const char *optstr)
         return NULL;
 
     mc = MACHINE_GET_CLASS(current_machine);
-    dinfo = drive_new(opts, mc->block_default_type);
+    dinfo = drive_new(opts, mc->block_default_type, &err);
     if (!dinfo) {
+        error_report_err(err);
         qemu_opts_del(opts);
         return NULL;
     }
diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
index 24954b94e0..d34c4920dc 100644
--- a/include/sysemu/blockdev.h
+++ b/include/sysemu/blockdev.h
@@ -54,7 +54,8 @@ DriveInfo *drive_get_next(BlockInterfaceType type);
 QemuOpts *drive_def(const char *optstr);
 QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
                     const char *optstr);
-DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
+DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type,
+                     Error **errp);
 
 /* device-hotplug */
 
diff --git a/vl.c b/vl.c
index 0d25956b2f..101e0123d9 100644
--- a/vl.c
+++ b/vl.c
@@ -1129,7 +1129,7 @@ static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
 {
     BlockInterfaceType *block_default_type = opaque;
 
-    return drive_new(opts, *block_default_type) == NULL;
+    return drive_new(opts, *block_default_type, errp) == NULL;
 }
 
 static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
@@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
         drive_enable_snapshot(NULL, opts, NULL);
     }
 
-    dinfo = drive_new(opts, type);
-    assert(dinfo);
+    dinfo = drive_new(opts, type, &error_abort);
     dinfo->is_default = true;
 
 }
@@ -4348,10 +4347,8 @@ int main(int argc, char **argv, char **envp)
         qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
                           NULL, NULL);
     }
-    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
-                          &machine_class->block_default_type, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
+                      &machine_class->block_default_type, &error_fatal);
 
     default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
                   CDROM_OPTS);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name()
  2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
                   ` (29 preceding siblings ...)
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
@ 2018-10-08 17:31 ` Markus Armbruster
  2018-10-09  6:06   ` Philippe Mathieu-Daudé
  30 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-08 17:31 UTC (permalink / raw)
  To: qemu-devel

main() checks for parse_name() failure even though it can't actually
fail.  That's okay.  Simplify it to check by passing &error_fatal,
like the other users of qemu_opts_foreach().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 vl.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/vl.c b/vl.c
index 101e0123d9..0a76c58943 100644
--- a/vl.c
+++ b/vl.c
@@ -3926,10 +3926,8 @@ int main(int argc, char **argv, char **envp)
     }
 #endif
 
-    if (qemu_opts_foreach(qemu_find_opts("name"),
-                          parse_name, NULL, NULL)) {
-        exit(1);
-    }
+    qemu_opts_foreach(qemu_find_opts("name"),
+                      parse_name, NULL, &error_fatal);
 
 #ifndef _WIN32
     qemu_opts_foreach(qemu_find_opts("add-fd"),
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa() Markus Armbruster
@ 2018-10-08 18:01   ` Eduardo Habkost
  0 siblings, 0 replies; 90+ messages in thread
From: Eduardo Habkost @ 2018-10-08 18:01 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon, Oct 08, 2018 at 07:31:19PM +0200, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_numa() does that, and then fails without setting
> an error.  Its caller main(), via qemu_opts_foreach(), is fine with
> it, but clean it up anyway.
> 
> While there, give parse_numa() internal linkage.
> 
> Cc: Eduardo Habkost <ehabkost@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

Queueing on machine-next.  Thanks!

-- 
Eduardo

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node error handling
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
@ 2018-10-08 18:03   ` Eduardo Habkost
  2018-10-11 17:38     ` Markus Armbruster
  2018-10-12 14:35   ` Igor Mammedov
  1 sibling, 1 reply; 90+ messages in thread
From: Eduardo Habkost @ 2018-10-08 18:03 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Igor Mammedov

On Mon, Oct 08, 2018 at 07:31:08PM +0200, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_numa_node() does that, and then exit()s.  It
> also passes &error_fatal to machine_set_cpu_numa_node().  Both wrong.
> Attempting to configure numa when the machine doesn't support it kills
> the VM:
> 
>     $ qemu-system-x86_64 -nodefaults -S -display none -M none -preconfig -qmp stdio
>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
>     {"execute": "qmp_capabilities"}
>     {"return": {}}
>     {"execute": "set-numa-node", "arguments": {"type": "node"}}
>     NUMA is not supported by this machine-type
>     $ echo $?
>     1
> 
> Messed up when commit 64c2a8f6d3f and 7c88e65d9e9 (v2.10.0) added
> incorrect error handling right next to correct examples.  Latent bug
> until commit f3be67812c2 (v3.0.0) made it accessible via QMP.  Fairly
> harmless in practice, because it's limited to RUN_STATE_PRECONFIG.
> The fix is obvious: replace error_report(); exit() by error_setg();
> return.
> 
> This affects parse_numa_node()'s other caller
> numa_complete_configuration(): since it ignores errors, the "NUMA is
> not supported by this machine-type" is now ignored, too.  But that
> error is as unexpected there as any other.  Change it to abort on
> error instead.
> 
> Fixes: f3be67812c226162f86ce92634bd913714445420
> Cc: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> 
> fixup! numa: Fix QMP command set-numa-node error handling

I assume this last line was kept by mistake, and I'm removing it
while committing.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit Markus Armbruster
@ 2018-10-08 19:04   ` Alex Williamson
  0 siblings, 0 replies; 90+ messages in thread
From: Alex Williamson @ 2018-10-08 19:04 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon,  8 Oct 2018 19:30:59 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> The previous commit changed vfio's warning messages from
> 
>     vfio warning: DEV-NAME: Could not frobnicate
> 
> to
> 
>     warning: vfio DEV-NAME: Could not frobnicate
> 
> To match this change, change error messages from
> 
>     vfio error: DEV-NAME: On fire
> 
> to
> 
>     vfio DEV-NAME: On fire
> 
> Note the loss of "error".  If we think marking error messages that way
> is a good idea, we should mark *all* error messages, i.e. make
> error_report() print it.
> 
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/vfio/pci-quirks.c          | 4 ++--
>  hw/vfio/pci.c                 | 8 ++++----
>  hw/vfio/platform.c            | 2 +-
>  include/hw/vfio/vfio-common.h | 1 -
>  4 files changed, 7 insertions(+), 8 deletions(-)

Acked-by: Alex Williamson <alex.williamson@redhat.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 04/31] vfio: Use warn_report() & friends to report warnings
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 04/31] vfio: " Markus Armbruster
@ 2018-10-08 19:04   ` Alex Williamson
  0 siblings, 0 replies; 90+ messages in thread
From: Alex Williamson @ 2018-10-08 19:04 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon,  8 Oct 2018 19:30:58 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> The vfio code reports warnings like
> 
>     error_report(WARN_PREFIX "Could not frobnicate", DEV-NAME);
> 
> where WARN_PREFIX is defined so the message comes out as
> 
>     vfio warning: DEV-NAME: Could not frobnicate
> 
> This usage predates the introduction of warn_report() & friends in
> commit 97f40301f1d.  It's time to convert to that interface.  Since
> these functions already prefix the message with "warning: ", replace
> WARN_PREFIX by VFIO_MSG_PREFIX, so the messages come out like
> 
>     warning: vfio DEV-NAME: Could not frobnicate
> 
> The next commit will replace ERR_PREFIX.
> 
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/vfio/pci.c                 | 14 +++++++-------
>  hw/vfio/platform.c            |  4 ++--
>  include/hw/vfio/vfio-common.h |  2 +-
>  3 files changed, 10 insertions(+), 10 deletions(-)

Acked-by: Alex Williamson <alex.williamson@redhat.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again)
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
@ 2018-10-08 20:32   ` Eric Blake
  2018-10-11 17:25     ` Markus Armbruster
  2018-10-08 22:25   ` David Gibson
  1 sibling, 1 reply; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:32 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: David Gibson, Alexander Graf, Paolo Bonzini

On 10/8/18 12:30 PM, Markus Armbruster wrote:
> Add a slight improvement of the Coccinelle semantic patch from commit
> 07d04a0219b,

which shares the same commit title, but does not actually have a 
semantic patch, but rather defers to the even older 007b065.  But I'm 
not too worried about either the duplicated commit title nor the chain 
of references to follow - as this is a no-semantic-change patch rather 
than a bugfix, it's less likely to cause confusion to any downstream 
backport efforts.

> and use it to clean up.  It leaves dead Error * variables
> behind, cleaned up manually.

Coccinelle can handle that too, if we want to make the .cocci file 
longer (but off-hand, I don't remember the exact semantic patch formula 
to express a variable that is initialized but then never used, as a 
result of applying earlier semantic patches). So the manual cleanup for 
now still seems tractable.

> 
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Eric Blake <eblake@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/intc/xics_kvm.c                       |  7 +------
>   qemu-nbd.c                               |  6 +-----
>   scripts/coccinelle/use-error_fatal.cocci | 20 ++++++++++++++++++++
>   vl.c                                     |  7 +------
>   4 files changed, 23 insertions(+), 17 deletions(-)
>   create mode 100644 scripts/coccinelle/use-error_fatal.cocci
> 

> +++ b/scripts/coccinelle/use-error_fatal.cocci
> @@ -0,0 +1,20 @@
> +@@
> +type T;
> +identifier FUN, RET;
> +expression list ARGS;
> +expression ERR, EC, FAIL;

The slight improvement from the original git commit log script is the 
addition of FAIL,

> +@@
> +(
> +-    T RET = FUN(ARGS, &ERR);
> ++    T RET = FUN(ARGS, &error_fatal);
> +|
> +-    RET = FUN(ARGS, &ERR);
> ++    RET = FUN(ARGS, &error_fatal);
> +|
> +-    FUN(ARGS, &ERR);
> ++    FUN(ARGS, &error_fatal);
> +)
> +-    if (FAIL) {

and a check for arbitrary condition FAIL rather than a more specific ERR 
!= NULL.  Makes sense.

> +-        error_report_err(ERR);
> +-        exit(EC);
> +-    }

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings Markus Armbruster
@ 2018-10-08 20:35   ` Eric Blake
  0 siblings, 0 replies; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:35 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: Kevin Wolf, Hitoshi Mitake, Peter Lieven, Ronnie Sahlberg,
	Liu Yuan, Paolo Bonzini

On 10/8/18 12:30 PM, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  Convert a few that are actually warnings to
> warn_report().
> 
> While there, split warnings consisting of multiple sentences to
> conform to conventions spelled out in warn_report()'s contract, and
> improve a rather useless warning in sheepdog.c.
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
@ 2018-10-08 20:43   ` Eric Blake
  2018-10-09 11:11   ` Marc-André Lureau
  2018-10-09 13:25   ` Daniel P. Berrangé
  2 siblings, 0 replies; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:43 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 10/8/18 12:31 PM, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  user_creatable_add_opts_foreach() does that, and then
> fails without setting an error.  Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
> 
> Cc: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qemu-io.c               |  8 +++-----
>   qemu-nbd.c              |  8 +++-----
>   qom/object_interfaces.c |  4 +---
>   vl.c                    | 16 ++++++----------
>   4 files changed, 13 insertions(+), 23 deletions(-)

While I could take this through my NBD tree, I think it makes more sense 
to go through your error tree with the rest of the series.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
@ 2018-10-08 20:46   ` Eric Blake
  2018-10-11 17:51     ` Markus Armbruster
  2018-10-09  7:45   ` Greg Kurz
  1 sibling, 1 reply; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:46 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Greg Kurz

On 10/8/18 12:31 PM, Markus Armbruster wrote:
> Calling error_report() from within a a function that takes an Error **

s/a a/a/

> argument is suspicious.  qemu_fsdev_add() does that, and its caller
> fsdev_init_func() then fails without setting an error.  Its caller
> main(), via qemu_opts_foreach(), is fine with it, but clean it up
> anyway.
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
@ 2018-10-08 20:48   ` Eric Blake
  2018-10-08 21:22   ` Max Reitz
  1 sibling, 0 replies; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:48 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Kevin Wolf, Max Reitz

On 10/8/18 12:31 PM, Markus Armbruster wrote:
> Calling error_report() from within a a function that takes an Error **

s/a a/a/

> argument is suspicious.  drive_new() does that, and its caller
> drive_init_func() then exit()s.  Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway:
> 
> * Convert drive_new() to Error
> 
> * Update add_init_drive() to report the error received from
>    drive_new().
> 
> * Make main() pass &error_fatal through qemu_opts_foreach(),
>    drive_init_func() to drive_new()
> 
> * Make default_drive() pass &error_abort through qemu_opts_foreach(),
>    drive_init_func() to drive_new()
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   blockdev.c                | 27 ++++++++++++++-------------
>   device-hotplug.c          |  5 ++++-
>   include/sysemu/blockdev.h |  3 ++-
>   vl.c                      | 11 ++++-------
>   4 files changed, 24 insertions(+), 22 deletions(-)
> 

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
@ 2018-10-08 20:48   ` Eric Blake
  2018-10-08 21:08   ` Max Reitz
  1 sibling, 0 replies; 90+ messages in thread
From: Eric Blake @ 2018-10-08 20:48 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Kevin Wolf, Max Reitz

On 10/8/18 12:31 PM, Markus Armbruster wrote:
> If creating (empty) default drives fails, it's a bug.  Therefore,
> assert() is more appropriate than exit(1).
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   vl.c | 4 +---
>   1 file changed, 1 insertion(+), 3 deletions(-)

The assert disappears in the next patch (replaced by an &error_fatal), 
but the separation of patches makes sense.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
  2018-10-08 20:48   ` Eric Blake
@ 2018-10-08 21:08   ` Max Reitz
  1 sibling, 0 replies; 90+ messages in thread
From: Max Reitz @ 2018-10-08 21:08 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Kevin Wolf

[-- Attachment #1: Type: text/plain, Size: 418 bytes --]

On 08.10.18 19:31, Markus Armbruster wrote:
> If creating (empty) default drives fails, it's a bug.  Therefore,
> assert() is more appropriate than exit(1).
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  vl.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)

Reviewed-by: Max Reitz <mreitz@redhat.com>


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
  2018-10-08 20:48   ` Eric Blake
@ 2018-10-08 21:22   ` Max Reitz
  2018-10-12  5:44     ` Markus Armbruster
  1 sibling, 1 reply; 90+ messages in thread
From: Max Reitz @ 2018-10-08 21:22 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Kevin Wolf

[-- Attachment #1: Type: text/plain, Size: 6026 bytes --]

On 08.10.18 19:31, Markus Armbruster wrote:
> Calling error_report() from within a a function that takes an Error **
> argument is suspicious.  drive_new() does that, and its caller
> drive_init_func() then exit()s.

I'm afraid I don't quite follow you here.  There is no function here
that takes an Error ** already and then calls error_report().  There is
however drive_new() that does not take an Error **, consequentially
calls error_report(), and there is its caller drive_init_func() which
does take an Error ** but does not set it.

So while I fully agree with you to make drive_new() take an Error **
(and thus effectively fix drive_init_func()), I don't quite understand
this explanation.

(Furthermore, drive_init_func() does not exit().  It's main() that
exit()s after calling drive_init_func().)

> Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway:
> 
> * Convert drive_new() to Error
> 
> * Update add_init_drive() to report the error received from
>   drive_new().
> 
> * Make main() pass &error_fatal through qemu_opts_foreach(),
>   drive_init_func() to drive_new()
> 
> * Make default_drive() pass &error_abort through qemu_opts_foreach(),
>   drive_init_func() to drive_new()
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  blockdev.c                | 27 ++++++++++++++-------------
>  device-hotplug.c          |  5 ++++-
>  include/sysemu/blockdev.h |  3 ++-
>  vl.c                      | 11 ++++-------
>  4 files changed, 24 insertions(+), 22 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index a8755bd908..574adbcb7f 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -759,7 +759,8 @@ QemuOptsList qemu_legacy_drive_opts = {

[...]

> @@ -991,7 +992,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
>      bs_opts = NULL;
>      if (!blk) {
>          if (local_err) {
> -            error_report_err(local_err);
> +            error_propagate(errp, local_err);
>          }

Wait, what would be the case where blockdev_init() returns NULL but
*errp remains unse——— oh no.

There is only one case which is someone specified "format=help".  Hm.  I
suppose you are as unhappy as me about the fact that because of this
drive_new() cannot guarantee that *errp is set in case of an error.

I think it's ""fine"" (*gnashing teeth*) to keep it this way, but it
means that callers need to continue to check the return value and not
*errp alone.

>          goto fail;
>      } else {
> diff --git a/device-hotplug.c b/device-hotplug.c
> index cd427e2c76..6090d5f1e9 100644
> --- a/device-hotplug.c
> +++ b/device-hotplug.c
> @@ -28,6 +28,7 @@
>  #include "sysemu/block-backend.h"
>  #include "sysemu/blockdev.h"
>  #include "qapi/qmp/qdict.h"
> +#include "qapi/error.h"
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  #include "sysemu/sysemu.h"
> @@ -36,6 +37,7 @@
>  
>  static DriveInfo *add_init_drive(const char *optstr)
>  {
> +    Error *err = NULL;
>      DriveInfo *dinfo;
>      QemuOpts *opts;
>      MachineClass *mc;
> @@ -45,8 +47,9 @@ static DriveInfo *add_init_drive(const char *optstr)
>          return NULL;
>  
>      mc = MACHINE_GET_CLASS(current_machine);
> -    dinfo = drive_new(opts, mc->block_default_type);
> +    dinfo = drive_new(opts, mc->block_default_type, &err);
>      if (!dinfo) {
> +        error_report_err(err);
>          qemu_opts_del(opts);
>          return NULL;
>      }
> diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
> index 24954b94e0..d34c4920dc 100644
> --- a/include/sysemu/blockdev.h
> +++ b/include/sysemu/blockdev.h
> @@ -54,7 +54,8 @@ DriveInfo *drive_get_next(BlockInterfaceType type);
>  QemuOpts *drive_def(const char *optstr);
>  QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
>                      const char *optstr);
> -DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
> +DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type,
> +                     Error **errp);
>  
>  /* device-hotplug */
>  
> diff --git a/vl.c b/vl.c
> index 0d25956b2f..101e0123d9 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1129,7 +1129,7 @@ static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  {
>      BlockInterfaceType *block_default_type = opaque;
>  
> -    return drive_new(opts, *block_default_type) == NULL;
> +    return drive_new(opts, *block_default_type, errp) == NULL;
>  }
>  
>  static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
> @@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
>          drive_enable_snapshot(NULL, opts, NULL);
>      }
>  
> -    dinfo = drive_new(opts, type);
> -    assert(dinfo);
> +    dinfo = drive_new(opts, type, &error_abort);

Which means the assertion is still necessary here.

>      dinfo->is_default = true;
>  
>  }
> @@ -4348,10 +4347,8 @@ int main(int argc, char **argv, char **envp)
>          qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
>                            NULL, NULL);
>      }
> -    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
> -                          &machine_class->block_default_type, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
> +                      &machine_class->block_default_type, &error_fatal);

And we still have to keep an exit() here.

Alternative: You transform blockdev_init()'s format=help into an error
(or construct a new error in drive_new() if blockdev_init() returned
NULL but no error).

Max

>  
>      default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
>                    CDROM_OPTS);
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again)
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
  2018-10-08 20:32   ` Eric Blake
@ 2018-10-08 22:25   ` David Gibson
  1 sibling, 0 replies; 90+ messages in thread
From: David Gibson @ 2018-10-08 22:25 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Alexander Graf, Eric Blake, Paolo Bonzini

[-- Attachment #1: Type: text/plain, Size: 3936 bytes --]

On Mon, Oct 08, 2018 at 07:30:55PM +0200, Markus Armbruster wrote:
> Add a slight improvement of the Coccinelle semantic patch from commit
> 07d04a0219b, and use it to clean up.  It leaves dead Error * variables
> behind, cleaned up manually.
> 
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Eric Blake <eblake@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

ppc part

Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  hw/intc/xics_kvm.c                       |  7 +------
>  qemu-nbd.c                               |  6 +-----
>  scripts/coccinelle/use-error_fatal.cocci | 20 ++++++++++++++++++++
>  vl.c                                     |  7 +------
>  4 files changed, 23 insertions(+), 17 deletions(-)
>  create mode 100644 scripts/coccinelle/use-error_fatal.cocci
> 
> diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
> index 30c3769a20..e8fa9a53ae 100644
> --- a/hw/intc/xics_kvm.c
> +++ b/hw/intc/xics_kvm.c
> @@ -198,17 +198,12 @@ static void ics_get_kvm_state(ICSState *ics)
>  {
>      uint64_t state;
>      int i;
> -    Error *local_err = NULL;
>  
>      for (i = 0; i < ics->nr_irqs; i++) {
>          ICSIRQState *irq = &ics->irqs[i];
>  
>          kvm_device_access(kernel_xics_fd, KVM_DEV_XICS_GRP_SOURCES,
> -                          i + ics->offset, &state, false, &local_err);
> -        if (local_err) {
> -            error_report_err(local_err);
> -            exit(1);
> -        }
> +                          i + ics->offset, &state, false, &error_fatal);
>  
>          irq->server = state & KVM_XICS_DESTINATION_MASK;
>          irq->saved_priority = (state >> KVM_XICS_PRIORITY_SHIFT)
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index e76fe3082a..7874bc973c 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -1002,11 +1002,7 @@ int main(int argc, char **argv)
>      }
>  
>      exp = nbd_export_new(bs, dev_offset, fd_size, nbdflags, nbd_export_closed,
> -                         writethrough, NULL, &local_err);
> -    if (!exp) {
> -        error_report_err(local_err);
> -        exit(EXIT_FAILURE);
> -    }
> +                         writethrough, NULL, &error_fatal);
>      nbd_export_set_name(exp, export_name);
>      nbd_export_set_description(exp, export_description);
>  
> diff --git a/scripts/coccinelle/use-error_fatal.cocci b/scripts/coccinelle/use-error_fatal.cocci
> new file mode 100644
> index 0000000000..10fff0aec4
> --- /dev/null
> +++ b/scripts/coccinelle/use-error_fatal.cocci
> @@ -0,0 +1,20 @@
> +@@
> +type T;
> +identifier FUN, RET;
> +expression list ARGS;
> +expression ERR, EC, FAIL;
> +@@
> +(
> +-    T RET = FUN(ARGS, &ERR);
> ++    T RET = FUN(ARGS, &error_fatal);
> +|
> +-    RET = FUN(ARGS, &ERR);
> ++    RET = FUN(ARGS, &error_fatal);
> +|
> +-    FUN(ARGS, &ERR);
> ++    FUN(ARGS, &error_fatal);
> +)
> +-    if (FAIL) {
> +-        error_report_err(ERR);
> +-        exit(EC);
> +-    }
> diff --git a/vl.c b/vl.c
> index a867c9c4d9..9d2b38a31f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2002,15 +2002,10 @@ static void select_vgahw(const char *p)
>  
>  static void parse_display_qapi(const char *optarg)
>  {
> -    Error *err = NULL;
>      DisplayOptions *opts;
>      Visitor *v;
>  
> -    v = qobject_input_visitor_new_str(optarg, "type", &err);
> -    if (!v) {
> -        error_report_err(err);
> -        exit(1);
> -    }
> +    v = qobject_input_visitor_new_str(optarg, "type", &error_fatal);
>  
>      visit_type_DisplayOptions(v, NULL, &opts, &error_fatal);
>      QAPI_CLONE_MEMBERS(DisplayOptions, &dpy, opts);

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 03/31] cpus hw target: Use warn_report() & friends to report warnings
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
@ 2018-10-08 22:25   ` David Gibson
  2018-10-09  9:56   ` Alex Bennée
  1 sibling, 0 replies; 90+ messages in thread
From: David Gibson @ 2018-10-08 22:25 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, Alex Bennée, Mark Cave-Ayland, Alex Williamson,
	Fam Zheng, Wei Huang

[-- Attachment #1: Type: text/plain, Size: 8099 bytes --]

On Mon, Oct 08, 2018 at 07:30:57PM +0200, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  Convert a few that are actually warnings to
> warn_report().
> 
> While there, split a warning consisting of multiple sentences to
> conform to conventions spelled out in warn_report()'s contract.
> 
> Cc: Alex Bennée <alex.bennee@linaro.org>
> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Cc: Fam Zheng <famz@redhat.com>
> Cc: Wei Huang <wei@redhat.com>
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

ppc part
Acked-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  cpus.c                          |  8 ++++----
>  hw/display/cg3.c                |  2 +-
>  hw/display/tcx.c                |  2 +-
>  hw/misc/ivshmem.c               |  4 ++--
>  hw/net/virtio-net.c             |  8 ++++----
>  hw/virtio/virtio-pci.c          |  4 ++--
>  target/i386/cpu.c               | 17 +++++++++--------
>  target/ppc/translate_init.inc.c |  4 ++--
>  8 files changed, 25 insertions(+), 24 deletions(-)
> 
> diff --git a/cpus.c b/cpus.c
> index 361678e459..7804071872 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -211,12 +211,12 @@ void qemu_tcg_configure(QemuOpts *opts, Error **errp)
>                  error_setg(errp, "No MTTCG when icount is enabled");
>              } else {
>  #ifndef TARGET_SUPPORTS_MTTCG
> -                error_report("Guest not yet converted to MTTCG - "
> -                             "you may get unexpected results");
> +                warn_report("Guest not yet converted to MTTCG - "
> +                            "you may get unexpected results");
>  #endif
>                  if (!check_tcg_memory_orders_compatible()) {
> -                    error_report("Guest expects a stronger memory ordering "
> -                                 "than the host provides");
> +                    warn_report("Guest expects a stronger memory ordering "
> +                                "than the host provides");
>                      error_printf("This may cause strange/hard to debug errors\n");
>                  }
>                  mttcg_enabled = true;
> diff --git a/hw/display/cg3.c b/hw/display/cg3.c
> index 1c199ab369..e50d97e48c 100644
> --- a/hw/display/cg3.c
> +++ b/hw/display/cg3.c
> @@ -307,7 +307,7 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
>          ret = load_image_mr(fcode_filename, &s->rom);
>          g_free(fcode_filename);
>          if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
> -            error_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
> +            warn_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
>          }
>      }
>  
> diff --git a/hw/display/tcx.c b/hw/display/tcx.c
> index b2786ee8d0..66f2459226 100644
> --- a/hw/display/tcx.c
> +++ b/hw/display/tcx.c
> @@ -823,7 +823,7 @@ static void tcx_realizefn(DeviceState *dev, Error **errp)
>          ret = load_image_mr(fcode_filename, &s->rom);
>          g_free(fcode_filename);
>          if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
> -            error_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
> +            warn_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
>          }
>      }
>  
> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
> index 6febbabcaa..4794518b2c 100644
> --- a/hw/misc/ivshmem.c
> +++ b/hw/misc/ivshmem.c
> @@ -1292,8 +1292,8 @@ static void ivshmem_realize(PCIDevice *dev, Error **errp)
>      IVShmemState *s = IVSHMEM_COMMON(dev);
>  
>      if (!qtest_enabled()) {
> -        error_report("ivshmem is deprecated, please use ivshmem-plain"
> -                     " or ivshmem-doorbell instead");
> +        warn_report("ivshmem is deprecated, please use ivshmem-plain"
> +                    " or ivshmem-doorbell instead");
>      }
>  
>      if (qemu_chr_fe_backend_connected(&s->server_chr) + !!s->shmobj != 1) {
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 4bdd5b8532..385b1a03e9 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -2020,10 +2020,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
>  
>      if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer")
>                         && strcmp(n->net_conf.tx, "bh")) {
> -        error_report("virtio-net: "
> -                     "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
> -                     n->net_conf.tx);
> -        error_report("Defaulting to \"bh\"");
> +        warn_report("virtio-net: "
> +                    "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
> +                    n->net_conf.tx);
> +        error_printf("Defaulting to \"bh\"");
>      }
>  
>      n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n),
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 3a01fe90f0..a954799267 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1683,8 +1683,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
>          if (err) {
>              /* Notice when a system that supports MSIx can't initialize it */
>              if (err != -ENOTSUP) {
> -                error_report("unable to init msix vectors to %" PRIu32,
> -                             proxy->nvectors);
> +                warn_report("unable to init msix vectors to %" PRIu32,
> +                            proxy->nvectors);
>              }
>              proxy->nvectors = 0;
>          }
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index c88876dfe3..9d4217afba 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -5123,14 +5123,15 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
>       * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
>       * cs->nr_threads hasn't be populated yet and the checking is incorrect.
>       */
> -     if (IS_AMD_CPU(env) &&
> -         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
> -         cs->nr_threads > 1 && !ht_warned) {
> -            error_report("This family of AMD CPU doesn't support "
> -                         "hyperthreading(%d). Please configure -smp "
> -                         "options properly or try enabling topoext feature.",
> -                         cs->nr_threads);
> -        ht_warned = true;
> +    if (IS_AMD_CPU(env) &&
> +        !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
> +        cs->nr_threads > 1 && !ht_warned) {
> +            warn_report("This family of AMD CPU doesn't support "
> +                        "hyperthreading(%d)",
> +                        cs->nr_threads);
> +            error_printf("Please configure -smp options properly"
> +                         " or try enabling topoext feature.\n");
> +            ht_warned = true;
>      }
>  
>      x86_cpu_apic_realize(cpu, &local_err);
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 263e63cb03..ee9432eb15 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8381,8 +8381,8 @@ static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name,
>      QNull *null = NULL;
>  
>      if (!qtest_enabled()) {
> -        error_report("CPU 'compat' property is deprecated and has no effect; "
> -                     "use max-cpu-compat machine property instead");
> +        warn_report("CPU 'compat' property is deprecated and has no effect; "
> +                    "use max-cpu-compat machine property instead");
>      }
>      visit_type_null(v, name, &null, NULL);
>      qobject_unref(null);

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
@ 2018-10-09  3:24   ` Peter Xu
  2018-10-09  9:18   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Peter Xu @ 2018-10-09  3:24 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon, Oct 08, 2018 at 07:31:03PM +0200, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  ioapic_realize() does that, and then exit()s.
> Currently mostly harmless, as the device cannot be hot-plugged.
> 
> Fixes: 20fd4b7b6d9282fe0cb83601f1821f31bd257458
> Cc: Peter Xu <peterx@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Peter Xu <peterx@redhat.com>

-- 
Peter Xu

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
@ 2018-10-09  6:02   ` Philippe Mathieu-Daudé
  2018-10-09 11:18   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:02 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  machine_set_property() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  vl.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index ecb70f87d8..3adc9dbe4f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2676,7 +2676,7 @@ static int machine_set_property(void *opaque,
>      g_free(qom_name);
>  
>      if (local_err) {
> -        error_report_err(local_err);
> +        error_propagate(errp, local_err);
>          return -1;
>      }
>  
> @@ -4201,11 +4201,8 @@ int main(int argc, char **argv, char **envp)
>      }
>  
>      machine_opts = qemu_get_machine_opts();
> -    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
> -                         NULL)) {
> -        object_unref(OBJECT(current_machine));
> -        exit(1);
> -    }
> +    qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
> +                     &error_fatal);
>  
>      configure_accelerator(current_machine);
>  
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
@ 2018-10-09  6:02   ` Philippe Mathieu-Daudé
  2018-10-09 11:21   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:02 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  mon_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  vl.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index 3adc9dbe4f..1009d708a0 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2270,8 +2270,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      } else if (strcmp(mode, "control") == 0) {
>          flags = MONITOR_USE_CONTROL;
>      } else {
> -        error_report("unknown monitor mode \"%s\"", mode);
> -        exit(1);
> +        error_setg(errp, "unknown monitor mode \"%s\"", mode);
> +        return -1;
>      }
>  
>      if (qemu_opt_get_bool(opts, "pretty", 0))
> @@ -2285,8 +2285,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      chardev = qemu_opt_get(opts, "chardev");
>      chr = qemu_chr_find(chardev);
>      if (chr == NULL) {
> -        error_report("chardev \"%s\" not found", chardev);
> -        exit(1);
> +        error_setg(errp, "chardev \"%s\" not found", chardev);
> +        return -1;
>      }
>  
>      monitor_init(chr, flags);
> @@ -4365,10 +4365,8 @@ int main(int argc, char **argv, char **envp)
>      default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
>      default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
>  
> -    if (qemu_opts_foreach(qemu_find_opts("mon"),
> -                          mon_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("mon"),
> +                      mon_init_func, NULL, &error_fatal);
>  
>      if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
>          exit(1);
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func() Markus Armbruster
@ 2018-10-09  6:05   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:05 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  device_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  vl.c | 10 +++-------
>  1 file changed, 3 insertions(+), 7 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index a3a39ec06b..86eee4c798 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2222,12 +2222,10 @@ static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
>  
>  static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  {
> -    Error *err = NULL;
>      DeviceState *dev;
>  
> -    dev = qdev_device_add(opts, &err);
> +    dev = qdev_device_add(opts, errp);
>      if (!dev) {
> -        error_report_err(err);
>          return -1;
>      }
>      object_unref(OBJECT(dev));
> @@ -4444,10 +4442,8 @@ int main(int argc, char **argv, char **envp)
>  
>      /* init generic devices */
>      rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
> -    if (qemu_opts_foreach(qemu_find_opts("device"),
> -                          device_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("device"),
> +                      device_init_func, NULL, &error_fatal);
>  
>      cpu_synchronize_all_post_init();
>  
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name() Markus Armbruster
@ 2018-10-09  6:06   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:06 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> main() checks for parse_name() failure even though it can't actually
> fail.  That's okay.  Simplify it to check by passing &error_fatal,
> like the other users of qemu_opts_foreach().
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  vl.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index 101e0123d9..0a76c58943 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3926,10 +3926,8 @@ int main(int argc, char **argv, char **envp)
>      }
>  #endif
>  
> -    if (qemu_opts_foreach(qemu_find_opts("name"),
> -                          parse_name, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("name"),
> +                      parse_name, NULL, &error_fatal);
>  
>  #ifndef _WIN32
>      qemu_opts_foreach(qemu_find_opts("add-fd"),
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
@ 2018-10-09  6:07   ` Philippe Mathieu-Daudé
  2018-10-09 11:13   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:07 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  chardev_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  vl.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/vl.c b/vl.c
> index b8576f8f10..ecb70f87d8 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2239,7 +2239,7 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  
>      if (!qemu_chr_new_from_opts(opts, &local_err)) {
>          if (local_err) {
> -            error_report_err(local_err);
> +            error_propagate(errp, local_err);
>              return -1;
>          }
>          exit(0);
> @@ -4185,10 +4185,8 @@ int main(int argc, char **argv, char **envp)
>                        user_creatable_add_opts_foreach,
>                        object_create_initial, &error_fatal);
>  
> -    if (qemu_opts_foreach(qemu_find_opts("chardev"),
> -                          chardev_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("chardev"),
> +                      chardev_init_func, NULL, &error_fatal);
>  
>  #ifdef CONFIG_VIRTFS
>      if (qemu_opts_foreach(qemu_find_opts("fsdev"),
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such Markus Armbruster
@ 2018-10-09  6:09   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09  6:09 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Paolo Bonzini, Marc-André Lureau

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  Convert a few that are actually help and such to
> error_printf().
> 
> Improves output of -chardev help from
> 
>     qemu-system-x86_64: -chardev help: Available chardev backend types:
>     serial
>     ...
> 
> to
> 
>     Available chardev backend types:
>     serial
>     ...
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  chardev/char-pty.c | 2 +-
>  chardev/char.c     | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/chardev/char-pty.c b/chardev/char-pty.c
> index e8d9a53476..f681d637c1 100644
> --- a/chardev/char-pty.c
> +++ b/chardev/char-pty.c
> @@ -259,7 +259,7 @@ static void char_pty_open(Chardev *chr,
>      qemu_set_nonblock(master_fd);
>  
>      chr->filename = g_strdup_printf("pty:%s", pty_name);
> -    error_report("char device redirected to %s (label %s)",
> +    error_printf("char device redirected to %s (label %s)\n",
>                   pty_name, chr->label);
>  
>      s = PTY_CHARDEV(chr);
> diff --git a/chardev/char.c b/chardev/char.c
> index e115166995..7f07a1bfbd 100644
> --- a/chardev/char.c
> +++ b/chardev/char.c
> @@ -634,7 +634,7 @@ Chardev *qemu_chr_new_from_opts(QemuOpts *opts, Error **errp)
>  
>          chardev_name_foreach(help_string_append, str);
>  
> -        error_report("Available chardev backend types: %s", str->str);
> +        error_printf("Available chardev backend types: %s\n", str->str);
>          g_string_free(str, true);
>          return NULL;
>      }
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error Markus Armbruster
@ 2018-10-09  7:38   ` Greg Kurz
  0 siblings, 0 replies; 90+ messages in thread
From: Greg Kurz @ 2018-10-09  7:38 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon,  8 Oct 2018 19:31:01 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  9p-handle.c's handle_parse_opts() does that, and then
> fails without setting an error.  Wrong.  Its caller crashes when it
> tries to report the error:
> 
>     $ qemu-system-x86_64 -nodefaults -fsdev id=foo,fsdriver=handle
>     qemu-system-x86_64: -fsdev id=foo,fsdriver=handle: warning: handle backend is deprecated
>     qemu-system-x86_64: -fsdev id=foo,fsdriver=handle: fsdev: No path specified
>     Segmentation fault (core dumped)
> 
> Screwed up when commit 91cda4e8f37 (v2.12.0) converted the function to
> Error.  Fix by calling error_setg() instead of error_report().
> 

The 9p-handle backend has entered the deprecation process in 2.12... I
strongly suspect parapraxis here :) but, you're right, bugs need to be
fixed until the code gets removed in 3.2.

Acked-by: Greg Kurz <groug@kaod.org>

> Fixes: 91cda4e8f372602795e3a2f4bd2e3adaf9f82255
> Cc: Greg Kurz <groug@kaod.org>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/9pfs/9p-handle.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/9pfs/9p-handle.c b/hw/9pfs/9p-handle.c
> index f3641dbe4a..3465b1ef30 100644
> --- a/hw/9pfs/9p-handle.c
> +++ b/hw/9pfs/9p-handle.c
> @@ -19,6 +19,7 @@
>  #include <grp.h>
>  #include <sys/socket.h>
>  #include <sys/un.h>
> +#include "qapi/error.h"
>  #include "qemu/xattr.h"
>  #include "qemu/cutils.h"
>  #include "qemu/error-report.h"
> @@ -655,12 +656,13 @@ static int handle_parse_opts(QemuOpts *opts, FsDriverEntry *fse, Error **errp)
>      warn_report("handle backend is deprecated");
>  
>      if (sec_model) {
> -        error_report("Invalid argument security_model specified with handle fsdriver");
> +        error_setg(errp,
> +                   "Invalid argument security_model specified with handle fsdriver");
>          return -1;
>      }
>  
>      if (!path) {
> -        error_report("fsdev: No path specified");
> +        error_setg(errp, "fsdev: No path specified");
>          return -1;
>      }
>      fse->path = g_strdup(path);

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
  2018-10-08 20:46   ` Eric Blake
@ 2018-10-09  7:45   ` Greg Kurz
  1 sibling, 0 replies; 90+ messages in thread
From: Greg Kurz @ 2018-10-09  7:45 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon,  8 Oct 2018 19:31:22 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Calling error_report() from within a a function that takes an Error **
> argument is suspicious.  qemu_fsdev_add() does that, and its caller
> fsdev_init_func() then fails without setting an error.  Its caller
> main(), via qemu_opts_foreach(), is fine with it, but clean it up
> anyway.
> 
> Cc: Greg Kurz <groug@kaod.org>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

Yeah, this was somewhere down in my TODO list. Thanks for the clean
up Markus.

Acked-by: Greg Kurz <groug@kaod.org>

>  fsdev/qemu-fsdev-dummy.c |  2 +-
>  fsdev/qemu-fsdev.c       | 12 +++++-------
>  fsdev/qemu-fsdev.h       |  2 +-
>  hw/9pfs/xen-9p-backend.c |  7 ++++++-
>  vl.c                     |  8 +++-----
>  5 files changed, 16 insertions(+), 15 deletions(-)
> 
> diff --git a/fsdev/qemu-fsdev-dummy.c b/fsdev/qemu-fsdev-dummy.c
> index 6dc0fbc4c4..489cd29081 100644
> --- a/fsdev/qemu-fsdev-dummy.c
> +++ b/fsdev/qemu-fsdev-dummy.c
> @@ -15,7 +15,7 @@
>  #include "qemu/config-file.h"
>  #include "qemu/module.h"
>  
> -int qemu_fsdev_add(QemuOpts *opts)
> +int qemu_fsdev_add(QemuOpts *opts, Error **errp)
>  {
>      return 0;
>  }
> diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c
> index 8a4afbffbd..7a3b87cc9e 100644
> --- a/fsdev/qemu-fsdev.c
> +++ b/fsdev/qemu-fsdev.c
> @@ -30,7 +30,7 @@ static FsDriverTable FsDrivers[] = {
>      { .name = "proxy", .ops = &proxy_ops},
>  };
>  
> -int qemu_fsdev_add(QemuOpts *opts)
> +int qemu_fsdev_add(QemuOpts *opts, Error **errp)
>  {
>      int i;
>      struct FsDriverListEntry *fsle;
> @@ -38,10 +38,9 @@ int qemu_fsdev_add(QemuOpts *opts)
>      const char *fsdriver = qemu_opt_get(opts, "fsdriver");
>      const char *writeout = qemu_opt_get(opts, "writeout");
>      bool ro = qemu_opt_get_bool(opts, "readonly", 0);
> -    Error *local_err = NULL;
>  
>      if (!fsdev_id) {
> -        error_report("fsdev: No id specified");
> +        error_setg(errp, "fsdev: No id specified");
>          return -1;
>      }
>  
> @@ -53,11 +52,11 @@ int qemu_fsdev_add(QemuOpts *opts)
>          }
>  
>          if (i == ARRAY_SIZE(FsDrivers)) {
> -            error_report("fsdev: fsdriver %s not found", fsdriver);
> +            error_setg(errp, "fsdev: fsdriver %s not found", fsdriver);
>              return -1;
>          }
>      } else {
> -        error_report("fsdev: No fsdriver specified");
> +        error_setg(errp, "fsdev: No fsdriver specified");
>          return -1;
>      }
>  
> @@ -76,8 +75,7 @@ int qemu_fsdev_add(QemuOpts *opts)
>      }
>  
>      if (fsle->fse.ops->parse_opts) {
> -        if (fsle->fse.ops->parse_opts(opts, &fsle->fse, &local_err)) {
> -            error_report_err(local_err);
> +        if (fsle->fse.ops->parse_opts(opts, &fsle->fse, errp)) {
>              g_free(fsle->fse.fsdev_id);
>              g_free(fsle);
>              return -1;
> diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h
> index 65e4b1cfab..d9716b4144 100644
> --- a/fsdev/qemu-fsdev.h
> +++ b/fsdev/qemu-fsdev.h
> @@ -38,7 +38,7 @@ typedef struct FsDriverListEntry {
>      QTAILQ_ENTRY(FsDriverListEntry) next;
>  } FsDriverListEntry;
>  
> -int qemu_fsdev_add(QemuOpts *opts);
> +int qemu_fsdev_add(QemuOpts *opts, Error **errp);
>  FsDriverEntry *get_fsdev_fsentry(char *id);
>  extern FileOperations local_ops;
>  extern FileOperations handle_ops;
> diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c
> index 6026780f95..3f54a21c76 100644
> --- a/hw/9pfs/xen-9p-backend.c
> +++ b/hw/9pfs/xen-9p-backend.c
> @@ -14,6 +14,7 @@
>  #include "hw/9pfs/9p.h"
>  #include "hw/xen/xen_backend.h"
>  #include "hw/9pfs/xen-9pfs.h"
> +#include "qapi/error.h"
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  #include "fsdev/qemu-fsdev.h"
> @@ -355,6 +356,7 @@ static int xen_9pfs_free(struct XenDevice *xendev)
>  
>  static int xen_9pfs_connect(struct XenDevice *xendev)
>  {
> +    Error *err = NULL;
>      int i;
>      Xen9pfsDev *xen_9pdev = container_of(xendev, Xen9pfsDev, xendev);
>      V9fsState *s = &xen_9pdev->state;
> @@ -452,7 +454,10 @@ static int xen_9pfs_connect(struct XenDevice *xendev)
>      qemu_opt_set(fsdev, "path", xen_9pdev->path, NULL);
>      qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model, NULL);
>      qemu_opts_set_id(fsdev, s->fsconf.fsdev_id);
> -    qemu_fsdev_add(fsdev);
> +    qemu_fsdev_add(fsdev, &err);
> +    if (err) {
> +        error_report_err(err);
> +    }
>      v9fs_device_realize_common(s, &xen_9p_transport, NULL);
>  
>      return 0;
> diff --git a/vl.c b/vl.c
> index b6f9212f09..4aa976c4cc 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2249,7 +2249,7 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  #ifdef CONFIG_VIRTFS
>  static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  {
> -    return qemu_fsdev_add(opts);
> +    return qemu_fsdev_add(opts, errp);
>  }
>  #endif
>  
> @@ -4188,10 +4188,8 @@ int main(int argc, char **argv, char **envp)
>                        chardev_init_func, NULL, &error_fatal);
>  
>  #ifdef CONFIG_VIRTFS
> -    if (qemu_opts_foreach(qemu_find_opts("fsdev"),
> -                          fsdev_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("fsdev"),
> +                      fsdev_init_func, NULL, &error_fatal);
>  #endif
>  
>      if (qemu_opts_foreach(qemu_find_opts("device"),

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling Markus Armbruster
@ 2018-10-09  9:15   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:15 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Michael S. Tsirkin

Hi
On Mon, Oct 8, 2018 at 9:38 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  pc.c's pc_machine_set_nvdimm_persistence() does that,
> and then exit()s.  Wrong.  Attempting to set machine property
> nvdimm-persistence to a bad value instantly kills the VM:
>
>     $ qemu-system-x86_64 -nodefaults -S -display none -qmp stdio
>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
>     {"execute": "qmp_capabilities"}
>     {"return": {}}
>     {"execute": "qom-set", "arguments": {"path": "/machine", "property": "nvdimm-persistence", "value": "instadeath"}}
>     -machine nvdimm-persistence=instadeath: unsupported option
>     $ echo $?
>     1
>
> Broken when commit 11c39b5cd96 (v3.0.0) replaced error_propagate();
> return by error_report(); exit() instead of error_setg(); return.  Fix
> that.
>
> Fixes: 11c39b5cd966ddc067a1ca0c5392ec9b666c45b7
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  hw/i386/pc.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index cd5029c149..eab8572f2a 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -2209,8 +2209,9 @@ static void pc_machine_set_nvdimm_persistence(Object *obj, const char *value,
>      else if (strcmp(value, "mem-ctrl") == 0)
>          nvdimm_state->persistence = 2;
>      else {
> -        error_report("-machine nvdimm-persistence=%s: unsupported option", value);
> -        exit(EXIT_FAILURE);
> +        error_setg(errp, "-machine nvdimm-persistence=%s: unsupported option",
> +                   value);
> +        return;
>      }
>
>      g_free(nvdimm_state->persistence_string);
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
  2018-10-09  3:24   ` Peter Xu
@ 2018-10-09  9:18   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:18 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Peter Xu

On Mon, Oct 8, 2018 at 9:35 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  ioapic_realize() does that, and then exit()s.
> Currently mostly harmless, as the device cannot be hot-plugged.
>
> Fixes: 20fd4b7b6d9282fe0cb83601f1821f31bd257458
> Cc: Peter Xu <peterx@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  hw/intc/ioapic.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
> index b6896ac4ce..4e529729b4 100644
> --- a/hw/intc/ioapic.c
> +++ b/hw/intc/ioapic.c
> @@ -21,7 +21,7 @@
>   */
>
>  #include "qemu/osdep.h"
> -#include "qemu/error-report.h"
> +#include "qapi/error.h"
>  #include "monitor/monitor.h"
>  #include "hw/hw.h"
>  #include "hw/i386/pc.h"
> @@ -393,9 +393,9 @@ static void ioapic_realize(DeviceState *dev, Error **errp)
>      IOAPICCommonState *s = IOAPIC_COMMON(dev);
>
>      if (s->version != 0x11 && s->version != 0x20) {
> -        error_report("IOAPIC only supports version 0x11 or 0x20 "
> -                     "(default: 0x%x).", IOAPIC_VER_DEF);
> -        exit(1);
> +        error_setg(errp, "IOAPIC only supports version 0x11 or 0x20 "
> +                   "(default: 0x%x).", IOAPIC_VER_DEF);
> +        return;
>      }
>
>      memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
@ 2018-10-09  9:25   ` Marc-André Lureau
  2018-10-09 17:02   ` Paolo Bonzini
  1 sibling, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:25 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Paolo Bonzini

Hi
On Mon, Oct 8, 2018 at 9:47 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  smbios_entry_add() does that, and then exit()s.  It
> also passes &error_fatal to qemu_opts_validate().  Both wrong, but
> currently harmless, as its only caller passes &error_fatal.  Messed up
> in commit 1007a37e208.  Clean it up.
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  hw/smbios/smbios.c | 90 +++++++++++++++++++++++++++++++---------------
>  1 file changed, 62 insertions(+), 28 deletions(-)
>
> diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
> index a27e54b2fa..920939454e 100644
> --- a/hw/smbios/smbios.c
> +++ b/hw/smbios/smbios.c
> @@ -950,6 +950,7 @@ static void save_opt_list(size_t *ndest, const char ***dest,
>
>  void smbios_entry_add(QemuOpts *opts, Error **errp)
>  {
> +    Error *err = NULL;
>      const char *val;
>
>      assert(!smbios_immutable);
> @@ -960,12 +961,16 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>          int size;
>          struct smbios_table *table; /* legacy mode only */
>
> -        qemu_opts_validate(opts, qemu_smbios_file_opts, &error_fatal);
> +        qemu_opts_validate(opts, qemu_smbios_file_opts, &err);
> +        if (err) {
> +            error_propagate(errp, err);
> +            return;
> +        }
>
>          size = get_image_size(val);
>          if (size == -1 || size < sizeof(struct smbios_structure_header)) {
> -            error_report("Cannot read SMBIOS file %s", val);
> -            exit(1);
> +            error_setg(errp, "Cannot read SMBIOS file %s", val);
> +            return;
>          }
>
>          /*
> @@ -978,14 +983,15 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>                                                      smbios_tables_len);
>
>          if (load_image(val, (uint8_t *)header) != size) {
> -            error_report("Failed to load SMBIOS file %s", val);
> -            exit(1);
> +            error_setg(errp, "Failed to load SMBIOS file %s", val);
> +            return;
>          }
>
>          if (test_bit(header->type, have_fields_bitmap)) {
> -            error_report("can't load type %d struct, fields already specified!",
> -                         header->type);
> -            exit(1);
> +            error_setg(errp,
> +                       "can't load type %d struct, fields already specified!",
> +                       header->type);
> +            return;
>          }
>          set_bit(header->type, have_binfile_bitmap);
>
> @@ -1030,19 +1036,23 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>          unsigned long type = strtoul(val, NULL, 0);
>
>          if (type > SMBIOS_MAX_TYPE) {
> -            error_report("out of range!");
> -            exit(1);
> +            error_setg(errp, "out of range!");
> +            return;
>          }
>
>          if (test_bit(type, have_binfile_bitmap)) {
> -            error_report("can't add fields, binary file already loaded!");
> -            exit(1);
> +            error_setg(errp, "can't add fields, binary file already loaded!");
> +            return;
>          }
>          set_bit(type, have_fields_bitmap);
>
>          switch (type) {
>          case 0:
> -            qemu_opts_validate(opts, qemu_smbios_type0_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type0_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type0.vendor, opts, "vendor");
>              save_opt(&type0.version, opts, "version");
>              save_opt(&type0.date, opts, "date");
> @@ -1051,14 +1061,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              val = qemu_opt_get(opts, "release");
>              if (val) {
>                  if (sscanf(val, "%hhu.%hhu", &type0.major, &type0.minor) != 2) {
> -                    error_report("Invalid release");
> -                    exit(1);
> +                    error_setg(errp, "Invalid release");
> +                    return;
>                  }
>                  type0.have_major_minor = true;
>              }
>              return;
>          case 1:
> -            qemu_opts_validate(opts, qemu_smbios_type1_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type1_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type1.manufacturer, opts, "manufacturer");
>              save_opt(&type1.product, opts, "product");
>              save_opt(&type1.version, opts, "version");
> @@ -1069,14 +1083,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              val = qemu_opt_get(opts, "uuid");
>              if (val) {
>                  if (qemu_uuid_parse(val, &qemu_uuid) != 0) {
> -                    error_report("Invalid UUID");
> -                    exit(1);
> +                    error_setg(errp, "Invalid UUID");
> +                    return;
>                  }
>                  qemu_uuid_set = true;
>              }
>              return;
>          case 2:
> -            qemu_opts_validate(opts, qemu_smbios_type2_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type2_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type2.manufacturer, opts, "manufacturer");
>              save_opt(&type2.product, opts, "product");
>              save_opt(&type2.version, opts, "version");
> @@ -1085,7 +1103,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type2.location, opts, "location");
>              return;
>          case 3:
> -            qemu_opts_validate(opts, qemu_smbios_type3_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type3_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type3.manufacturer, opts, "manufacturer");
>              save_opt(&type3.version, opts, "version");
>              save_opt(&type3.serial, opts, "serial");
> @@ -1093,7 +1115,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type3.sku, opts, "sku");
>              return;
>          case 4:
> -            qemu_opts_validate(opts, qemu_smbios_type4_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type4_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type4.sock_pfx, opts, "sock_pfx");
>              save_opt(&type4.manufacturer, opts, "manufacturer");
>              save_opt(&type4.version, opts, "version");
> @@ -1102,11 +1128,19 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type4.part, opts, "part");
>              return;
>          case 11:
> -            qemu_opts_validate(opts, qemu_smbios_type11_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type11_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt_list(&type11.nvalues, &type11.values, opts, "value");
>              return;
>          case 17:
> -            qemu_opts_validate(opts, qemu_smbios_type17_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type17_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type17.loc_pfx, opts, "loc_pfx");
>              save_opt(&type17.bank, opts, "bank");
>              save_opt(&type17.manufacturer, opts, "manufacturer");
> @@ -1116,12 +1150,12 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              type17.speed = qemu_opt_get_number(opts, "speed", 0);
>              return;
>          default:
> -            error_report("Don't know how to build fields for SMBIOS type %ld",
> -                         type);
> -            exit(1);
> +            error_setg(errp,
> +                       "Don't know how to build fields for SMBIOS type %ld",
> +                       type);
> +            return;
>          }
>      }
>
> -    error_report("Must specify type= or file=");
> -    exit(1);
> +    error_setg(errp, "Must specify type= or file=");
>  }
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling Markus Armbruster
@ 2018-10-09  9:27   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:27 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Paolo Bonzini

Hi
On Mon, Oct 8, 2018 at 9:33 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  save_snapshot() and load_snapshot() do that, and then
> fail without setting an error.  Wrong.  The HMP commands survive this
> unscathed, since hmp_handle_error() does nothing when no error has
> been set.  Callers main() (on behalf of -loadvm) and
> replay_vmstate_init() crash, but I'm not sure the error is possible
> there.
>
> Screwed up when commit 377b21ccea1 (v2.12.0) added incorrect error
> handling right next to correct examples.  Fix by calling error_setg()
> instead of error_report().
>
> Fixes: 377b21ccea1755a8b0dae822c29567c58dda6939
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  migration/savevm.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 2d10e45582..5f8eb38676 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -2414,8 +2414,8 @@ int save_snapshot(const char *name, Error **errp)
>      AioContext *aio_context;
>
>      if (!replay_can_snapshot()) {
> -        error_report("Record/replay does not allow making snapshot "
> -                     "right now. Try once more later.");
> +        error_setg(errp, "Record/replay does not allow making snapshot "
> +                   "right now. Try once more later.");
>          return ret;
>      }
>
> @@ -2611,8 +2611,8 @@ int load_snapshot(const char *name, Error **errp)
>      MigrationIncomingState *mis = migration_incoming_get_current();
>
>      if (!replay_can_snapshot()) {
> -        error_report("Record/replay does not allow loading snapshot "
> -                     "right now. Try once more later.");
> +        error_setg(errp, "Record/replay does not allow loading snapshot "
> +                   "right now. Try once more later.");
>          return -EINVAL;
>      }
>
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting Markus Armbruster
@ 2018-10-09  9:32   ` Marc-André Lureau
  2018-10-11 17:35     ` Markus Armbruster
  0 siblings, 1 reply; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:32 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Jason Wang

Hi
On Mon, Oct 8, 2018 at 9:54 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> When -netdev l2tpv3 fails, it first reports a specific error, then a
> generic one, like this:
>
>     $ qemu-system-x86_64 -netdev l2tpv3,id=foo,src=,dst=,txsession=1
>     qemu-system-x86_64: -netdev l2tpv3,id=foo,src=,dst=,txsession=1: l2tpv3_open : could not resolve src, errno = Name or service not known
>     qemu-system-x86_64: Device 'l2tpv3' could not be initialized
>
> With the command line, the messages go to stderr.  In HMP, they go to
> the monitor.  In QMP, the second one becomes the error reply, and the
> first one goes to stderr.
>
> Convert net_init_tap() to Error.  This suppresses the unwanted second
> message, and makes the specific error the QMP error reply.
>
> Cc: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  net/l2tpv3.c | 26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/net/l2tpv3.c b/net/l2tpv3.c
> index 6745b78990..0c5dd22ef7 100644
> --- a/net/l2tpv3.c
> +++ b/net/l2tpv3.c
> @@ -28,6 +28,7 @@
>  #include <netdb.h>
>  #include "net/net.h"
>  #include "clients.h"
> +#include "qapi/error.h"
>  #include "qemu-common.h"
>  #include "qemu/error-report.h"
>  #include "qemu/option.h"
> @@ -528,7 +529,6 @@ int net_init_l2tpv3(const Netdev *netdev,
>                      const char *name,
>                      NetClientState *peer, Error **errp)
>  {
> -    /* FIXME error_setg(errp, ...) on failure */
>      const NetdevL2TPv3Options *l2tpv3;
>      NetL2TPV3State *s;
>      NetClientState *nc;
> @@ -555,7 +555,7 @@ int net_init_l2tpv3(const Netdev *netdev,
>      }
>
>      if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) {
> -        error_report("l2tpv3_open : offset must be less than 256 bytes");
> +        error_setg(errp, "l2tpv3_open : offset must be less than 256 bytes");
>          goto outerr;
>      }
>
> @@ -563,6 +563,8 @@ int net_init_l2tpv3(const Netdev *netdev,
>          if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) {
>              s->cookie = true;
>          } else {
> +            error_setg(errp,
> +                       "require both 'rxcookie' and 'txcookie' or neither");

maybe for consistency it would be a good idea to remove the
"l2tpv3_open : " prefix from the other messages while touching it?

looks good otherwise:
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

>              goto outerr;
>          }
>      } else {
> @@ -578,7 +580,8 @@ int net_init_l2tpv3(const Netdev *netdev,
>      if (l2tpv3->has_udp && l2tpv3->udp) {
>          s->udp = true;
>          if (!(l2tpv3->has_srcport && l2tpv3->has_dstport)) {
> -            error_report("l2tpv3_open : need both src and dst port for udp");
> +            error_setg(errp,
> +                       "l2tpv3_open : need both src and dst port for udp");
>              goto outerr;
>          } else {
>              srcport = l2tpv3->srcport;
> @@ -639,20 +642,19 @@ int net_init_l2tpv3(const Netdev *netdev,
>      gairet = getaddrinfo(l2tpv3->src, srcport, &hints, &result);
>
>      if ((gairet != 0) || (result == NULL)) {
> -        error_report(
> -            "l2tpv3_open : could not resolve src, errno = %s",
> -            gai_strerror(gairet)
> -        );
> +        error_setg(errp, "l2tpv3_open : could not resolve src, errno = %s",
> +                   gai_strerror(gairet));
>          goto outerr;
>      }
>      fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
>      if (fd == -1) {
>          fd = -errno;
> -        error_report("l2tpv3_open : socket creation failed, errno = %d", -fd);
> +        error_setg(errp, "l2tpv3_open : socket creation failed, errno = %d",
> +                   -fd);
>          goto outerr;
>      }
>      if (bind(fd, (struct sockaddr *) result->ai_addr, result->ai_addrlen)) {
> -        error_report("l2tpv3_open :  could not bind socket err=%i", errno);
> +        error_setg(errp, "l2tpv3_open :  could not bind socket err=%i", errno);
>          goto outerr;
>      }
>      if (result) {
> @@ -677,10 +679,8 @@ int net_init_l2tpv3(const Netdev *netdev,
>      result = NULL;
>      gairet = getaddrinfo(l2tpv3->dst, dstport, &hints, &result);
>      if ((gairet != 0) || (result == NULL)) {
> -        error_report(
> -            "l2tpv3_open : could not resolve dst, error = %s",
> -            gai_strerror(gairet)
> -        );
> +        error_setg(errp, "l2tpv3_open : could not resolve dst, error = %s",
> +                   gai_strerror(gairet));
>          goto outerr;
>      }
>
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling Markus Armbruster
@ 2018-10-09  9:47   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:47 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Jason Wang

Hi
On Mon, Oct 8, 2018 at 9:45 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  net_socket_fd_init() does that, and then fails without
> setting an error.  Wrong.  I didn't analyze how exactly this can
> break.  A caller that reports the error on failure would crash.
>
> Broken when commit c37f0bb1d0d (v2.11.0) converted the function to
> Error.  Fix by calling error_setg() instead of error_report().
>
> Fixes: c37f0bb1d0d24e3a6b5f4659bb305913dcb798a6
> Cc: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  net/socket.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/net/socket.c b/net/socket.c
> index 6917fbcbf5..90ef3517be 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -453,8 +453,8 @@ static NetSocketState *net_socket_fd_init(NetClientState *peer,
>      case SOCK_STREAM:
>          return net_socket_fd_init_stream(peer, model, name, fd, is_connected);
>      default:
> -        error_report("socket type=%d for fd=%d must be either"
> -                     " SOCK_DGRAM or SOCK_STREAM", so_type, fd);
> +        error_setg(errp, "socket type=%d for fd=%d must be either"
> +                   " SOCK_DGRAM or SOCK_STREAM", so_type, fd);
>          closesocket(fd);
>      }
>      return NULL;
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
@ 2018-10-09  9:53   ` Marc-André Lureau
  2018-10-11 17:40     ` Markus Armbruster
  2018-10-10 12:39   ` Eduardo Otubo
  1 sibling, 1 reply; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09  9:53 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Eduardo Otubo

Hi

On Mon, Oct 8, 2018 at 9:50 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_sandbox() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Cc: Eduardo Otubo <otubo@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qemu-seccomp.c | 18 +++++++++---------
>  vl.c           |  4 ++--
>  2 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/qemu-seccomp.c b/qemu-seccomp.c
> index 1baa5c69ed..6d27699409 100644
> --- a/qemu-seccomp.c
> +++ b/qemu-seccomp.c
> @@ -12,11 +12,12 @@
>   * Contributions after 2012-01-13 are licensed under the terms of the
>   * GNU GPL, version 2 or (at your option) any later version.
>   */
> +
>  #include "qemu/osdep.h"
> +#include "qapi/error.h"
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  #include "qemu/module.h"
> -#include "qemu/error-report.h"
>  #include <sys/prctl.h>
>  #include <seccomp.h>
>  #include "sysemu/seccomp.h"
> @@ -190,7 +191,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>                   * to provide a little bit of consistency for
>                   * the command line */
>              } else {
> -                error_report("invalid argument for obsolete");
> +                error_setg(errp, "invalid argument for obsolete");
>                  return -1;
>              }
>          }
> @@ -205,14 +206,13 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>                  /* calling prctl directly because we're
>                   * not sure if host has CAP_SYS_ADMIN set*/
>                  if (prctl(PR_SET_NO_NEW_PRIVS, 1)) {
> -                    error_report("failed to set no_new_privs "
> -                                 "aborting");
> +                    error_setg(errp, "failed to set no_new_privs " "aborting");

Extra " "

>                      return -1;
>                  }
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for elevateprivileges");
> +                error_setg(errp, "invalid argument for elevateprivileges");
>                  return -1;
>              }
>          }
> @@ -224,7 +224,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for spawn");
> +                error_setg(errp, "invalid argument for spawn");
>                  return -1;
>              }
>          }
> @@ -236,14 +236,14 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for resourcecontrol");
> +                error_setg(errp, "invalid argument for resourcecontrol");
>                  return -1;
>              }
>          }
>
>          if (seccomp_start(seccomp_opts) < 0) {
> -            error_report("failed to install seccomp syscall filter "
> -                         "in the kernel");
> +            error_setg(errp, "failed to install seccomp syscall filter "
> +                       "in the kernel");
>              return -1;
>          }
>      }
> diff --git a/vl.c b/vl.c
> index 9d2b38a31f..485c3fc008 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3925,8 +3925,8 @@ int main(int argc, char **argv, char **envp)
>
>  #ifdef CONFIG_SECCOMP
>      olist = qemu_find_opts_err("sandbox", NULL);
> -    if (olist && qemu_opts_foreach(olist, parse_sandbox, NULL, NULL)) {
> -        exit(1);
> +    if (olist) {
> +        qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
>      }
>  #endif
>

Other than that,


Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 03/31] cpus hw target: Use warn_report() & friends to report warnings
  2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
  2018-10-08 22:25   ` David Gibson
@ 2018-10-09  9:56   ` Alex Bennée
  1 sibling, 0 replies; 90+ messages in thread
From: Alex Bennée @ 2018-10-09  9:56 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, Mark Cave-Ayland, Alex Williamson, Fam Zheng,
	Wei Huang, David Gibson


Markus Armbruster <armbru@redhat.com> writes:

> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  Convert a few that are actually warnings to
> warn_report().
>
> While there, split a warning consisting of multiple sentences to
> conform to conventions spelled out in warn_report()'s contract.
>
> Cc: Alex Bennée <alex.bennee@linaro.org>
> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Cc: Alex Williamson <alex.williamson@redhat.com>
> Cc: Fam Zheng <famz@redhat.com>
> Cc: Wei Huang <wei@redhat.com>
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

> ---
>  cpus.c                          |  8 ++++----
>  hw/display/cg3.c                |  2 +-
>  hw/display/tcx.c                |  2 +-
>  hw/misc/ivshmem.c               |  4 ++--
>  hw/net/virtio-net.c             |  8 ++++----
>  hw/virtio/virtio-pci.c          |  4 ++--
>  target/i386/cpu.c               | 17 +++++++++--------
>  target/ppc/translate_init.inc.c |  4 ++--
>  8 files changed, 25 insertions(+), 24 deletions(-)
>
> diff --git a/cpus.c b/cpus.c
> index 361678e459..7804071872 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -211,12 +211,12 @@ void qemu_tcg_configure(QemuOpts *opts, Error **errp)
>                  error_setg(errp, "No MTTCG when icount is enabled");
>              } else {
>  #ifndef TARGET_SUPPORTS_MTTCG
> -                error_report("Guest not yet converted to MTTCG - "
> -                             "you may get unexpected results");
> +                warn_report("Guest not yet converted to MTTCG - "
> +                            "you may get unexpected results");
>  #endif
>                  if (!check_tcg_memory_orders_compatible()) {
> -                    error_report("Guest expects a stronger memory ordering "
> -                                 "than the host provides");
> +                    warn_report("Guest expects a stronger memory ordering "
> +                                "than the host provides");
>                      error_printf("This may cause strange/hard to debug errors\n");
>                  }
>                  mttcg_enabled = true;
> diff --git a/hw/display/cg3.c b/hw/display/cg3.c
> index 1c199ab369..e50d97e48c 100644
> --- a/hw/display/cg3.c
> +++ b/hw/display/cg3.c
> @@ -307,7 +307,7 @@ static void cg3_realizefn(DeviceState *dev, Error **errp)
>          ret = load_image_mr(fcode_filename, &s->rom);
>          g_free(fcode_filename);
>          if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
> -            error_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
> +            warn_report("cg3: could not load prom '%s'", CG3_ROM_FILE);
>          }
>      }
>
> diff --git a/hw/display/tcx.c b/hw/display/tcx.c
> index b2786ee8d0..66f2459226 100644
> --- a/hw/display/tcx.c
> +++ b/hw/display/tcx.c
> @@ -823,7 +823,7 @@ static void tcx_realizefn(DeviceState *dev, Error **errp)
>          ret = load_image_mr(fcode_filename, &s->rom);
>          g_free(fcode_filename);
>          if (ret < 0 || ret > FCODE_MAX_ROM_SIZE) {
> -            error_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
> +            warn_report("tcx: could not load prom '%s'", TCX_ROM_FILE);
>          }
>      }
>
> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
> index 6febbabcaa..4794518b2c 100644
> --- a/hw/misc/ivshmem.c
> +++ b/hw/misc/ivshmem.c
> @@ -1292,8 +1292,8 @@ static void ivshmem_realize(PCIDevice *dev, Error **errp)
>      IVShmemState *s = IVSHMEM_COMMON(dev);
>
>      if (!qtest_enabled()) {
> -        error_report("ivshmem is deprecated, please use ivshmem-plain"
> -                     " or ivshmem-doorbell instead");
> +        warn_report("ivshmem is deprecated, please use ivshmem-plain"
> +                    " or ivshmem-doorbell instead");
>      }
>
>      if (qemu_chr_fe_backend_connected(&s->server_chr) + !!s->shmobj != 1) {
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 4bdd5b8532..385b1a03e9 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -2020,10 +2020,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
>
>      if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer")
>                         && strcmp(n->net_conf.tx, "bh")) {
> -        error_report("virtio-net: "
> -                     "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
> -                     n->net_conf.tx);
> -        error_report("Defaulting to \"bh\"");
> +        warn_report("virtio-net: "
> +                    "Unknown option tx=%s, valid options: \"timer\" \"bh\"",
> +                    n->net_conf.tx);
> +        error_printf("Defaulting to \"bh\"");
>      }
>
>      n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n),
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 3a01fe90f0..a954799267 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1683,8 +1683,8 @@ static void virtio_pci_device_plugged(DeviceState *d, Error **errp)
>          if (err) {
>              /* Notice when a system that supports MSIx can't initialize it */
>              if (err != -ENOTSUP) {
> -                error_report("unable to init msix vectors to %" PRIu32,
> -                             proxy->nvectors);
> +                warn_report("unable to init msix vectors to %" PRIu32,
> +                            proxy->nvectors);
>              }
>              proxy->nvectors = 0;
>          }
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index c88876dfe3..9d4217afba 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -5123,14 +5123,15 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
>       * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
>       * cs->nr_threads hasn't be populated yet and the checking is incorrect.
>       */
> -     if (IS_AMD_CPU(env) &&
> -         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
> -         cs->nr_threads > 1 && !ht_warned) {
> -            error_report("This family of AMD CPU doesn't support "
> -                         "hyperthreading(%d). Please configure -smp "
> -                         "options properly or try enabling topoext feature.",
> -                         cs->nr_threads);
> -        ht_warned = true;
> +    if (IS_AMD_CPU(env) &&
> +        !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
> +        cs->nr_threads > 1 && !ht_warned) {
> +            warn_report("This family of AMD CPU doesn't support "
> +                        "hyperthreading(%d)",
> +                        cs->nr_threads);
> +            error_printf("Please configure -smp options properly"
> +                         " or try enabling topoext feature.\n");
> +            ht_warned = true;
>      }
>
>      x86_cpu_apic_realize(cpu, &local_err);
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 263e63cb03..ee9432eb15 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8381,8 +8381,8 @@ static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name,
>      QNull *null = NULL;
>
>      if (!qtest_enabled()) {
> -        error_report("CPU 'compat' property is deprecated and has no effect; "
> -                     "use max-cpu-compat machine property instead");
> +        warn_report("CPU 'compat' property is deprecated and has no effect; "
> +                    "use max-cpu-compat machine property instead");
>      }
>      visit_type_null(v, name, &null, NULL);
>      qobject_unref(null);


--
Alex Bennée

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
@ 2018-10-09 10:11   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 10:11 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi

On Mon, Oct 8, 2018 at 9:44 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_add_fd() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Also change call of cleanup_add_fd(), which can't fail, for symmetry.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  vl.c | 22 +++++++++-------------
>  1 file changed, 9 insertions(+), 13 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 485c3fc008..7ce8299d9d 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1059,12 +1059,12 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
>      fd_opaque = qemu_opt_get(opts, "opaque");
>
>      if (fd < 0) {
> -        error_report("fd option is required and must be non-negative");
> +        error_setg(errp, "fd option is required and must be non-negative");
>          return -1;
>      }
>
>      if (fd <= STDERR_FILENO) {
> -        error_report("fd cannot be a standard I/O stream");
> +        error_setg(errp, "fd cannot be a standard I/O stream");
>          return -1;
>      }
>
> @@ -1074,12 +1074,12 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
>       */
>      flags = fcntl(fd, F_GETFD);
>      if (flags == -1 || (flags & FD_CLOEXEC)) {
> -        error_report("fd is not valid or already in use");
> +        error_setg(errp, "fd is not valid or already in use");
>          return -1;
>      }
>
>      if (fdset_id < 0) {
> -        error_report("set option is required and must be non-negative");
> +        error_setg(errp, "set option is required and must be non-negative");
>          return -1;
>      }
>
> @@ -1092,7 +1092,7 @@ static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
>      }
>  #endif
>      if (dupfd == -1) {
> -        error_report("error duplicating fd: %s", strerror(errno));
> +        error_setg(errp, "error duplicating fd: %s", strerror(errno));
>          return -1;
>      }
>
> @@ -3936,15 +3936,11 @@ int main(int argc, char **argv, char **envp)
>      }
>
>  #ifndef _WIN32
> -    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
> -                          parse_add_fd, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("add-fd"),
> +                      parse_add_fd, NULL, &error_fatal);
>
> -    if (qemu_opts_foreach(qemu_find_opts("add-fd"),
> -                          cleanup_add_fd, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("add-fd"),
> +                      cleanup_add_fd, NULL, &error_fatal);
>  #endif
>
>      current_machine = MACHINE(object_new(object_class_get_name(
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
@ 2018-10-09 10:57   ` Philippe Mathieu-Daudé
  2018-10-09 11:38   ` Marc-André Lureau
  2018-10-10 19:00   ` Stefan Berger
  2 siblings, 0 replies; 90+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-09 10:57 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Stefan Berger

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  tpm_init_tpmdev() does that, and then fails without
> setting an error.  Its caller main(), via tpm_init() and
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
> 
> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  include/sysemu/tpm.h |  2 +-
>  stubs/tpm.c          |  3 +--
>  tpm.c                | 22 +++++++++-------------
>  vl.c                 |  4 +---
>  4 files changed, 12 insertions(+), 19 deletions(-)
> 
> diff --git a/include/sysemu/tpm.h b/include/sysemu/tpm.h
> index 9ae1ab6da3..17a97ed77a 100644
> --- a/include/sysemu/tpm.h
> +++ b/include/sysemu/tpm.h
> @@ -16,7 +16,7 @@
>  #include "qom/object.h"
>  
>  int tpm_config_parse(QemuOptsList *opts_list, const char *optarg);
> -int tpm_init(void);
> +void tpm_init(void);
>  void tpm_cleanup(void);
>  
>  typedef enum TPMVersion {
> diff --git a/stubs/tpm.c b/stubs/tpm.c
> index 6729bc8517..80939cd3db 100644
> --- a/stubs/tpm.c
> +++ b/stubs/tpm.c
> @@ -9,9 +9,8 @@
>  #include "qapi/qapi-commands-tpm.h"
>  #include "sysemu/tpm.h"
>  
> -int tpm_init(void)
> +void tpm_init(void)
>  {
> -    return 0;
>  }
>  
>  void tpm_cleanup(void)
> diff --git a/tpm.c b/tpm.c
> index 93031723ad..9c9e20bbb7 100644
> --- a/tpm.c
> +++ b/tpm.c
> @@ -89,19 +89,19 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      int i;
>  
>      if (!QLIST_EMPTY(&tpm_backends)) {
> -        error_report("Only one TPM is allowed.");
> +        error_setg(errp, "Only one TPM is allowed.");
>          return 1;
>      }
>  
>      id = qemu_opts_id(opts);
>      if (id == NULL) {
> -        error_report(QERR_MISSING_PARAMETER, "id");
> +        error_setg(errp, QERR_MISSING_PARAMETER, "id");
>          return 1;
>      }
>  
>      value = qemu_opt_get(opts, "type");
>      if (!value) {
> -        error_report(QERR_MISSING_PARAMETER, "type");
> +        error_setg(errp, QERR_MISSING_PARAMETER, "type");
>          tpm_display_backend_drivers();
>          return 1;
>      }
> @@ -109,8 +109,8 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      i = qapi_enum_parse(&TpmType_lookup, value, -1, NULL);
>      be = i >= 0 ? tpm_be_find_by_type(i) : NULL;
>      if (be == NULL) {
> -        error_report(QERR_INVALID_PARAMETER_VALUE,
> -                     "type", "a TPM backend type");
> +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
> +                   "a TPM backend type");
>          tpm_display_backend_drivers();
>          return 1;
>      }
> @@ -118,7 +118,7 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      /* validate backend specific opts */
>      qemu_opts_validate(opts, be->opts, &local_err);
>      if (local_err) {
> -        error_report_err(local_err);
> +        error_propagate(errp, local_err);
>          return 1;
>      }
>  
> @@ -151,14 +151,10 @@ void tpm_cleanup(void)
>   * Initialize the TPM. Process the tpmdev command line options describing the
>   * TPM backend.
>   */
> -int tpm_init(void)
> +void tpm_init(void)
>  {
> -    if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
> -                          tpm_init_tpmdev, NULL, NULL)) {
> -        return -1;
> -    }
> -
> -    return 0;
> +    qemu_opts_foreach(qemu_find_opts("tpmdev"),
> +                      tpm_init_tpmdev, NULL, &error_fatal);
>  }
>  
>  /*
> diff --git a/vl.c b/vl.c
> index 5c159ca45c..b6f9212f09 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4312,9 +4312,7 @@ int main(int argc, char **argv, char **envp)
>                        user_creatable_add_opts_foreach,
>                        object_create_delayed, &error_fatal);
>  
> -    if (tpm_init() < 0) {
> -        exit(1);
> -    }
> +    tpm_init();
>  
>      /* init the bluetooth world */
>      if (foreach_device_config(DEV_BT, bt_parse))
> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
  2018-10-08 20:43   ` Eric Blake
@ 2018-10-09 11:11   ` Marc-André Lureau
  2018-10-09 13:25   ` Daniel P. Berrangé
  2 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:11 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi

On Mon, Oct 8, 2018 at 9:39 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  user_creatable_add_opts_foreach() does that, and then
> fails without setting an error.  Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
>
> Cc: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  qemu-io.c               |  8 +++-----
>  qemu-nbd.c              |  8 +++-----
>  qom/object_interfaces.c |  4 +---
>  vl.c                    | 16 ++++++----------
>  4 files changed, 13 insertions(+), 23 deletions(-)
>
> diff --git a/qemu-io.c b/qemu-io.c
> index 13829f5e21..6df7731af4 100644
> --- a/qemu-io.c
> +++ b/qemu-io.c
> @@ -620,11 +620,9 @@ int main(int argc, char **argv)
>          exit(1);
>      }
>
> -    if (qemu_opts_foreach(&qemu_object_opts,
> -                          user_creatable_add_opts_foreach,
> -                          NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(&qemu_object_opts,
> +                      user_creatable_add_opts_foreach,
> +                      NULL, &error_fatal);
>
>      if (!trace_init_backends()) {
>          exit(1);
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index 7874bc973c..ca7109652e 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -766,11 +766,9 @@ int main(int argc, char **argv)
>          exit(EXIT_FAILURE);
>      }
>
> -    if (qemu_opts_foreach(&qemu_object_opts,
> -                          user_creatable_add_opts_foreach,
> -                          NULL, NULL)) {
> -        exit(EXIT_FAILURE);
> -    }
> +    qemu_opts_foreach(&qemu_object_opts,
> +                      user_creatable_add_opts_foreach,
> +                      NULL, &error_fatal);
>
>      if (!trace_init_backends()) {
>          exit(1);
> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
> index 72b97a8bed..4052d6c4a7 100644
> --- a/qom/object_interfaces.c
> +++ b/qom/object_interfaces.c
> @@ -143,7 +143,6 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
>  {
>      bool (*type_predicate)(const char *) = opaque;
>      Object *obj = NULL;
> -    Error *err = NULL;
>      const char *type;
>
>      type = qemu_opt_get(opts, "qom-type");
> @@ -152,9 +151,8 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
>          return 0;
>      }
>
> -    obj = user_creatable_add_opts(opts, &err);
> +    obj = user_creatable_add_opts(opts, errp);
>      if (!obj) {
> -        error_report_err(err);
>          return -1;
>      }
>      object_unref(obj);
> diff --git a/vl.c b/vl.c
> index 7ce8299d9d..b8576f8f10 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4181,11 +4181,9 @@ int main(int argc, char **argv, char **envp)
>      page_size_init();
>      socket_init();
>
> -    if (qemu_opts_foreach(qemu_find_opts("object"),
> -                          user_creatable_add_opts_foreach,
> -                          object_create_initial, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("object"),
> +                      user_creatable_add_opts_foreach,
> +                      object_create_initial, &error_fatal);
>
>      if (qemu_opts_foreach(qemu_find_opts("chardev"),
>                            chardev_init_func, NULL, NULL)) {
> @@ -4316,11 +4314,9 @@ int main(int argc, char **argv, char **envp)
>          exit(1);
>      }
>
> -    if (qemu_opts_foreach(qemu_find_opts("object"),
> -                          user_creatable_add_opts_foreach,
> -                          object_create_delayed, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("object"),
> +                      user_creatable_add_opts_foreach,
> +                      object_create_delayed, &error_fatal);
>
>      if (tpm_init() < 0) {
>          exit(1);
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
  2018-10-09  6:07   ` Philippe Mathieu-Daudé
@ 2018-10-09 11:13   ` Marc-André Lureau
  2018-10-11 17:43     ` Markus Armbruster
  1 sibling, 1 reply; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:13 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi

On Mon, Oct 8, 2018 at 9:51 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  chardev_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

commit title is wrong, apart from that:

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  vl.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index b8576f8f10..ecb70f87d8 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2239,7 +2239,7 @@ static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
>
>      if (!qemu_chr_new_from_opts(opts, &local_err)) {
>          if (local_err) {
> -            error_report_err(local_err);
> +            error_propagate(errp, local_err);
>              return -1;
>          }
>          exit(0);
> @@ -4185,10 +4185,8 @@ int main(int argc, char **argv, char **envp)
>                        user_creatable_add_opts_foreach,
>                        object_create_initial, &error_fatal);
>
> -    if (qemu_opts_foreach(qemu_find_opts("chardev"),
> -                          chardev_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("chardev"),
> +                      chardev_init_func, NULL, &error_fatal);
>
>  #ifdef CONFIG_VIRTFS
>      if (qemu_opts_foreach(qemu_find_opts("fsdev"),
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
  2018-10-09  6:02   ` Philippe Mathieu-Daudé
@ 2018-10-09 11:18   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:18 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi

On Mon, Oct 8, 2018 at 9:47 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  machine_set_property() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  vl.c | 9 +++------
>  1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index ecb70f87d8..3adc9dbe4f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2676,7 +2676,7 @@ static int machine_set_property(void *opaque,
>      g_free(qom_name);
>
>      if (local_err) {
> -        error_report_err(local_err);
> +        error_propagate(errp, local_err);
>          return -1;
>      }
>
> @@ -4201,11 +4201,8 @@ int main(int argc, char **argv, char **envp)
>      }
>
>      machine_opts = qemu_get_machine_opts();
> -    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
> -                         NULL)) {
> -        object_unref(OBJECT(current_machine));
> -        exit(1);
> -    }
> +    qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
> +                     &error_fatal);
>
>      configure_accelerator(current_machine);
>
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
  2018-10-09  6:02   ` Philippe Mathieu-Daudé
@ 2018-10-09 11:21   ` Marc-André Lureau
  1 sibling, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:21 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi

On Mon, Oct 8, 2018 at 9:37 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  mon_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  vl.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 3adc9dbe4f..1009d708a0 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2270,8 +2270,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      } else if (strcmp(mode, "control") == 0) {
>          flags = MONITOR_USE_CONTROL;
>      } else {
> -        error_report("unknown monitor mode \"%s\"", mode);
> -        exit(1);
> +        error_setg(errp, "unknown monitor mode \"%s\"", mode);
> +        return -1;
>      }
>
>      if (qemu_opt_get_bool(opts, "pretty", 0))
> @@ -2285,8 +2285,8 @@ static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      chardev = qemu_opt_get(opts, "chardev");
>      chr = qemu_chr_find(chardev);
>      if (chr == NULL) {
> -        error_report("chardev \"%s\" not found", chardev);
> -        exit(1);
> +        error_setg(errp, "chardev \"%s\" not found", chardev);
> +        return -1;
>      }
>
>      monitor_init(chr, flags);
> @@ -4365,10 +4365,8 @@ int main(int argc, char **argv, char **envp)
>      default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
>      default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
>
> -    if (qemu_opts_foreach(qemu_find_opts("mon"),
> -                          mon_init_func, NULL, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("mon"),
> +                      mon_init_func, NULL, &error_fatal);
>
>      if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
>          exit(1);
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg() Markus Armbruster
@ 2018-10-09 11:25   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:25 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU

Hi


On Mon, Oct 8, 2018 at 9:57 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_fw_cfg() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  vl.c | 17 ++++++++---------
>  1 file changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 1009d708a0..a3a39ec06b 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2174,7 +2174,7 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
>      FWCfgState *fw_cfg = (FWCfgState *) opaque;
>
>      if (fw_cfg == NULL) {
> -        error_report("fw_cfg device not available");
> +        error_setg(errp, "fw_cfg device not available");
>          return -1;
>      }
>      name = qemu_opt_get(opts, "name");
> @@ -2183,15 +2183,16 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
>
>      /* we need name and either a file or the content string */
>      if (!(nonempty_str(name) && (nonempty_str(file) || nonempty_str(str)))) {
> -        error_report("invalid argument(s)");
> +        error_setg(errp, "invalid argument(s)");
>          return -1;
>      }
>      if (nonempty_str(file) && nonempty_str(str)) {
> -        error_report("file and string are mutually exclusive");
> +        error_setg(errp, "file and string are mutually exclusive");
>          return -1;
>      }
>      if (strlen(name) > FW_CFG_MAX_FILE_PATH - 1) {
> -        error_report("name too long (max. %d char)", FW_CFG_MAX_FILE_PATH - 1);
> +        error_setg(errp, "name too long (max. %d char)",
> +                   FW_CFG_MAX_FILE_PATH - 1);
>          return -1;
>      }
>      if (strncmp(name, "opt/", 4) != 0) {
> @@ -2203,7 +2204,7 @@ static int parse_fw_cfg(void *opaque, QemuOpts *opts, Error **errp)
>          buf = g_memdup(str, size);
>      } else {
>          if (!g_file_get_contents(file, &buf, &size, NULL)) {
> -            error_report("can't load %s", file);
> +            error_setg(errp, "can't load %s", file);
>              return -1;
>          }
>      }
> @@ -4429,10 +4430,8 @@ int main(int argc, char **argv, char **envp)
>          hax_sync_vcpus();
>      }
>
> -    if (qemu_opts_foreach(qemu_find_opts("fw_cfg"),
> -                          parse_fw_cfg, fw_cfg_find(), NULL) != 0) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("fw_cfg"),
> +                      parse_fw_cfg, fw_cfg_find(), &error_fatal);
>
>      /* init USB devices */
>      if (machine_usb(current_machine)) {
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
@ 2018-10-09 11:35   ` Marc-André Lureau
  2018-10-11 17:48   ` Markus Armbruster
  1 sibling, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:35 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Gerd Hoffmann

Hi

On Mon, Oct 8, 2018 at 9:38 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  vnc_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  ui/vnc.c | 5 +++--
>  vl.c     | 2 +-
>  2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/ui/vnc.c b/ui/vnc.c
> index cf221c83cc..df6c84b802 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -4082,8 +4082,9 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      vnc_display_init(id);
>      vnc_display_open(id, &local_err);
>      if (local_err != NULL) {
> -        error_reportf_err(local_err, "Failed to start VNC server: ");
> -        exit(1);
> +        error_propagate(errp, local_err);
> +        error_prepend(errp, "Failed to start VNC server: ");
> +        return -1;
>      }
>      return 0;
>  }
> diff --git a/vl.c b/vl.c
> index 86eee4c798..5c159ca45c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4479,7 +4479,7 @@ int main(int argc, char **argv, char **envp)
>      /* init remote displays */
>  #ifdef CONFIG_VNC
>      qemu_opts_foreach(qemu_find_opts("vnc"),
> -                      vnc_init_func, NULL, NULL);
> +                      vnc_init_func, NULL, &error_fatal);
>  #endif
>
>      if (using_spice) {
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
  2018-10-09 10:57   ` Philippe Mathieu-Daudé
@ 2018-10-09 11:38   ` Marc-André Lureau
  2018-10-10 19:00   ` Stefan Berger
  2 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:38 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Stefan Berger

Hi

On Mon, Oct 8, 2018 at 9:33 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  tpm_init_tpmdev() does that, and then fails without
> setting an error.  Its caller main(), via tpm_init() and
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
>
> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  include/sysemu/tpm.h |  2 +-
>  stubs/tpm.c          |  3 +--
>  tpm.c                | 22 +++++++++-------------
>  vl.c                 |  4 +---
>  4 files changed, 12 insertions(+), 19 deletions(-)
>
> diff --git a/include/sysemu/tpm.h b/include/sysemu/tpm.h
> index 9ae1ab6da3..17a97ed77a 100644
> --- a/include/sysemu/tpm.h
> +++ b/include/sysemu/tpm.h
> @@ -16,7 +16,7 @@
>  #include "qom/object.h"
>
>  int tpm_config_parse(QemuOptsList *opts_list, const char *optarg);
> -int tpm_init(void);
> +void tpm_init(void);
>  void tpm_cleanup(void);
>
>  typedef enum TPMVersion {
> diff --git a/stubs/tpm.c b/stubs/tpm.c
> index 6729bc8517..80939cd3db 100644
> --- a/stubs/tpm.c
> +++ b/stubs/tpm.c
> @@ -9,9 +9,8 @@
>  #include "qapi/qapi-commands-tpm.h"
>  #include "sysemu/tpm.h"
>
> -int tpm_init(void)
> +void tpm_init(void)
>  {
> -    return 0;
>  }
>
>  void tpm_cleanup(void)
> diff --git a/tpm.c b/tpm.c
> index 93031723ad..9c9e20bbb7 100644
> --- a/tpm.c
> +++ b/tpm.c
> @@ -89,19 +89,19 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      int i;
>
>      if (!QLIST_EMPTY(&tpm_backends)) {
> -        error_report("Only one TPM is allowed.");
> +        error_setg(errp, "Only one TPM is allowed.");
>          return 1;
>      }
>
>      id = qemu_opts_id(opts);
>      if (id == NULL) {
> -        error_report(QERR_MISSING_PARAMETER, "id");
> +        error_setg(errp, QERR_MISSING_PARAMETER, "id");
>          return 1;
>      }
>
>      value = qemu_opt_get(opts, "type");
>      if (!value) {
> -        error_report(QERR_MISSING_PARAMETER, "type");
> +        error_setg(errp, QERR_MISSING_PARAMETER, "type");
>          tpm_display_backend_drivers();
>          return 1;
>      }
> @@ -109,8 +109,8 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      i = qapi_enum_parse(&TpmType_lookup, value, -1, NULL);
>      be = i >= 0 ? tpm_be_find_by_type(i) : NULL;
>      if (be == NULL) {
> -        error_report(QERR_INVALID_PARAMETER_VALUE,
> -                     "type", "a TPM backend type");
> +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
> +                   "a TPM backend type");
>          tpm_display_backend_drivers();
>          return 1;
>      }
> @@ -118,7 +118,7 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
>      /* validate backend specific opts */
>      qemu_opts_validate(opts, be->opts, &local_err);
>      if (local_err) {
> -        error_report_err(local_err);
> +        error_propagate(errp, local_err);
>          return 1;
>      }
>
> @@ -151,14 +151,10 @@ void tpm_cleanup(void)
>   * Initialize the TPM. Process the tpmdev command line options describing the
>   * TPM backend.
>   */
> -int tpm_init(void)
> +void tpm_init(void)
>  {
> -    if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
> -                          tpm_init_tpmdev, NULL, NULL)) {
> -        return -1;
> -    }
> -
> -    return 0;
> +    qemu_opts_foreach(qemu_find_opts("tpmdev"),
> +                      tpm_init_tpmdev, NULL, &error_fatal);
>  }
>
>  /*
> diff --git a/vl.c b/vl.c
> index 5c159ca45c..b6f9212f09 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4312,9 +4312,7 @@ int main(int argc, char **argv, char **envp)
>                        user_creatable_add_opts_foreach,
>                        object_create_delayed, &error_fatal);
>
> -    if (tpm_init() < 0) {
> -        exit(1);
> -    }
> +    tpm_init();
>
>      /* init the bluetooth world */
>      if (foreach_device_config(DEV_BT, bt_parse))
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel() Markus Armbruster
@ 2018-10-09 11:46   ` Marc-André Lureau
  0 siblings, 0 replies; 90+ messages in thread
From: Marc-André Lureau @ 2018-10-09 11:46 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: QEMU, Gerd Hoffmann

Hi

On Mon, Oct 8, 2018 at 9:43 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  add_channel() does that, and then exit()s.  Its caller
> main(), via qemu_opts_foreach(), is fine with it, but clean it up
> anyway.
>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  ui/spice-core.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/ui/spice-core.c b/ui/spice-core.c
> index a4fbbc3898..ebaae24643 100644
> --- a/ui/spice-core.c
> +++ b/ui/spice-core.c
> @@ -597,9 +597,9 @@ static int add_channel(void *opaque, const char *name, const char *value,
>      if (strcmp(name, "tls-channel") == 0) {
>          int *tls_port = opaque;
>          if (!*tls_port) {
> -            error_report("spice: tried to setup tls-channel"
> -                         " without specifying a TLS port");
> -            exit(1);
> +            error_setg(errp, "spice: tried to setup tls-channel"
> +                       " without specifying a TLS port");
> +            return -1;
>          }
>          security = SPICE_CHANNEL_SECURITY_SSL;
>      }
> @@ -615,8 +615,9 @@ static int add_channel(void *opaque, const char *name, const char *value,
>          rc = spice_server_set_channel_security(spice_server, value, security);
>      }
>      if (rc != 0) {
> -        error_report("spice: failed to set channel security for %s", value);
> -        exit(1);
> +        error_setg(errp, "spice: failed to set channel security for %s",
> +                   value);
> +        return -1;
>      }
>      return 0;
>  }
> @@ -787,7 +788,7 @@ void qemu_spice_init(void)
>      spice_server_set_playback_compression
>          (spice_server, qemu_opt_get_bool(opts, "playback-compression", 1));
>
> -    qemu_opt_foreach(opts, add_channel, &tls_port, NULL);
> +    qemu_opt_foreach(opts, add_channel, &tls_port, &error_fatal);
>
>      spice_server_set_name(spice_server, qemu_name);
>      spice_server_set_uuid(spice_server, (unsigned char *)&qemu_uuid);
> --
> 2.17.1
>
>


-- 
Marc-André Lureau

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
  2018-10-08 20:43   ` Eric Blake
  2018-10-09 11:11   ` Marc-André Lureau
@ 2018-10-09 13:25   ` Daniel P. Berrangé
  2 siblings, 0 replies; 90+ messages in thread
From: Daniel P. Berrangé @ 2018-10-09 13:25 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon, Oct 08, 2018 at 07:31:12PM +0200, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  user_creatable_add_opts_foreach() does that, and then
> fails without setting an error.  Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
> 
> Cc: Daniel P. Berrangé <berrange@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qemu-io.c               |  8 +++-----
>  qemu-nbd.c              |  8 +++-----
>  qom/object_interfaces.c |  4 +---
>  vl.c                    | 16 ++++++----------
>  4 files changed, 13 insertions(+), 23 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
  2018-10-09  9:25   ` Marc-André Lureau
@ 2018-10-09 17:02   ` Paolo Bonzini
  1 sibling, 0 replies; 90+ messages in thread
From: Paolo Bonzini @ 2018-10-09 17:02 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel

On 08/10/2018 19:31, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  smbios_entry_add() does that, and then exit()s.  It
> also passes &error_fatal to qemu_opts_validate().  Both wrong, but
> currently harmless, as its only caller passes &error_fatal.  Messed up
> in commit 1007a37e208.  Clean it up.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/smbios/smbios.c | 90 +++++++++++++++++++++++++++++++---------------
>  1 file changed, 62 insertions(+), 28 deletions(-)
> 
> diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
> index a27e54b2fa..920939454e 100644
> --- a/hw/smbios/smbios.c
> +++ b/hw/smbios/smbios.c
> @@ -950,6 +950,7 @@ static void save_opt_list(size_t *ndest, const char ***dest,
>  
>  void smbios_entry_add(QemuOpts *opts, Error **errp)
>  {
> +    Error *err = NULL;
>      const char *val;
>  
>      assert(!smbios_immutable);
> @@ -960,12 +961,16 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>          int size;
>          struct smbios_table *table; /* legacy mode only */
>  
> -        qemu_opts_validate(opts, qemu_smbios_file_opts, &error_fatal);
> +        qemu_opts_validate(opts, qemu_smbios_file_opts, &err);
> +        if (err) {
> +            error_propagate(errp, err);
> +            return;
> +        }
>  
>          size = get_image_size(val);
>          if (size == -1 || size < sizeof(struct smbios_structure_header)) {
> -            error_report("Cannot read SMBIOS file %s", val);
> -            exit(1);
> +            error_setg(errp, "Cannot read SMBIOS file %s", val);
> +            return;
>          }
>  
>          /*
> @@ -978,14 +983,15 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>                                                      smbios_tables_len);
>  
>          if (load_image(val, (uint8_t *)header) != size) {
> -            error_report("Failed to load SMBIOS file %s", val);
> -            exit(1);
> +            error_setg(errp, "Failed to load SMBIOS file %s", val);
> +            return;
>          }
>  
>          if (test_bit(header->type, have_fields_bitmap)) {
> -            error_report("can't load type %d struct, fields already specified!",
> -                         header->type);
> -            exit(1);
> +            error_setg(errp,
> +                       "can't load type %d struct, fields already specified!",
> +                       header->type);
> +            return;
>          }
>          set_bit(header->type, have_binfile_bitmap);
>  
> @@ -1030,19 +1036,23 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>          unsigned long type = strtoul(val, NULL, 0);
>  
>          if (type > SMBIOS_MAX_TYPE) {
> -            error_report("out of range!");
> -            exit(1);
> +            error_setg(errp, "out of range!");
> +            return;
>          }
>  
>          if (test_bit(type, have_binfile_bitmap)) {
> -            error_report("can't add fields, binary file already loaded!");
> -            exit(1);
> +            error_setg(errp, "can't add fields, binary file already loaded!");
> +            return;
>          }
>          set_bit(type, have_fields_bitmap);
>  
>          switch (type) {
>          case 0:
> -            qemu_opts_validate(opts, qemu_smbios_type0_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type0_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type0.vendor, opts, "vendor");
>              save_opt(&type0.version, opts, "version");
>              save_opt(&type0.date, opts, "date");
> @@ -1051,14 +1061,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              val = qemu_opt_get(opts, "release");
>              if (val) {
>                  if (sscanf(val, "%hhu.%hhu", &type0.major, &type0.minor) != 2) {
> -                    error_report("Invalid release");
> -                    exit(1);
> +                    error_setg(errp, "Invalid release");
> +                    return;
>                  }
>                  type0.have_major_minor = true;
>              }
>              return;
>          case 1:
> -            qemu_opts_validate(opts, qemu_smbios_type1_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type1_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type1.manufacturer, opts, "manufacturer");
>              save_opt(&type1.product, opts, "product");
>              save_opt(&type1.version, opts, "version");
> @@ -1069,14 +1083,18 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              val = qemu_opt_get(opts, "uuid");
>              if (val) {
>                  if (qemu_uuid_parse(val, &qemu_uuid) != 0) {
> -                    error_report("Invalid UUID");
> -                    exit(1);
> +                    error_setg(errp, "Invalid UUID");
> +                    return;
>                  }
>                  qemu_uuid_set = true;
>              }
>              return;
>          case 2:
> -            qemu_opts_validate(opts, qemu_smbios_type2_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type2_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type2.manufacturer, opts, "manufacturer");
>              save_opt(&type2.product, opts, "product");
>              save_opt(&type2.version, opts, "version");
> @@ -1085,7 +1103,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type2.location, opts, "location");
>              return;
>          case 3:
> -            qemu_opts_validate(opts, qemu_smbios_type3_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type3_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type3.manufacturer, opts, "manufacturer");
>              save_opt(&type3.version, opts, "version");
>              save_opt(&type3.serial, opts, "serial");
> @@ -1093,7 +1115,11 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type3.sku, opts, "sku");
>              return;
>          case 4:
> -            qemu_opts_validate(opts, qemu_smbios_type4_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type4_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type4.sock_pfx, opts, "sock_pfx");
>              save_opt(&type4.manufacturer, opts, "manufacturer");
>              save_opt(&type4.version, opts, "version");
> @@ -1102,11 +1128,19 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              save_opt(&type4.part, opts, "part");
>              return;
>          case 11:
> -            qemu_opts_validate(opts, qemu_smbios_type11_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type11_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt_list(&type11.nvalues, &type11.values, opts, "value");
>              return;
>          case 17:
> -            qemu_opts_validate(opts, qemu_smbios_type17_opts, &error_fatal);
> +            qemu_opts_validate(opts, qemu_smbios_type17_opts, &err);
> +            if (err) {
> +                error_propagate(errp, err);
> +                return;
> +            }
>              save_opt(&type17.loc_pfx, opts, "loc_pfx");
>              save_opt(&type17.bank, opts, "bank");
>              save_opt(&type17.manufacturer, opts, "manufacturer");
> @@ -1116,12 +1150,12 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
>              type17.speed = qemu_opt_get_number(opts, "speed", 0);
>              return;
>          default:
> -            error_report("Don't know how to build fields for SMBIOS type %ld",
> -                         type);
> -            exit(1);
> +            error_setg(errp,
> +                       "Don't know how to build fields for SMBIOS type %ld",
> +                       type);
> +            return;
>          }
>      }
>  
> -    error_report("Must specify type= or file=");
> -    exit(1);
> +    error_setg(errp, "Must specify type= or file=");
>  }
> 

Acked-by: Paolo Bonzini <pbonzini@redhat.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
  2018-10-09  9:53   ` Marc-André Lureau
@ 2018-10-10 12:39   ` Eduardo Otubo
  1 sibling, 0 replies; 90+ messages in thread
From: Eduardo Otubo @ 2018-10-10 12:39 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 4181 bytes --]

On 08/10/2018 - 19:31:10, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_sandbox() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
> 
> Cc: Eduardo Otubo <otubo@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qemu-seccomp.c | 18 +++++++++---------
>  vl.c           |  4 ++--
>  2 files changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/qemu-seccomp.c b/qemu-seccomp.c
> index 1baa5c69ed..6d27699409 100644
> --- a/qemu-seccomp.c
> +++ b/qemu-seccomp.c
> @@ -12,11 +12,12 @@
>   * Contributions after 2012-01-13 are licensed under the terms of the
>   * GNU GPL, version 2 or (at your option) any later version.
>   */
> +
>  #include "qemu/osdep.h"
> +#include "qapi/error.h"
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  #include "qemu/module.h"
> -#include "qemu/error-report.h"
>  #include <sys/prctl.h>
>  #include <seccomp.h>
>  #include "sysemu/seccomp.h"
> @@ -190,7 +191,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>                   * to provide a little bit of consistency for
>                   * the command line */
>              } else {
> -                error_report("invalid argument for obsolete");
> +                error_setg(errp, "invalid argument for obsolete");
>                  return -1;
>              }
>          }
> @@ -205,14 +206,13 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>                  /* calling prctl directly because we're
>                   * not sure if host has CAP_SYS_ADMIN set*/
>                  if (prctl(PR_SET_NO_NEW_PRIVS, 1)) {
> -                    error_report("failed to set no_new_privs "
> -                                 "aborting");
> +                    error_setg(errp, "failed to set no_new_privs " "aborting");
>                      return -1;

Except for this " " all else is good.

Acked-by: Eduardo Otubo <otubo@redhat.com>

>                  }
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for elevateprivileges");
> +                error_setg(errp, "invalid argument for elevateprivileges");
>                  return -1;
>              }
>          }
> @@ -224,7 +224,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for spawn");
> +                error_setg(errp, "invalid argument for spawn");
>                  return -1;
>              }
>          }
> @@ -236,14 +236,14 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>              } else if (g_str_equal(value, "allow")) {
>                  /* default value */
>              } else {
> -                error_report("invalid argument for resourcecontrol");
> +                error_setg(errp, "invalid argument for resourcecontrol");
>                  return -1;
>              }
>          }
>  
>          if (seccomp_start(seccomp_opts) < 0) {
> -            error_report("failed to install seccomp syscall filter "
> -                         "in the kernel");
> +            error_setg(errp, "failed to install seccomp syscall filter "
> +                       "in the kernel");
>              return -1;
>          }
>      }
> diff --git a/vl.c b/vl.c
> index 9d2b38a31f..485c3fc008 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3925,8 +3925,8 @@ int main(int argc, char **argv, char **envp)
>  
>  #ifdef CONFIG_SECCOMP
>      olist = qemu_find_opts_err("sandbox", NULL);
> -    if (olist && qemu_opts_foreach(olist, parse_sandbox, NULL, NULL)) {
> -        exit(1);
> +    if (olist) {
> +        qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
>      }
>  #endif
>  
> -- 
> 2.17.1
> 

-- 
Eduardo Otubo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize() Markus Armbruster
@ 2018-10-10 13:31   ` Anthony PERARD
  0 siblings, 0 replies; 90+ messages in thread
From: Anthony PERARD @ 2018-10-10 13:31 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Stefano Stabellini

On Mon, Oct 08, 2018 at 07:31:09PM +0200, Markus Armbruster wrote:
> The conversion of "xen-pci-passthrough" to realize() (commit
> 5a11d0f7549, v2.6.0) neglected to convert the xen_pt_config_init()
> error path.  If xen_pt_config_init() fails, xen_pt_realize() reports
> the error, then returns success without completing its job.  I don't
> know the exact impact, but it can't be good.
> 
> Belatedly convert the error path.
> 
> Fixes: 5a11d0f7549e24a10e178a9dc8ff5e698031d9a6
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Anthony Perard <anthony.perard@citrix.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Acked-by: Anthony PERARD <anthony.perard@citrix.com>

Thanks,

-- 
Anthony PERARD

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
  2018-10-09 10:57   ` Philippe Mathieu-Daudé
  2018-10-09 11:38   ` Marc-André Lureau
@ 2018-10-10 19:00   ` Stefan Berger
  2 siblings, 0 replies; 90+ messages in thread
From: Stefan Berger @ 2018-10-10 19:00 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel; +Cc: Stefan Berger

On 10/8/18 1:31 PM, Markus Armbruster wrote:
> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  tpm_init_tpmdev() does that, and then fails without
> setting an error.  Its caller main(), via tpm_init() and
> qemu_opts_foreach(), is fine with it, but clean it up anyway.
>
> Cc: Stefan Berger <stefanb@linux.vnet.ibm.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>


Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again)
  2018-10-08 20:32   ` Eric Blake
@ 2018-10-11 17:25     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:25 UTC (permalink / raw)
  To: Eric Blake
  Cc: Markus Armbruster, qemu-devel, Paolo Bonzini, Alexander Graf,
	David Gibson

Eric Blake <eblake@redhat.com> writes:

> On 10/8/18 12:30 PM, Markus Armbruster wrote:
>> Add a slight improvement of the Coccinelle semantic patch from commit
>> 07d04a0219b,
>
> which shares the same commit title, but does not actually have a
> semantic patch, but rather defers to the even older 007b065.  But I'm
> not too worried about either the duplicated commit title nor the chain
> of references to follow - as this is a no-semantic-change patch rather
> than a bugfix, it's less likely to cause confusion to any downstream
> backport efforts.

I'm changing the reference to 007b06578ab anyway.

>> and use it to clean up.  It leaves dead Error * variables
>> behind, cleaned up manually.
>
> Coccinelle can handle that too, if we want to make the .cocci file
> longer (but off-hand, I don't remember the exact semantic patch
> formula to express a variable that is initialized but then never used,
> as a result of applying earlier semantic patches). So the manual
> cleanup for now still seems tractable.

We can track down the recipe when the manual cleanup becomes tiresome.

>>
>> Cc: David Gibson <david@gibson.dropbear.id.au>
>> Cc: Alexander Graf <agraf@suse.de>
>> Cc: Eric Blake <eblake@redhat.com>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   hw/intc/xics_kvm.c                       |  7 +------
>>   qemu-nbd.c                               |  6 +-----
>>   scripts/coccinelle/use-error_fatal.cocci | 20 ++++++++++++++++++++
>>   vl.c                                     |  7 +------
>>   4 files changed, 23 insertions(+), 17 deletions(-)
>>   create mode 100644 scripts/coccinelle/use-error_fatal.cocci
>>
>
>> +++ b/scripts/coccinelle/use-error_fatal.cocci
>> @@ -0,0 +1,20 @@
>> +@@
>> +type T;
>> +identifier FUN, RET;
>> +expression list ARGS;
>> +expression ERR, EC, FAIL;
>
> The slight improvement from the original git commit log script is the
> addition of FAIL,
>
>> +@@
>> +(
>> +-    T RET = FUN(ARGS, &ERR);
>> ++    T RET = FUN(ARGS, &error_fatal);
>> +|
>> +-    RET = FUN(ARGS, &ERR);
>> ++    RET = FUN(ARGS, &error_fatal);
>> +|
>> +-    FUN(ARGS, &ERR);
>> ++    FUN(ARGS, &error_fatal);
>> +)
>> +-    if (FAIL) {
>
> and a check for arbitrary condition FAIL rather than a more specific
> ERR != NULL.  Makes sense.

Yes.

>> +-        error_report_err(ERR);
>> +-        exit(EC);
>> +-    }
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting
  2018-10-09  9:32   ` Marc-André Lureau
@ 2018-10-11 17:35     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:35 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: Jason Wang, QEMU

Marc-André Lureau <marcandre.lureau@gmail.com> writes:

> Hi
> On Mon, Oct 8, 2018 at 9:54 PM Markus Armbruster <armbru@redhat.com> wrote:
>>
>> When -netdev l2tpv3 fails, it first reports a specific error, then a
>> generic one, like this:
>>
>>     $ qemu-system-x86_64 -netdev l2tpv3,id=foo,src=,dst=,txsession=1
>>     qemu-system-x86_64: -netdev l2tpv3,id=foo,src=,dst=,txsession=1: l2tpv3_open : could not resolve src, errno = Name or service not known
>>     qemu-system-x86_64: Device 'l2tpv3' could not be initialized
>>
>> With the command line, the messages go to stderr.  In HMP, they go to
>> the monitor.  In QMP, the second one becomes the error reply, and the
>> first one goes to stderr.
>>
>> Convert net_init_tap() to Error.  This suppresses the unwanted second
>> message, and makes the specific error the QMP error reply.
>>
>> Cc: Jason Wang <jasowang@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  net/l2tpv3.c | 26 +++++++++++++-------------
>>  1 file changed, 13 insertions(+), 13 deletions(-)
>>
>> diff --git a/net/l2tpv3.c b/net/l2tpv3.c
>> index 6745b78990..0c5dd22ef7 100644
>> --- a/net/l2tpv3.c
>> +++ b/net/l2tpv3.c
>> @@ -28,6 +28,7 @@
>>  #include <netdb.h>
>>  #include "net/net.h"
>>  #include "clients.h"
>> +#include "qapi/error.h"
>>  #include "qemu-common.h"
>>  #include "qemu/error-report.h"
>>  #include "qemu/option.h"
>> @@ -528,7 +529,6 @@ int net_init_l2tpv3(const Netdev *netdev,
>>                      const char *name,
>>                      NetClientState *peer, Error **errp)
>>  {
>> -    /* FIXME error_setg(errp, ...) on failure */
>>      const NetdevL2TPv3Options *l2tpv3;
>>      NetL2TPV3State *s;
>>      NetClientState *nc;
>> @@ -555,7 +555,7 @@ int net_init_l2tpv3(const Netdev *netdev,
>>      }
>>
>>      if ((l2tpv3->has_offset) && (l2tpv3->offset > 256)) {
>> -        error_report("l2tpv3_open : offset must be less than 256 bytes");
>> +        error_setg(errp, "l2tpv3_open : offset must be less than 256 bytes");
>>          goto outerr;
>>      }
>>
>> @@ -563,6 +563,8 @@ int net_init_l2tpv3(const Netdev *netdev,
>>          if (l2tpv3->has_rxcookie && l2tpv3->has_txcookie) {
>>              s->cookie = true;
>>          } else {
>> +            error_setg(errp,
>> +                       "require both 'rxcookie' and 'txcookie' or neither");
>
> maybe for consistency it would be a good idea to remove the
> "l2tpv3_open : " prefix from the other messages while touching it?

Good idea, not least since the other net_init_FOO() don't use such
prefixes.

> looks good otherwise:
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node error handling
  2018-10-08 18:03   ` Eduardo Habkost
@ 2018-10-11 17:38     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:38 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: Igor Mammedov, qemu-devel

Eduardo Habkost <ehabkost@redhat.com> writes:

> On Mon, Oct 08, 2018 at 07:31:08PM +0200, Markus Armbruster wrote:
>> Calling error_report() in a function that takes an Error ** argument
>> is suspicious.  parse_numa_node() does that, and then exit()s.  It
>> also passes &error_fatal to machine_set_cpu_numa_node().  Both wrong.
>> Attempting to configure numa when the machine doesn't support it kills
>> the VM:
>> 
>>     $ qemu-system-x86_64 -nodefaults -S -display none -M none -preconfig -qmp stdio
>>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
>>     {"execute": "qmp_capabilities"}
>>     {"return": {}}
>>     {"execute": "set-numa-node", "arguments": {"type": "node"}}
>>     NUMA is not supported by this machine-type
>>     $ echo $?
>>     1
>> 
>> Messed up when commit 64c2a8f6d3f and 7c88e65d9e9 (v2.10.0) added
>> incorrect error handling right next to correct examples.  Latent bug
>> until commit f3be67812c2 (v3.0.0) made it accessible via QMP.  Fairly
>> harmless in practice, because it's limited to RUN_STATE_PRECONFIG.
>> The fix is obvious: replace error_report(); exit() by error_setg();
>> return.
>> 
>> This affects parse_numa_node()'s other caller
>> numa_complete_configuration(): since it ignores errors, the "NUMA is
>> not supported by this machine-type" is now ignored, too.  But that
>> error is as unexpected there as any other.  Change it to abort on
>> error instead.
>> 
>> Fixes: f3be67812c226162f86ce92634bd913714445420
>> Cc: Igor Mammedov <imammedo@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> 
>> fixup! numa: Fix QMP command set-numa-node error handling
>
> I assume this last line was kept by mistake, and I'm removing it
> while committing.

Oops.

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox()
  2018-10-09  9:53   ` Marc-André Lureau
@ 2018-10-11 17:40     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:40 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: Markus Armbruster, Eduardo Otubo, QEMU

Marc-André Lureau <marcandre.lureau@gmail.com> writes:

> Hi
>
> On Mon, Oct 8, 2018 at 9:50 PM Markus Armbruster <armbru@redhat.com> wrote:
>>
>> Calling error_report() in a function that takes an Error ** argument
>> is suspicious.  parse_sandbox() does that, and then fails without
>> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
>> with it, but clean it up anyway.
>>
>> Cc: Eduardo Otubo <otubo@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  qemu-seccomp.c | 18 +++++++++---------
>>  vl.c           |  4 ++--
>>  2 files changed, 11 insertions(+), 11 deletions(-)
>>
>> diff --git a/qemu-seccomp.c b/qemu-seccomp.c
>> index 1baa5c69ed..6d27699409 100644
>> --- a/qemu-seccomp.c
>> +++ b/qemu-seccomp.c
>> @@ -12,11 +12,12 @@
>>   * Contributions after 2012-01-13 are licensed under the terms of the
>>   * GNU GPL, version 2 or (at your option) any later version.
>>   */
>> +
>>  #include "qemu/osdep.h"
>> +#include "qapi/error.h"
>>  #include "qemu/config-file.h"
>>  #include "qemu/option.h"
>>  #include "qemu/module.h"
>> -#include "qemu/error-report.h"
>>  #include <sys/prctl.h>
>>  #include <seccomp.h>
>>  #include "sysemu/seccomp.h"
>> @@ -190,7 +191,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>>                   * to provide a little bit of consistency for
>>                   * the command line */
>>              } else {
>> -                error_report("invalid argument for obsolete");
>> +                error_setg(errp, "invalid argument for obsolete");
>>                  return -1;
>>              }
>>          }
>> @@ -205,14 +206,13 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>>                  /* calling prctl directly because we're
>>                   * not sure if host has CAP_SYS_ADMIN set*/
>>                  if (prctl(PR_SET_NO_NEW_PRIVS, 1)) {
>> -                    error_report("failed to set no_new_privs "
>> -                                 "aborting");
>> +                    error_setg(errp, "failed to set no_new_privs " "aborting");
>
> Extra " "

Fixing...

>>                      return -1;
>>                  }
>>              } else if (g_str_equal(value, "allow")) {
>>                  /* default value */
>>              } else {
>> -                error_report("invalid argument for elevateprivileges");
>> +                error_setg(errp, "invalid argument for elevateprivileges");
>>                  return -1;
>>              }
>>          }
>> @@ -224,7 +224,7 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>>              } else if (g_str_equal(value, "allow")) {
>>                  /* default value */
>>              } else {
>> -                error_report("invalid argument for spawn");
>> +                error_setg(errp, "invalid argument for spawn");
>>                  return -1;
>>              }
>>          }
>> @@ -236,14 +236,14 @@ int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
>>              } else if (g_str_equal(value, "allow")) {
>>                  /* default value */
>>              } else {
>> -                error_report("invalid argument for resourcecontrol");
>> +                error_setg(errp, "invalid argument for resourcecontrol");
>>                  return -1;
>>              }
>>          }
>>
>>          if (seccomp_start(seccomp_opts) < 0) {
>> -            error_report("failed to install seccomp syscall filter "
>> -                         "in the kernel");
>> +            error_setg(errp, "failed to install seccomp syscall filter "
>> +                       "in the kernel");
>>              return -1;
>>          }
>>      }
>> diff --git a/vl.c b/vl.c
>> index 9d2b38a31f..485c3fc008 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -3925,8 +3925,8 @@ int main(int argc, char **argv, char **envp)
>>
>>  #ifdef CONFIG_SECCOMP
>>      olist = qemu_find_opts_err("sandbox", NULL);
>> -    if (olist && qemu_opts_foreach(olist, parse_sandbox, NULL, NULL)) {
>> -        exit(1);
>> +    if (olist) {
>> +        qemu_opts_foreach(olist, parse_sandbox, NULL, &error_fatal);
>>      }
>>  #endif
>>
>
> Other than that,
>
>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd()
  2018-10-09 11:13   ` Marc-André Lureau
@ 2018-10-11 17:43     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:43 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: QEMU

Marc-André Lureau <marcandre.lureau@gmail.com> writes:

> Hi
>
> On Mon, Oct 8, 2018 at 9:51 PM Markus Armbruster <armbru@redhat.com> wrote:
>>
>> Calling error_report() in a function that takes an Error ** argument
>> is suspicious.  chardev_init_func() does that, and then fails without
>> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
>> with it, but clean it up anyway.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>
> commit title is wrong, apart from that:

Fixing...

> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Thanks!

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func()
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
  2018-10-09 11:35   ` Marc-André Lureau
@ 2018-10-11 17:48   ` Markus Armbruster
  1 sibling, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Markus Armbruster <armbru@redhat.com> writes:

> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  vnc_init_func() does that, and then fails without
> setting an error.  Its caller main(), via qemu_opts_foreach(), is fine
> with it, but clean it up anyway.
>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  ui/vnc.c | 5 +++--
>  vl.c     | 2 +-
>  2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/ui/vnc.c b/ui/vnc.c
> index cf221c83cc..df6c84b802 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -4082,8 +4082,9 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
>      vnc_display_init(id);

My patch is incomplete, there's fprintf(stderr, ...); exit(1); hiding
behind vnc_display_init().  See my review of "[PATCH RFC v5 2/7]
ui/vnc.c: polish vnc_init_func"
https://lists.nongnu.org/archive/html/qemu-devel/2018-10/msg02238.html
Message-ID: <87h8hs4oe3.fsf@dusky.pond.sub.org>


>      vnc_display_open(id, &local_err);
>      if (local_err != NULL) {
> -        error_reportf_err(local_err, "Failed to start VNC server: ");
> -        exit(1);
> +        error_propagate(errp, local_err);
> +        error_prepend(errp, "Failed to start VNC server: ");
> +        return -1;
>      }
>      return 0;
>  }
> diff --git a/vl.c b/vl.c
> index 86eee4c798..5c159ca45c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4479,7 +4479,7 @@ int main(int argc, char **argv, char **envp)
>      /* init remote displays */
>  #ifdef CONFIG_VNC
>      qemu_opts_foreach(qemu_find_opts("vnc"),
> -                      vnc_init_func, NULL, NULL);
> +                      vnc_init_func, NULL, &error_fatal);
>  #endif
>  
>      if (using_spice) {

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add()
  2018-10-08 20:46   ` Eric Blake
@ 2018-10-11 17:51     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-11 17:51 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, Greg Kurz

Eric Blake <eblake@redhat.com> writes:

> On 10/8/18 12:31 PM, Markus Armbruster wrote:
>> Calling error_report() from within a a function that takes an Error **
>
> s/a a/a/

Fixing, thanks!

>> argument is suspicious.  qemu_fsdev_add() does that, and its caller
>> fsdev_init_func() then fails without setting an error.  Its caller
>> main(), via qemu_opts_foreach(), is fine with it, but clean it up
>> anyway.
>>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-08 21:22   ` Max Reitz
@ 2018-10-12  5:44     ` Markus Armbruster
  2018-10-12 12:28       ` Max Reitz
  0 siblings, 1 reply; 90+ messages in thread
From: Markus Armbruster @ 2018-10-12  5:44 UTC (permalink / raw)
  To: Max Reitz; +Cc: qemu-devel, Kevin Wolf, Marc-André Lureau

Copying Marc-André for a possible connection to his recent work on
improving help.  Marc-André, search for "format=help".  Just in case you
have further observations to offer.

Max Reitz <mreitz@redhat.com> writes:

> On 08.10.18 19:31, Markus Armbruster wrote:
>> Calling error_report() from within a a function that takes an Error **
>> argument is suspicious.  drive_new() does that, and its caller
>> drive_init_func() then exit()s.
>
> I'm afraid I don't quite follow you here.  There is no function here
> that takes an Error ** already and then calls error_report().  There is
> however drive_new() that does not take an Error **, consequentially
> calls error_report(), and there is its caller drive_init_func() which
> does take an Error ** but does not set it.
>
> So while I fully agree with you to make drive_new() take an Error **
> (and thus effectively fix drive_init_func()), I don't quite understand
> this explanation.
>
> (Furthermore, drive_init_func() does not exit().  It's main() that
> exit()s after calling drive_init_func().)
  
You're right.

There's about a dozen patches cleaning up pretty much the same thing,
and I reused the same commit message with the appropriate variations.  I
failed to vary this instance appropriately.  Sorry!

I'll fix this for v2.

>> Its caller main(), via
>> qemu_opts_foreach(), is fine with it, but clean it up anyway:
>> 
>> * Convert drive_new() to Error
>> 
>> * Update add_init_drive() to report the error received from
>>   drive_new().
>> 
>> * Make main() pass &error_fatal through qemu_opts_foreach(),
>>   drive_init_func() to drive_new()
>> 
>> * Make default_drive() pass &error_abort through qemu_opts_foreach(),
>>   drive_init_func() to drive_new()
>> 
>> Cc: Kevin Wolf <kwolf@redhat.com>
>> Cc: Max Reitz <mreitz@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  blockdev.c                | 27 ++++++++++++++-------------
>>  device-hotplug.c          |  5 ++++-
>>  include/sysemu/blockdev.h |  3 ++-
>>  vl.c                      | 11 ++++-------
>>  4 files changed, 24 insertions(+), 22 deletions(-)
>> 
>> diff --git a/blockdev.c b/blockdev.c
>> index a8755bd908..574adbcb7f 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -759,7 +759,8 @@ QemuOptsList qemu_legacy_drive_opts = {
>
> [...]
>
>> @@ -991,7 +992,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
>>      bs_opts = NULL;
>>      if (!blk) {
>>          if (local_err) {
>> -            error_report_err(local_err);
>> +            error_propagate(errp, local_err);
>>          }
>
> Wait, what would be the case where blockdev_init() returns NULL but
> *errp remains unse——— oh no.
>
> There is only one case which is someone specified "format=help".  Hm.  I
> suppose you are as unhappy as me about the fact that because of this
> drive_new() cannot guarantee that *errp is set in case of an error.

That's an ugly interface wart we have in a few places.  In a nutshell, either

* succeed and return a value indicating success

* fail, set an error, and return a value indicating failure

* print help, leave error alone, and return a value indicating failure

> I think it's ""fine"" (*gnashing teeth*) to keep it this way, but it
> means that callers need to continue to check the return value and not
> *errp alone.

Yes, they need to check both.

Note that -device and -machine use a technique I consider cleaner:
there's a separate function FOO_help_func() to deal with providing help
before we do the actual work.  If the user asked for help,
FOO_help_func() prints some, and returns 1.  Else it returns 0.  This
lets main() call exit(0) after help.

>>          goto fail;
>>      } else {
>> diff --git a/device-hotplug.c b/device-hotplug.c
>> index cd427e2c76..6090d5f1e9 100644
>> --- a/device-hotplug.c
>> +++ b/device-hotplug.c
>> @@ -28,6 +28,7 @@
>>  #include "sysemu/block-backend.h"
>>  #include "sysemu/blockdev.h"
>>  #include "qapi/qmp/qdict.h"
>> +#include "qapi/error.h"
>>  #include "qemu/config-file.h"
>>  #include "qemu/option.h"
>>  #include "sysemu/sysemu.h"
>> @@ -36,6 +37,7 @@
>>  
>>  static DriveInfo *add_init_drive(const char *optstr)
>>  {
>> +    Error *err = NULL;
>>      DriveInfo *dinfo;
>>      QemuOpts *opts;
>>      MachineClass *mc;
>> @@ -45,8 +47,9 @@ static DriveInfo *add_init_drive(const char *optstr)
>>          return NULL;
>>  
>>      mc = MACHINE_GET_CLASS(current_machine);
>> -    dinfo = drive_new(opts, mc->block_default_type);
>> +    dinfo = drive_new(opts, mc->block_default_type, &err);
>>      if (!dinfo) {
>> +        error_report_err(err);
>>          qemu_opts_del(opts);
>>          return NULL;
>>      }
>> diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
>> index 24954b94e0..d34c4920dc 100644
>> --- a/include/sysemu/blockdev.h
>> +++ b/include/sysemu/blockdev.h
>> @@ -54,7 +54,8 @@ DriveInfo *drive_get_next(BlockInterfaceType type);
>>  QemuOpts *drive_def(const char *optstr);
>>  QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
>>                      const char *optstr);
>> -DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
>> +DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type,
>> +                     Error **errp);
>>  
>>  /* device-hotplug */
>>  
>> diff --git a/vl.c b/vl.c
>> index 0d25956b2f..101e0123d9 100644
>> --- a/vl.c
>> +++ b/vl.c
>> @@ -1129,7 +1129,7 @@ static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
>>  {
>>      BlockInterfaceType *block_default_type = opaque;
>>  
>> -    return drive_new(opts, *block_default_type) == NULL;
>> +    return drive_new(opts, *block_default_type, errp) == NULL;
>>  }
>>  
>>  static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
>> @@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
>>          drive_enable_snapshot(NULL, opts, NULL);
>>      }
>>  
>> -    dinfo = drive_new(opts, type);
>> -    assert(dinfo);
>> +    dinfo = drive_new(opts, type, &error_abort);
>
> Which means the assertion is still necessary here.

I see very little value in assert(p) right before *p.  Matter of taste,
I guess.  Do you want me to keep it?

>>      dinfo->is_default = true;
>>  
>>  }
>> @@ -4348,10 +4347,8 @@ int main(int argc, char **argv, char **envp)
>>          qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
>>                            NULL, NULL);
>>      }
>> -    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
>> -                          &machine_class->block_default_type, NULL)) {
>> -        exit(1);
>> -    }
>> +    qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
>> +                      &machine_class->block_default_type, &error_fatal);
>
> And we still have to keep an exit() here.

You're right.  But it should become exit(0).

> Alternative: You transform blockdev_init()'s format=help into an error
> (or construct a new error in drive_new() if blockdev_init() returned
> NULL but no error).

Another alternative would be separating out help.  Since I'd prefer to
keep this patch mostly mechanical, I'd rather do that on top if it's
desired.

>
> Max
>
>>  
>>      default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
>>                    CDROM_OPTS);
>> 

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-12  5:44     ` Markus Armbruster
@ 2018-10-12 12:28       ` Max Reitz
  2018-10-12 14:50         ` Kevin Wolf
  0 siblings, 1 reply; 90+ messages in thread
From: Max Reitz @ 2018-10-12 12:28 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Kevin Wolf, Marc-André Lureau

[-- Attachment #1: Type: text/plain, Size: 8210 bytes --]

On 12.10.18 07:44, Markus Armbruster wrote:
> Copying Marc-André for a possible connection to his recent work on
> improving help.  Marc-André, search for "format=help".  Just in case you
> have further observations to offer.
> 
> Max Reitz <mreitz@redhat.com> writes:
> 
>> On 08.10.18 19:31, Markus Armbruster wrote:
>>> Calling error_report() from within a a function that takes an Error **
>>> argument is suspicious.  drive_new() does that, and its caller
>>> drive_init_func() then exit()s.
>>
>> I'm afraid I don't quite follow you here.  There is no function here
>> that takes an Error ** already and then calls error_report().  There is
>> however drive_new() that does not take an Error **, consequentially
>> calls error_report(), and there is its caller drive_init_func() which
>> does take an Error ** but does not set it.
>>
>> So while I fully agree with you to make drive_new() take an Error **
>> (and thus effectively fix drive_init_func()), I don't quite understand
>> this explanation.
>>
>> (Furthermore, drive_init_func() does not exit().  It's main() that
>> exit()s after calling drive_init_func().)
>   
> You're right.
> 
> There's about a dozen patches cleaning up pretty much the same thing,
> and I reused the same commit message with the appropriate variations.  I
> failed to vary this instance appropriately.  Sorry!
> 
> I'll fix this for v2.
> 
>>> Its caller main(), via
>>> qemu_opts_foreach(), is fine with it, but clean it up anyway:
>>>
>>> * Convert drive_new() to Error
>>>
>>> * Update add_init_drive() to report the error received from
>>>   drive_new().
>>>
>>> * Make main() pass &error_fatal through qemu_opts_foreach(),
>>>   drive_init_func() to drive_new()
>>>
>>> * Make default_drive() pass &error_abort through qemu_opts_foreach(),
>>>   drive_init_func() to drive_new()
>>>
>>> Cc: Kevin Wolf <kwolf@redhat.com>
>>> Cc: Max Reitz <mreitz@redhat.com>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>  blockdev.c                | 27 ++++++++++++++-------------
>>>  device-hotplug.c          |  5 ++++-
>>>  include/sysemu/blockdev.h |  3 ++-
>>>  vl.c                      | 11 ++++-------
>>>  4 files changed, 24 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/blockdev.c b/blockdev.c
>>> index a8755bd908..574adbcb7f 100644
>>> --- a/blockdev.c
>>> +++ b/blockdev.c
>>> @@ -759,7 +759,8 @@ QemuOptsList qemu_legacy_drive_opts = {
>>
>> [...]
>>
>>> @@ -991,7 +992,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
>>>      bs_opts = NULL;
>>>      if (!blk) {
>>>          if (local_err) {
>>> -            error_report_err(local_err);
>>> +            error_propagate(errp, local_err);
>>>          }
>>
>> Wait, what would be the case where blockdev_init() returns NULL but
>> *errp remains unse——— oh no.
>>
>> There is only one case which is someone specified "format=help".  Hm.  I
>> suppose you are as unhappy as me about the fact that because of this
>> drive_new() cannot guarantee that *errp is set in case of an error.
> 
> That's an ugly interface wart we have in a few places.  In a nutshell, either
> 
> * succeed and return a value indicating success
> 
> * fail, set an error, and return a value indicating failure
> 
> * print help, leave error alone, and return a value indicating failure
> 
>> I think it's ""fine"" (*gnashing teeth*) to keep it this way, but it
>> means that callers need to continue to check the return value and not
>> *errp alone.
> 
> Yes, they need to check both.
> 
> Note that -device and -machine use a technique I consider cleaner:
> there's a separate function FOO_help_func() to deal with providing help
> before we do the actual work.  If the user asked for help,
> FOO_help_func() prints some, and returns 1.  Else it returns 0.  This
> lets main() call exit(0) after help.

It is indeed cleaner.  I don't mind the current way too much, though, I
mostly just don't like effectively failing without setting the Error object.

>>>          goto fail;
>>>      } else {
>>> diff --git a/device-hotplug.c b/device-hotplug.c
>>> index cd427e2c76..6090d5f1e9 100644
>>> --- a/device-hotplug.c
>>> +++ b/device-hotplug.c
>>> @@ -28,6 +28,7 @@
>>>  #include "sysemu/block-backend.h"
>>>  #include "sysemu/blockdev.h"
>>>  #include "qapi/qmp/qdict.h"
>>> +#include "qapi/error.h"
>>>  #include "qemu/config-file.h"
>>>  #include "qemu/option.h"
>>>  #include "sysemu/sysemu.h"
>>> @@ -36,6 +37,7 @@
>>>  
>>>  static DriveInfo *add_init_drive(const char *optstr)
>>>  {
>>> +    Error *err = NULL;
>>>      DriveInfo *dinfo;
>>>      QemuOpts *opts;
>>>      MachineClass *mc;
>>> @@ -45,8 +47,9 @@ static DriveInfo *add_init_drive(const char *optstr)
>>>          return NULL;
>>>  
>>>      mc = MACHINE_GET_CLASS(current_machine);
>>> -    dinfo = drive_new(opts, mc->block_default_type);
>>> +    dinfo = drive_new(opts, mc->block_default_type, &err);
>>>      if (!dinfo) {
>>> +        error_report_err(err);
>>>          qemu_opts_del(opts);
>>>          return NULL;
>>>      }
>>> diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
>>> index 24954b94e0..d34c4920dc 100644
>>> --- a/include/sysemu/blockdev.h
>>> +++ b/include/sysemu/blockdev.h
>>> @@ -54,7 +54,8 @@ DriveInfo *drive_get_next(BlockInterfaceType type);
>>>  QemuOpts *drive_def(const char *optstr);
>>>  QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
>>>                      const char *optstr);
>>> -DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
>>> +DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type,
>>> +                     Error **errp);
>>>  
>>>  /* device-hotplug */
>>>  
>>> diff --git a/vl.c b/vl.c
>>> index 0d25956b2f..101e0123d9 100644
>>> --- a/vl.c
>>> +++ b/vl.c
>>> @@ -1129,7 +1129,7 @@ static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
>>>  {
>>>      BlockInterfaceType *block_default_type = opaque;
>>>  
>>> -    return drive_new(opts, *block_default_type) == NULL;
>>> +    return drive_new(opts, *block_default_type, errp) == NULL;
>>>  }
>>>  
>>>  static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
>>> @@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
>>>          drive_enable_snapshot(NULL, opts, NULL);
>>>      }
>>>  
>>> -    dinfo = drive_new(opts, type);
>>> -    assert(dinfo);
>>> +    dinfo = drive_new(opts, type, &error_abort);
>>
>> Which means the assertion is still necessary here.
> 
> I see very little value in assert(p) right before *p.  Matter of taste,
> I guess.  Do you want me to keep it?

True.  "An assertion looks better to the user" isn't an argument,
considering the user shouldn't ever see assertions either.

So feel free to drop it indeed.

>>>      dinfo->is_default = true;
>>>  
>>>  }
>>> @@ -4348,10 +4347,8 @@ int main(int argc, char **argv, char **envp)
>>>          qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
>>>                            NULL, NULL);
>>>      }
>>> -    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
>>> -                          &machine_class->block_default_type, NULL)) {
>>> -        exit(1);
>>> -    }
>>> +    qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
>>> +                      &machine_class->block_default_type, &error_fatal);
>>
>> And we still have to keep an exit() here.
> 
> You're right.  But it should become exit(0).

That makes sense, yes.

>> Alternative: You transform blockdev_init()'s format=help into an error
>> (or construct a new error in drive_new() if blockdev_init() returned
>> NULL but no error).
> 
> Another alternative would be separating out help.  Since I'd prefer to
> keep this patch mostly mechanical, I'd rather do that on top if it's
> desired.

I'm not sure how much I desire it, so I won't push you to do so.  But
it's definitely fine to keep it out of this patch.

Max


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node error handling
  2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
  2018-10-08 18:03   ` Eduardo Habkost
@ 2018-10-12 14:35   ` Igor Mammedov
  2018-10-13 16:33     ` Markus Armbruster
  1 sibling, 1 reply; 90+ messages in thread
From: Igor Mammedov @ 2018-10-12 14:35 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

On Mon,  8 Oct 2018 19:31:08 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Calling error_report() in a function that takes an Error ** argument
> is suspicious.  parse_numa_node() does that, and then exit()s.  It
> also passes &error_fatal to machine_set_cpu_numa_node().  Both wrong.
> Attempting to configure numa when the machine doesn't support it kills
> the VM:
> 
>     $ qemu-system-x86_64 -nodefaults -S -display none -M none -preconfig -qmp stdio
>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
>     {"execute": "qmp_capabilities"}
>     {"return": {}}
>     {"execute": "set-numa-node", "arguments": {"type": "node"}}
>     NUMA is not supported by this machine-type
>     $ echo $?
>     1
> 
> Messed up when commit 64c2a8f6d3f and 7c88e65d9e9 (v2.10.0) added
> incorrect error handling right next to correct examples.  Latent bug
> until commit f3be67812c2 (v3.0.0) made it accessible via QMP.  Fairly
> harmless in practice, because it's limited to RUN_STATE_PRECONFIG.
> The fix is obvious: replace error_report(); exit() by error_setg();
> return.
> 
> This affects parse_numa_node()'s other caller
> numa_complete_configuration(): since it ignores errors, the "NUMA is
> not supported by this machine-type" is now ignored, too.  But that
> error is as unexpected there as any other.  Change it to abort on
> error instead.
> 
> Fixes: f3be67812c226162f86ce92634bd913714445420
> Cc: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> 
> fixup! numa: Fix QMP command set-numa-node error handling
> ---
>  numa.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/numa.c b/numa.c
> index 81542d4ebb..1d7c49ad43 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -60,6 +60,7 @@ NodeInfo numa_info[MAX_NODES];
>  static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>                              Error **errp)
>  {
> +    Error *err = NULL;
>      uint16_t nodenr;
>      uint16List *cpus = NULL;
>      MachineClass *mc = MACHINE_GET_CLASS(ms);
> @@ -82,8 +83,8 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>      }
>  
>      if (!mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id) {
> -        error_report("NUMA is not supported by this machine-type");
> -        exit(1);
> +        error_setg(errp, "NUMA is not supported by this machine-type");
> +        return;
>      }
>      for (cpus = node->cpus; cpus; cpus = cpus->next) {
>          CpuInstanceProperties props;
> @@ -97,7 +98,11 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>          props = mc->cpu_index_to_instance_props(ms, cpus->value);
>          props.node_id = nodenr;
>          props.has_node_id = true;
> -        machine_set_cpu_numa_node(ms, &props, &error_fatal);
> +        machine_set_cpu_numa_node(ms, &props, &err);
> +        if (err) {
> +            error_propagate(errp, err);
> +            return;
> +        }
>      }
>  
>      if (node->has_mem && node->has_memdev) {
> @@ -367,7 +372,7 @@ void numa_complete_configuration(MachineState *ms)
>      if (ms->ram_slots > 0 && nb_numa_nodes == 0 &&
>          mc->auto_enable_numa_with_memhp) {
>              NumaNodeOptions node = { };
> -            parse_numa_node(ms, &node, NULL);
> +            parse_numa_node(ms, &node, &error_abort);
it won't affect machines with numa support /i.e. no change/,
but if machine that doesn't support numa, gets here it fine for it to die.

>      }
>  
>      assert(max_numa_nodeid <= MAX_NODES);

Reviewed-by: Igor Mammedov <imammedo@redhat.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
  2018-10-12 12:28       ` Max Reitz
@ 2018-10-12 14:50         ` Kevin Wolf
  0 siblings, 0 replies; 90+ messages in thread
From: Kevin Wolf @ 2018-10-12 14:50 UTC (permalink / raw)
  To: Max Reitz; +Cc: Markus Armbruster, qemu-devel, Marc-André Lureau

[-- Attachment #1: Type: text/plain, Size: 1021 bytes --]

Am 12.10.2018 um 14:28 hat Max Reitz geschrieben:
> >>> @@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
> >>>          drive_enable_snapshot(NULL, opts, NULL);
> >>>      }
> >>>  
> >>> -    dinfo = drive_new(opts, type);
> >>> -    assert(dinfo);
> >>> +    dinfo = drive_new(opts, type, &error_abort);
> >>
> >> Which means the assertion is still necessary here.
> > 
> > I see very little value in assert(p) right before *p.  Matter of taste,
> > I guess.  Do you want me to keep it?
> 
> True.  "An assertion looks better to the user" isn't an argument,
> considering the user shouldn't ever see assertions either.

The point that could be made is that it documents that we're aware that
drive_new() can return NULL generally, but we've made sure that with the
specific options passed it doesn't happen here, so not having any error
handling is not a bug, but intended.

> So feel free to drop it indeed.

I don't mind either way.

Kevin

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 90+ messages in thread

* Re: [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node error handling
  2018-10-12 14:35   ` Igor Mammedov
@ 2018-10-13 16:33     ` Markus Armbruster
  0 siblings, 0 replies; 90+ messages in thread
From: Markus Armbruster @ 2018-10-13 16:33 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

Igor Mammedov <imammedo@redhat.com> writes:

> On Mon,  8 Oct 2018 19:31:08 +0200
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> Calling error_report() in a function that takes an Error ** argument
>> is suspicious.  parse_numa_node() does that, and then exit()s.  It
>> also passes &error_fatal to machine_set_cpu_numa_node().  Both wrong.
>> Attempting to configure numa when the machine doesn't support it kills
>> the VM:
>> 
>>     $ qemu-system-x86_64 -nodefaults -S -display none -M none -preconfig -qmp stdio
>>     {"QMP": {"version": {"qemu": {"micro": 50, "minor": 0, "major": 3}, "package": "v3.0.0-837-gc5e4e49258"}, "capabilities": []}}
>>     {"execute": "qmp_capabilities"}
>>     {"return": {}}
>>     {"execute": "set-numa-node", "arguments": {"type": "node"}}
>>     NUMA is not supported by this machine-type
>>     $ echo $?
>>     1
>> 
>> Messed up when commit 64c2a8f6d3f and 7c88e65d9e9 (v2.10.0) added
>> incorrect error handling right next to correct examples.  Latent bug
>> until commit f3be67812c2 (v3.0.0) made it accessible via QMP.  Fairly
>> harmless in practice, because it's limited to RUN_STATE_PRECONFIG.
>> The fix is obvious: replace error_report(); exit() by error_setg();
>> return.
>> 
>> This affects parse_numa_node()'s other caller
>> numa_complete_configuration(): since it ignores errors, the "NUMA is
>> not supported by this machine-type" is now ignored, too.  But that
>> error is as unexpected there as any other.  Change it to abort on
>> error instead.
>> 
>> Fixes: f3be67812c226162f86ce92634bd913714445420
>> Cc: Igor Mammedov <imammedo@redhat.com>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> 
>> fixup! numa: Fix QMP command set-numa-node error handling
>> ---
>>  numa.c | 13 +++++++++----
>>  1 file changed, 9 insertions(+), 4 deletions(-)
>> 
>> diff --git a/numa.c b/numa.c
>> index 81542d4ebb..1d7c49ad43 100644
>> --- a/numa.c
>> +++ b/numa.c
>> @@ -60,6 +60,7 @@ NodeInfo numa_info[MAX_NODES];
>>  static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>>                              Error **errp)
>>  {
>> +    Error *err = NULL;
>>      uint16_t nodenr;
>>      uint16List *cpus = NULL;
>>      MachineClass *mc = MACHINE_GET_CLASS(ms);
>> @@ -82,8 +83,8 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>>      }
>>  
>>      if (!mc->cpu_index_to_instance_props || !mc->get_default_cpu_node_id) {
>> -        error_report("NUMA is not supported by this machine-type");
>> -        exit(1);
>> +        error_setg(errp, "NUMA is not supported by this machine-type");
>> +        return;
>>      }
>>      for (cpus = node->cpus; cpus; cpus = cpus->next) {
>>          CpuInstanceProperties props;
>> @@ -97,7 +98,11 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
>>          props = mc->cpu_index_to_instance_props(ms, cpus->value);
>>          props.node_id = nodenr;
>>          props.has_node_id = true;
>> -        machine_set_cpu_numa_node(ms, &props, &error_fatal);
>> +        machine_set_cpu_numa_node(ms, &props, &err);
>> +        if (err) {
>> +            error_propagate(errp, err);
>> +            return;
>> +        }
>>      }
>>  
>>      if (node->has_mem && node->has_memdev) {
>> @@ -367,7 +372,7 @@ void numa_complete_configuration(MachineState *ms)
>>      if (ms->ram_slots > 0 && nb_numa_nodes == 0 &&
>>          mc->auto_enable_numa_with_memhp) {
>>              NumaNodeOptions node = { };
>> -            parse_numa_node(ms, &node, NULL);
>> +            parse_numa_node(ms, &node, &error_abort);
> it won't affect machines with numa support /i.e. no change/,
> but if machine that doesn't support numa, gets here it fine for it to die.

Uh, that could be undesirable.  Quick test:

    $ qemu-system-x86_64 -nodefaults -S -M none -numa node
    qemu-system-x86_64: -numa node: NUMA is not supported by this machine-type
    [Exit 1 ]

Stack backtrace:

    #0  0x00007fffec860b10 in _exit () at /lib64/libc.so.6
    #1  0x00007fffec7d36ea in __run_exit_handlers () at /lib64/libc.so.6
    #2  0x00007fffec7d371c in  () at /lib64/libc.so.6
    #3  0x0000555555e3cfb9 in error_handle_fatal (errp=0x55555685d8e0 <error_fatal>, err=0x555556a5cbc0) at /work/armbru/qemu/util/error.c:42
    #4  0x0000555555e3db6b in error_propagate (dst_errp=0x55555685d8e0 <error_fatal>, local_err=0x555556a5cbc0) at /work/armbru/qemu/util/error.c:288
    #5  0x000055555587e4f2 in parse_numa (opaque=0x55555693fc00, opts=0x55555692ee60, errp=0x55555685d8e0 <error_fatal>) at /work/armbru/qemu/numa.c:242
    #6  0x0000555555e4c8d1 in qemu_opts_foreach (list=0x555556647140 <qemu_numa_opts>, func=0x55555587e3cf <parse_numa>, opaque=0x55555693fc00, errp=0x55555685d8e0 <error_fatal>) at /work/armbru/qemu/util/qemu-option.c:1151
    #7  0x000055555587ed91 in parse_numa_opts (ms=0x55555693fc00)
        at /work/armbru/qemu/numa.c:447
    #8  0x0000555555a0c648 in main (argc=7, argv=0x7fffffffdf88, envp=0x7fffffffdfc8) at /work/armbru/qemu/vl.c:4454

That's before numa_complete_configuration() gets called via
machine_run_board_init().

Can you give me a hint how to "get here fine"?

>>      }
>>  
>>      assert(max_numa_nodeid <= MAX_NODES);
>
> Reviewed-by: Igor Mammedov <imammedo@redhat.com>

^ permalink raw reply	[flat|nested] 90+ messages in thread

end of thread, other threads:[~2018-10-13 16:33 UTC | newest]

Thread overview: 90+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
2018-10-08 20:32   ` Eric Blake
2018-10-11 17:25     ` Markus Armbruster
2018-10-08 22:25   ` David Gibson
2018-10-08 17:30 ` [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings Markus Armbruster
2018-10-08 20:35   ` Eric Blake
2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
2018-10-08 22:25   ` David Gibson
2018-10-09  9:56   ` Alex Bennée
2018-10-08 17:30 ` [Qemu-devel] [PATCH 04/31] vfio: " Markus Armbruster
2018-10-08 19:04   ` Alex Williamson
2018-10-08 17:30 ` [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit Markus Armbruster
2018-10-08 19:04   ` Alex Williamson
2018-10-08 17:31 ` [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such Markus Armbruster
2018-10-09  6:09   ` Philippe Mathieu-Daudé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error Markus Armbruster
2018-10-09  7:38   ` Greg Kurz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling Markus Armbruster
2018-10-09  9:15   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
2018-10-09  3:24   ` Peter Xu
2018-10-09  9:18   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
2018-10-09  9:25   ` Marc-André Lureau
2018-10-09 17:02   ` Paolo Bonzini
2018-10-08 17:31 ` [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling Markus Armbruster
2018-10-09  9:27   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting Markus Armbruster
2018-10-09  9:32   ` Marc-André Lureau
2018-10-11 17:35     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling Markus Armbruster
2018-10-09  9:47   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
2018-10-08 18:03   ` Eduardo Habkost
2018-10-11 17:38     ` Markus Armbruster
2018-10-12 14:35   ` Igor Mammedov
2018-10-13 16:33     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize() Markus Armbruster
2018-10-10 13:31   ` Anthony PERARD
2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
2018-10-09  9:53   ` Marc-André Lureau
2018-10-11 17:40     ` Markus Armbruster
2018-10-10 12:39   ` Eduardo Otubo
2018-10-08 17:31 ` [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
2018-10-09 10:11   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
2018-10-08 20:43   ` Eric Blake
2018-10-09 11:11   ` Marc-André Lureau
2018-10-09 13:25   ` Daniel P. Berrangé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
2018-10-09  6:07   ` Philippe Mathieu-Daudé
2018-10-09 11:13   ` Marc-André Lureau
2018-10-11 17:43     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
2018-10-09  6:02   ` Philippe Mathieu-Daudé
2018-10-09 11:18   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
2018-10-09  6:02   ` Philippe Mathieu-Daudé
2018-10-09 11:21   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg() Markus Armbruster
2018-10-09 11:25   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func() Markus Armbruster
2018-10-09  6:05   ` Philippe Mathieu-Daudé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
2018-10-09 11:35   ` Marc-André Lureau
2018-10-11 17:48   ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa() Markus Armbruster
2018-10-08 18:01   ` Eduardo Habkost
2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
2018-10-09 10:57   ` Philippe Mathieu-Daudé
2018-10-09 11:38   ` Marc-André Lureau
2018-10-10 19:00   ` Stefan Berger
2018-10-08 17:31 ` [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel() Markus Armbruster
2018-10-09 11:46   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
2018-10-08 20:46   ` Eric Blake
2018-10-11 17:51     ` Markus Armbruster
2018-10-09  7:45   ` Greg Kurz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
2018-10-08 20:48   ` Eric Blake
2018-10-08 21:08   ` Max Reitz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
2018-10-08 20:48   ` Eric Blake
2018-10-08 21:22   ` Max Reitz
2018-10-12  5:44     ` Markus Armbruster
2018-10-12 12:28       ` Max Reitz
2018-10-12 14:50         ` Kevin Wolf
2018-10-08 17:31 ` [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name() Markus Armbruster
2018-10-09  6:06   ` Philippe Mathieu-Daudé

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.