All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/46] Less clumsy error checking
@ 2020-06-24 16:42 Markus Armbruster
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
                   ` (46 more replies)
  0 siblings, 47 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When the Error API was created, we adopted the (unwritten) rule to
return void when the function returns no useful value on success,
unlike GError, which recommends to return true on success and false on
error then.

When a function returns a distinct error value, say false, a checked
call that passes the error up looks like

    if (!frobnicate(..., errp)) {
        handle the error...
    }

When it returns void, we need

    Error *err = NULL;

    frobnicate(..., &err);
    if (err) {
        handle the error...
        error_propagate(errp, err);
    }

Not only is this more verbose, it also creates an Error object even
when @errp is null, &error_abort or &error_fatal.

People got tired of the additional boilerplate, and started to ignore
the unwritten rule.  The result is confusion among developers about
the preferred usage.

This series adopts the GError rule (in writing), and updates a
substantial amount of code to honor the rule.  Cuts the number of
error_propagate() calls nearly by half.  The diffstat speaks for
itself.

Based on my "[PATCH v2 00/25] Error handling fixes & cleanups".  Also
available from my public repository https://repo.or.cz/qemu/armbru.git
on branch error-smooth.

Based-on: <20200624083737.3086768-1-armbru@redhat.com>

Markus Armbruster (46):
  error: Improve examples in error.h's big comment
  error: Document Error API usage rules
  qdev: Smooth error checking of qdev_realize() & friends
  macio: Tidy up error handling in macio_newworld_realize()
  virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
  error: Avoid error_propagate() when error is not used here
  error: Avoid more error_propagate() when error is not used here
  error: Avoid unnecessary error_propagate() after error_setg()
  error: Avoid error_propagate() after migrate_add_blocker()
  qemu-option: Check return value instead of @err where convenient
  qemu-option: Make uses of find_desc_by_name() more similar
  qemu-option: Factor out helper find_default_by_name()
  qemu-option: Simplify around find_default_by_name()
  qemu-option: Factor out helper opt_create()
  qemu-option: Tidy up opt_set() not to free arguments on failure
  qemu-option: Make functions taking Error ** return bool, not void
  qemu-option: Smooth error checking with Coccinelle
  qemu-option: Smooth error checking manually
  block: Avoid unnecessary error_propagate() after error_setg()
  block: Avoid error accumulation in bdrv_img_create()
  hmp: Eliminate a variable in hmp_migrate_set_parameter()
  qapi: Make visitor functions taking Error ** return bool, not void
  qapi: Smooth error checking with Coccinelle
  qapi: Smooth error checking manually
  qapi: Smooth visitor error checking in generated code
  qapi: Smooth another visitor error checking pattern
  qapi: Purge error_propagate() from QAPI core
  block/parallels: Simplify parallels_open() after previous commit
  acpi: Avoid unnecessary error_propagate() after error_setg()
  s390x/pci: Fix harmless mistake in zpci's property fid's setter
  qom: Use error_reportf_err() instead of g_printerr() in examples
  qom: Rename qdev_get_type() to object_get_type()
  qom: Crash more nicely on object_property_get_link() failure
  qom: Don't handle impossible object_property_get_link() failure
  qom: Use return values to check for error where that's simpler
  qom: Put name parameter before value / visitor parameter
  qom: Make functions taking Error ** return bool, not void
  qom: Smooth error checking with Coccinelle
  qom: Smooth error checking manually
  qom: Make functions taking Error ** return bool, not 0/-1
  qdev: Make functions taking Error ** return bool, not void
  qdev: Smooth error checking with Coccinelle
  qdev: Smooth error checking manually
  qemu-img: Ignore Error objects where the return value suffices
  qdev: Ignore Error objects where the return value suffices
  hmp: Ignore Error objects where the return value suffices

 docs/devel/qapi-code-gen.txt             | 103 ++++-----
 include/hw/audio/pcspk.h                 |   2 +-
 include/hw/qdev-properties.h             |   4 +-
 include/qapi/clone-visitor.h             |   8 +-
 include/qapi/error.h                     |  45 +++-
 include/qapi/visitor-impl.h              |  26 +--
 include/qapi/visitor.h                   | 102 +++++----
 include/qemu/option.h                    |  16 +-
 include/qom/object.h                     | 105 +++++----
 include/qom/object_interfaces.h          |  12 +-
 include/qom/qom-qobject.h                |   9 +-
 accel/kvm/kvm-all.c                      |  55 +++--
 accel/tcg/tcg-all.c                      |   5 +-
 audio/audio_legacy.c                     |  15 +-
 backends/cryptodev-vhost-user.c          |   3 +-
 backends/cryptodev.c                     |  16 +-
 backends/hostmem-file.c                  |  22 +-
 backends/hostmem-memfd.c                 |  18 +-
 backends/hostmem.c                       |  33 ++-
 backends/rng.c                           |   2 +-
 block.c                                  |  21 +-
 block/blkdebug.c                         |   9 +-
 block/blklogwrites.c                     |   4 +-
 block/blkverify.c                        |   4 +-
 block/crypto.c                           |   5 +-
 block/curl.c                             |   5 +-
 block/file-posix.c                       |  16 +-
 block/file-win32.c                       |   8 +-
 block/gluster.c                          |  17 +-
 block/iscsi.c                            |   4 +-
 block/nbd.c                              |  10 +-
 block/nfs.c                              |   7 +-
 block/parallels.c                        |  29 +--
 block/qcow.c                             |  16 +-
 block/qcow2.c                            |  21 +-
 block/qed.c                              |  10 +-
 block/quorum.c                           |  19 +-
 block/raw-format.c                       |   5 +-
 block/rbd.c                              |   7 +-
 block/replication.c                      |  19 +-
 block/sheepdog.c                         |  16 +-
 block/ssh.c                              |  11 +-
 block/throttle-groups.c                  |  31 +--
 block/throttle.c                         |   5 +-
 block/vdi.c                              |  13 +-
 block/vhdx.c                             |  15 +-
 block/vmdk.c                             |  13 +-
 block/vpc.c                              |  19 +-
 block/vvfat.c                            |  10 +-
 block/vxhs.c                             |  16 +-
 blockdev.c                               |  40 ++--
 bootdevice.c                             |   7 +-
 chardev/char.c                           |   6 +-
 contrib/ivshmem-server/main.c            |   4 +-
 crypto/secret.c                          |   2 +-
 crypto/secret_keyring.c                  |   2 +-
 crypto/tlscredsanon.c                    |   2 +-
 crypto/tlscredspsk.c                     |   2 +-
 crypto/tlscredsx509.c                    |   2 +-
 dump/dump.c                              |   7 +-
 hw/acpi/core.c                           |  19 +-
 hw/acpi/cpu_hotplug.c                    |   4 +-
 hw/acpi/ich9.c                           |   2 +-
 hw/acpi/piix4.c                          |   2 +-
 hw/arm/allwinner-a10.c                   |  27 +--
 hw/arm/armsse.c                          | 208 ++++++------------
 hw/arm/armv7m.c                          |  47 ++--
 hw/arm/aspeed.c                          |  24 +--
 hw/arm/aspeed_ast2600.c                  | 124 ++++-------
 hw/arm/aspeed_soc.c                      |  85 +++-----
 hw/arm/bcm2835_peripherals.c             |  81 ++-----
 hw/arm/bcm2836.c                         |  35 +--
 hw/arm/cubieboard.c                      |  14 +-
 hw/arm/digic.c                           |  18 +-
 hw/arm/digic_boards.c                    |   3 +-
 hw/arm/exynos4210.c                      |  13 +-
 hw/arm/fsl-imx25.c                       |  58 ++---
 hw/arm/fsl-imx31.c                       |  34 +--
 hw/arm/fsl-imx6.c                        |  85 +++-----
 hw/arm/fsl-imx6ul.c                      |  24 +--
 hw/arm/fsl-imx7.c                        |  31 ++-
 hw/arm/highbank.c                        |  12 +-
 hw/arm/integratorcp.c                    |   2 +-
 hw/arm/microbit.c                        |   4 +-
 hw/arm/mps2-tz.c                         |  31 ++-
 hw/arm/mps2.c                            |  10 +-
 hw/arm/msf2-soc.c                        |  29 +--
 hw/arm/musca.c                           |  18 +-
 hw/arm/musicpal.c                        |   4 +-
 hw/arm/nrf51_soc.c                       |  36 +---
 hw/arm/orangepi.c                        |  13 +-
 hw/arm/raspi.c                           |   2 +-
 hw/arm/realview.c                        |   6 +-
 hw/arm/sbsa-ref.c                        |  16 +-
 hw/arm/stellaris.c                       |   4 +-
 hw/arm/stm32f205_soc.c                   |  37 +---
 hw/arm/stm32f405_soc.c                   |  48 ++---
 hw/arm/versatilepb.c                     |   4 +-
 hw/arm/vexpress.c                        |   8 +-
 hw/arm/virt.c                            |  35 +--
 hw/arm/xilinx_zynq.c                     |   6 +-
 hw/arm/xlnx-versal-virt.c                |   8 +-
 hw/arm/xlnx-versal.c                     |  30 ++-
 hw/arm/xlnx-zcu102.c                     |   8 +-
 hw/arm/xlnx-zynqmp.c                     | 117 ++++------
 hw/block/fdc.c                           |  12 +-
 hw/block/xen-block.c                     |  30 +--
 hw/char/serial-pci-multi.c               |   5 +-
 hw/char/serial-pci.c                     |   5 +-
 hw/char/serial.c                         |  10 +-
 hw/core/bus.c                            |  12 +-
 hw/core/cpu.c                            |   3 +-
 hw/core/machine.c                        |   5 +-
 hw/core/numa.c                           |  55 ++---
 hw/core/platform-bus.c                   |   5 +-
 hw/core/qdev-properties-system.c         |  32 +--
 hw/core/qdev-properties.c                |  93 +++-----
 hw/core/qdev.c                           |  14 +-
 hw/cpu/a15mpcore.c                       |   5 +-
 hw/cpu/a9mpcore.c                        |  21 +-
 hw/cpu/arm11mpcore.c                     |  17 +-
 hw/cpu/core.c                            |  10 +-
 hw/cpu/realview_mpcore.c                 |   9 +-
 hw/display/bcm2835_fb.c                  |   8 +-
 hw/display/virtio-gpu-base.c             |   5 +-
 hw/display/virtio-gpu-pci.c              |  11 +-
 hw/display/virtio-vga.c                  |  10 +-
 hw/dma/bcm2835_dma.c                     |   9 +-
 hw/dma/sparc32_dma.c                     |   6 +-
 hw/dma/xilinx_axidma.c                   |   4 +-
 hw/gpio/aspeed_gpio.c                    |   5 +-
 hw/gpio/bcm2835_gpio.c                   |  15 +-
 hw/hyperv/vmbus.c                        |   5 +-
 hw/i386/pc.c                             |  48 ++---
 hw/i386/pc_piix.c                        |   4 +-
 hw/i386/pc_q35.c                         |  28 +--
 hw/i386/x86.c                            |   2 +-
 hw/ide/qdev.c                            |   7 +-
 hw/intc/apic_common.c                    |   5 +-
 hw/intc/arm_gic_kvm.c                    |   4 +-
 hw/intc/arm_gicv3_its_kvm.c              |   4 +-
 hw/intc/arm_gicv3_kvm.c                  |   4 +-
 hw/intc/armv7m_nvic.c                    |   9 +-
 hw/intc/nios2_iic.c                      |   8 +-
 hw/intc/pnv_xive.c                       |  17 +-
 hw/intc/realview_gic.c                   |   5 +-
 hw/intc/spapr_xive.c                     |  17 +-
 hw/intc/xics.c                           |   9 +-
 hw/intc/xics_kvm.c                       |   3 +-
 hw/intc/xive.c                           |   7 +-
 hw/isa/piix4.c                           |   5 +-
 hw/m68k/q800.c                           |   4 +-
 hw/mem/nvdimm.c                          |  30 +--
 hw/mem/pc-dimm.c                         |  18 +-
 hw/microblaze/petalogix_ml605_mmu.c      |  24 +--
 hw/microblaze/petalogix_s3adsp1800_mmu.c |   2 +-
 hw/microblaze/xlnx-zynqmp-pmu.c          |  39 ++--
 hw/mips/boston.c                         |   4 +-
 hw/mips/cps.c                            |  41 ++--
 hw/mips/jazz.c                           |   4 +-
 hw/mips/malta.c                          |   4 +-
 hw/misc/aspeed_sdmc.c                    |   8 +-
 hw/misc/bcm2835_mbox.c                   |   9 +-
 hw/misc/bcm2835_property.c               |  17 +-
 hw/misc/iotkit-sysctl.c                  |   2 +-
 hw/misc/ivshmem.c                        |   4 +-
 hw/misc/macio/cuda.c                     |   5 +-
 hw/misc/macio/macio.c                    |  35 ++-
 hw/misc/macio/pmu.c                      |   5 +-
 hw/misc/pca9552.c                        |   5 +-
 hw/misc/tmp105.c                         |   5 +-
 hw/misc/tmp421.c                         |   5 +-
 hw/net/ne2000-isa.c                      |   7 +-
 hw/net/virtio-net.c                      |   7 +-
 hw/net/xilinx_axienet.c                  |   4 +-
 hw/pci-host/pnv_phb3.c                   |  33 ++-
 hw/pci-host/pnv_phb4.c                   |   9 +-
 hw/pci-host/pnv_phb4_pec.c               |   9 +-
 hw/pci-host/prep.c                       |   4 +-
 hw/ppc/e500.c                            |   5 +-
 hw/ppc/mac_newworld.c                    |  10 +-
 hw/ppc/mac_oldworld.c                    |   4 +-
 hw/ppc/pnv.c                             | 171 +++++++--------
 hw/ppc/pnv_core.c                        |   4 +-
 hw/ppc/pnv_psi.c                         |  22 +-
 hw/ppc/rs6000_mc.c                       |   9 +-
 hw/ppc/spapr.c                           |  77 +++----
 hw/ppc/spapr_caps.c                      |  15 +-
 hw/ppc/spapr_cpu_core.c                  |   3 +-
 hw/ppc/spapr_drc.c                       |  16 +-
 hw/ppc/spapr_hcall.c                     |   3 +-
 hw/ppc/spapr_irq.c                       |  11 +-
 hw/ppc/spapr_pci.c                       |  16 +-
 hw/ppc/spapr_pci_nvlink2.c               |   8 +-
 hw/riscv/opentitan.c                     |  13 +-
 hw/riscv/sifive_e.c                      |  10 +-
 hw/riscv/sifive_u.c                      |  11 +-
 hw/riscv/spike.c                         |   4 +-
 hw/riscv/virt.c                          |   4 +-
 hw/rx/rx-gdbsim.c                        |  12 +-
 hw/s390x/css.c                           |   5 +-
 hw/s390x/event-facility.c                |  13 +-
 hw/s390x/ipl.c                           |  27 ++-
 hw/s390x/s390-pci-bus.c                  |  14 +-
 hw/s390x/s390-skeys.c                    |   2 +-
 hw/s390x/s390-stattrib.c                 |   2 +-
 hw/s390x/s390-virtio-ccw.c               |  20 +-
 hw/s390x/sclp.c                          |  13 +-
 hw/s390x/virtio-ccw-crypto.c             |  10 +-
 hw/s390x/virtio-ccw-rng.c                |   8 +-
 hw/scsi/scsi-bus.c                       |  15 +-
 hw/scsi/vhost-scsi.c                     |   4 +-
 hw/sd/aspeed_sdhci.c                     |  15 +-
 hw/sd/sd.c                               |   3 +-
 hw/sd/ssi-sd.c                           |  11 +-
 hw/smbios/smbios.c                       |  33 +--
 hw/sparc/sun4m.c                         |   2 +-
 hw/sparc64/sun4u.c                       |   2 +-
 hw/tpm/tpm_util.c                        |   5 +-
 hw/usb/bus.c                             |   7 +-
 hw/usb/dev-storage.c                     |   9 +-
 hw/usb/hcd-dwc2.c                        |   9 +-
 hw/vfio/pci-quirks.c                     |   5 +-
 hw/vfio/pci.c                            |  10 +-
 hw/virtio/virtio-balloon.c               |  17 +-
 hw/virtio/virtio-crypto-pci.c            |   9 +-
 hw/virtio/virtio-iommu-pci.c             |   4 +-
 hw/virtio/virtio-pmem-pci.c              |   2 +-
 hw/virtio/virtio-rng-pci.c               |   8 +-
 hw/virtio/virtio-rng.c                   |  10 +-
 hw/xen/xen_pt_config_init.c              |   3 +-
 iothread.c                               |  18 +-
 linux-user/syscall.c                     |   2 +-
 monitor/hmp-cmds.c                       |  11 +-
 monitor/monitor.c                        |  21 +-
 net/colo-compare.c                       |  26 +--
 net/dump.c                               |  13 +-
 net/filter-buffer.c                      |  13 +-
 net/filter.c                             |   2 +-
 net/net.c                                |  10 +-
 qapi/opts-visitor.c                      |  58 ++---
 qapi/qapi-clone-visitor.c                |  33 +--
 qapi/qapi-dealloc-visitor.c              |  27 ++-
 qapi/qapi-visit-core.c                   | 197 +++++++++--------
 qapi/qobject-input-visitor.c             | 109 ++++++----
 qapi/qobject-output-visitor.c            |  27 ++-
 qapi/string-input-visitor.c              |  67 +++---
 qapi/string-output-visitor.c             |  32 +--
 qdev-monitor.c                           |  38 ++--
 qemu-img.c                               |  23 +-
 qga/commands-win32.c                     |  19 +-
 qom/object.c                             | 221 +++++++++----------
 qom/object_interfaces.c                  |  30 +--
 qom/qom-hmp-cmds.c                       |   2 +-
 qom/qom-qmp-cmds.c                       |   2 +-
 qom/qom-qobject.c                        |  14 +-
 softmmu/vl.c                             |  17 +-
 target/arm/cpu64.c                       |  15 +-
 target/arm/monitor.c                     |   7 +-
 target/i386/cpu.c                        |  98 +++------
 target/ppc/compat.c                      |   5 +-
 target/ppc/translate_init.inc.c          |   2 +-
 target/s390x/cpu_models.c                |  17 +-
 target/sparc/cpu.c                       |   5 +-
 tpm.c                                    |   5 +-
 ui/console.c                             |   4 +-
 ui/vnc.c                                 |   2 +-
 util/main-loop.c                         |   4 +-
 util/qemu-config.c                       |  25 +--
 util/qemu-option.c                       | 261 ++++++++++++-----------
 scripts/qapi/commands.py                 |  22 +-
 scripts/qapi/visit.py                    | 107 ++++------
 272 files changed, 2312 insertions(+), 3460 deletions(-)

-- 
2.26.2



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

* [PATCH 01/46] error: Improve examples in error.h's big comment
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
@ 2020-06-24 16:42 ` Markus Armbruster
  2020-06-24 16:59   ` Eric Blake
                     ` (2 more replies)
  2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
                   ` (45 subsequent siblings)
  46 siblings, 3 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Show errp instead of &err where &err is actually unusual.  Add a
missing declaration.  Add a second error pileup example.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qapi/error.h | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index ad5b6e896d..1a5ea25e12 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -16,15 +16,15 @@
  * Error reporting system loosely patterned after Glib's GError.
  *
  * Create an error:
- *     error_setg(&err, "situation normal, all fouled up");
+ *     error_setg(errp, "situation normal, all fouled up");
  *
  * Create an error and add additional explanation:
- *     error_setg(&err, "invalid quark");
- *     error_append_hint(&err, "Valid quarks are up, down, strange, "
+ *     error_setg(errp, "invalid quark");
+ *     error_append_hint(errp, "Valid quarks are up, down, strange, "
  *                       "charm, top, bottom.\n");
  *
  * Do *not* contract this to
- *     error_setg(&err, "invalid quark\n"
+ *     error_setg(errp, "invalid quark\n" // WRONG!
  *                "Valid quarks are up, down, strange, charm, top, bottom.");
  *
  * Report an error to the current monitor if we have one, else stderr:
@@ -108,12 +108,23 @@
  *     }
  *
  * Do *not* "optimize" this to
+ *     Error *err = NULL;
  *     foo(arg, &err);
  *     bar(arg, &err); // WRONG!
  *     if (err) {
  *         handle the error...
  *     }
  * because this may pass a non-null err to bar().
+ *
+ * Likewise, do *not*
+ *     Error *err = NULL;
+ *     if (cond1) {
+ *         error_setg(err, ...);
+ *     }
+ *     if (cond2) {
+ *         error_setg(err, ...); // WRONG!
+ *     }
+ * because this may pass a non-null err to error_setg().
  */
 
 #ifndef ERROR_H
-- 
2.26.2



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

* [PATCH 02/46] error: Document Error API usage rules
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 17:51   ` Eric Blake
                     ` (2 more replies)
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
                   ` (44 subsequent siblings)
  46 siblings, 3 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

This merely codifies existing practice, with one exception: the rule
advising against returning void, where existing practice is mixed.

When the Error API was created, we adopted the (unwritten) rule to
return void when the function returns no useful value on success,
unlike GError, which recommends to return true on success and false on
error then.

When a function returns a distinct error value, say false, a checked
call that passes the error up looks like

    if (!frobnicate(..., errp)) {
        handle the error...
    }

When it returns void, we need

    Error *err = NULL;

    frobnicate(..., &err);
    if (err) {
        handle the error...
        error_propagate(errp, err);
    }

Not only is this more verbose, it also creates an Error object even
when @errp is null, &error_abort or &error_fatal.

People got tired of the additional boilerplate, and started to ignore
the unwritten rule.  The result is confusion among developers about
the preferred usage.

The written rule will hopefully reduce the confusion.

The remainder of this series will update a substantial amount of code
to honor the rule.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qapi/error.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index 1a5ea25e12..c3d84d610a 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -15,6 +15,32 @@
 /*
  * Error reporting system loosely patterned after Glib's GError.
  *
+ * Rules:
+ *
+ * - Functions that use Error to report errors have an Error **errp
+ *   parameter.  It should be the last parameter, except for functions
+ *   taking variable arguments.
+ *
+ * - You may pass NULL to not receive the error, &error_abort to abort
+ *   on error, &error_fatal to exit(1) on error, or a pointer to a
+ *   variable containing NULL to receive the error.
+ *
+ * - The value of @errp should not affect control flow.
+ *
+ * - On success, the function should not use @errp.  On failure, it
+ *   should set a new error, e.g. with error_setg(errp, ...), or
+ *   propagate an existing one, e.g. with error_propagate(errp, ...).
+ *
+ * - Whenever practical, also return a value that indicates success /
+ *   failure.  This can make the error checking more concise, and can
+ *   avoid useless error object creation and destruction.  Note that
+ *   we still have many functions returning void.  We recommend
+ *   • bool-valued functions return true on success / false on failure,
+ *   • pointer-valued functions return non-null / null pointer, and
+ *   • integer-valued functions return non-negative / negative.
+ *
+ * How to:
+ *
  * Create an error:
  *     error_setg(errp, "situation normal, all fouled up");
  *
-- 
2.26.2



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

* [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
  2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 18:03   ` Eric Blake
                     ` (3 more replies)
  2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
                   ` (43 subsequent siblings)
  46 siblings, 4 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Convert

    foo(..., &err);
    if (err) {
        ...
    }

to

    if (!foo(..., &err)) {
        ...
    }

for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
wrappers isa_realize_and_unref(), pci_realize_and_unref(),
sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
Coccinelle script:

    @@
    identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
ARMSSE being used both as typedef and function-like macro there.
Convert manually.

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Clean up whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/arm/allwinner-a10.c          |  21 ++-----
 hw/arm/armsse.c                 | 104 ++++++++------------------------
 hw/arm/armv7m.c                 |  12 +---
 hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
 hw/arm/aspeed_soc.c             |  60 +++++-------------
 hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
 hw/arm/bcm2836.c                |  12 +---
 hw/arm/cubieboard.c             |   3 +-
 hw/arm/digic.c                  |  12 +---
 hw/arm/digic_boards.c           |   3 +-
 hw/arm/fsl-imx25.c              |  44 ++++----------
 hw/arm/fsl-imx31.c              |  32 +++-------
 hw/arm/fsl-imx6.c               |  48 ++++-----------
 hw/arm/msf2-soc.c               |  21 ++-----
 hw/arm/nrf51_soc.c              |  24 ++------
 hw/arm/stm32f205_soc.c          |  29 +++------
 hw/arm/stm32f405_soc.c          |  32 +++-------
 hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
 hw/block/fdc.c                  |   4 +-
 hw/block/xen-block.c            |   3 +-
 hw/char/serial-pci-multi.c      |   5 +-
 hw/char/serial-pci.c            |   5 +-
 hw/char/serial.c                |  10 +--
 hw/core/cpu.c                   |   3 +-
 hw/cpu/a15mpcore.c              |   5 +-
 hw/cpu/a9mpcore.c               |  21 ++-----
 hw/cpu/arm11mpcore.c            |  17 ++----
 hw/cpu/realview_mpcore.c        |   9 +--
 hw/display/virtio-gpu-pci.c     |   6 +-
 hw/display/virtio-vga.c         |   5 +-
 hw/intc/armv7m_nvic.c           |   9 +--
 hw/intc/pnv_xive.c              |   8 +--
 hw/intc/realview_gic.c          |   5 +-
 hw/intc/spapr_xive.c            |   8 +--
 hw/intc/xics.c                  |   5 +-
 hw/intc/xive.c                  |   3 +-
 hw/isa/piix4.c                  |   5 +-
 hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
 hw/mips/cps.c                   |  17 ++----
 hw/misc/macio/cuda.c            |   5 +-
 hw/misc/macio/macio.c           |  25 ++------
 hw/misc/macio/pmu.c             |   5 +-
 hw/pci-host/pnv_phb3.c          |  13 +---
 hw/pci-host/pnv_phb4.c          |   5 +-
 hw/pci-host/pnv_phb4_pec.c      |   5 +-
 hw/ppc/e500.c                   |   5 +-
 hw/ppc/pnv.c                    |  53 ++++------------
 hw/ppc/pnv_core.c               |   4 +-
 hw/ppc/pnv_psi.c                |   9 +--
 hw/ppc/spapr_cpu_core.c         |   3 +-
 hw/ppc/spapr_irq.c              |   5 +-
 hw/riscv/opentitan.c            |   9 +--
 hw/riscv/sifive_e.c             |   6 +-
 hw/riscv/sifive_u.c             |   5 +-
 hw/s390x/event-facility.c       |  13 ++--
 hw/s390x/s390-pci-bus.c         |   3 +-
 hw/s390x/sclp.c                 |   3 +-
 hw/s390x/virtio-ccw-crypto.c    |   5 +-
 hw/s390x/virtio-ccw-rng.c       |   5 +-
 hw/scsi/scsi-bus.c              |   4 +-
 hw/sd/aspeed_sdhci.c            |   4 +-
 hw/sd/ssi-sd.c                  |   3 +-
 hw/usb/bus.c                    |   3 +-
 hw/virtio/virtio-rng-pci.c      |   5 +-
 qdev-monitor.c                  |   3 +-
 65 files changed, 248 insertions(+), 768 deletions(-)

diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 52e0d83760..3e45aa4141 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -72,17 +72,12 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
 {
     AwA10State *s = AW_A10(dev);
     SysBusDevice *sysbusdev;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->intc);
@@ -93,9 +88,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
     qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->timer);
@@ -117,18 +110,14 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
         qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
         qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
         return;
     }
     sysbusdev = SYS_BUS_DEVICE(&s->emac);
     sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
     sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index e2cf43ee0b..b306d95538 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -566,9 +566,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
                                  "memory", &error_abort);
         object_property_set_link(cpuobj, OBJECT(s), "idau", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(cpuobj), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(cpuobj), errp)) {
             return;
         }
         /*
@@ -577,9 +575,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
          * CPU must exist and have been parented into the cluster before
          * the cluster is realized.
          */
-        qdev_realize(DEVICE(&s->cluster[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cluster[i]), NULL, errp)) {
             return;
         }
 
@@ -613,9 +609,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                     error_propagate(errp, err);
                     return;
                 }
-                qdev_realize(DEVICE(splitter), NULL, &err);
-                if (err) {
-                    error_propagate(errp, err);
+                if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
                     return;
                 }
                 for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
@@ -646,9 +640,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* Security controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->secctl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->secctl), errp)) {
         return;
     }
     sbd_secctl = SYS_BUS_DEVICE(&s->secctl);
@@ -669,9 +661,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, errp)) {
         return;
     }
     dev_splitter = DEVICE(&s->sec_resp_splitter);
@@ -693,9 +683,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         }
         object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
                                  "downstream", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), errp)) {
             return;
         }
         /* Map the upstream end of the MPC into the right place... */
@@ -716,9 +704,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
@@ -735,9 +721,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * map its upstream ends to the right place in the container.
      */
     qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
@@ -747,9 +731,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer1), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
@@ -759,9 +741,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
@@ -785,9 +765,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             int cpunum;
             SysBusDevice *mhu_sbd = SYS_BUS_DEVICE(&s->mhu[i]);
 
-            sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), errp)) {
                 return;
             }
             port = g_strdup_printf("port[%d]", i + 3);
@@ -812,9 +790,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         }
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), errp)) {
         return;
     }
 
@@ -861,9 +837,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
@@ -884,9 +858,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_string(DEVICE(&s->cachectrl[i]), "name", name);
             g_free(name);
             qdev_prop_set_uint64(DEVICE(&s->cachectrl[i]), "size", 0x1000);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), errp)) {
                 return;
             }
 
@@ -902,9 +874,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             qdev_prop_set_string(DEVICE(&s->cpusecctrl[i]), "name", name);
             g_free(name);
             qdev_prop_set_uint64(DEVICE(&s->cpusecctrl[i]), "size", 0x1000);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), errp)) {
                 return;
             }
 
@@ -917,9 +887,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             MemoryRegion *mr;
 
             qdev_prop_set_uint32(DEVICE(&s->cpuid[i]), "CPUID", i);
-            sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), errp)) {
                 return;
             }
 
@@ -933,9 +901,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      *   0x4002f000: S32K timer
      */
     qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
-    sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
@@ -944,9 +910,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]",
                              &error_abort);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), errp)) {
         return;
     }
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->apb_ppc1), 0);
@@ -982,9 +946,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), errp)) {
         return;
     }
     /* System information registers */
@@ -998,9 +960,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                             "INITSVTOR0_RST", &error_abort);
     object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
                             "INITSVTOR1_RST", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctl), 0, 0x50021000);
@@ -1033,18 +993,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(&s->nmi_orgate), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->nmi_orgate), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
                           qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
 
     qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
-    sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32kwatchdog), 0,
@@ -1054,9 +1010,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     /* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
 
     qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->nswatchdog), 0,
@@ -1064,9 +1018,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
 
     qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->swatchdog), 0,
@@ -1081,9 +1033,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        qdev_realize(DEVICE(splitter), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
             return;
         }
     }
@@ -1128,9 +1078,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        qdev_realize(DEVICE(splitter), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
             return;
         }
 
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 3308211e9c..5d6bded386 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -213,16 +213,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
     s->cpu->env.nvic = &s->nvic;
     s->nvic.cpu = s->cpu;
 
-    qdev_realize(DEVICE(s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s->cpu), NULL, errp)) {
         return;
     }
 
     /* Note that we must realize the NVIC after the CPU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->nvic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvic), errp)) {
         return;
     }
 
@@ -254,9 +250,7 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
             }
             object_property_set_link(obj, OBJECT(s->board_memory),
                                      "source-memory", &error_abort);
-            sysbus_realize(SYS_BUS_DEVICE(obj), &err);
-            if (err != NULL) {
-                error_propagate(errp, err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
 
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index 59a7a1370b..aa02755d3f 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -259,9 +259,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
          * is needed when using -kernel
          */
 
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -301,17 +299,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                                 sc->memmap[ASPEED_SRAM], &s->sram);
 
     /* SCU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
 
     /* RTC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
@@ -321,9 +315,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     /* Timer */
     object_property_set_link(OBJECT(&s->timerctrl),
                              OBJECT(&s->scu), "scu", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
@@ -343,9 +335,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     /* I2C */
     object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
@@ -368,9 +358,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
@@ -385,9 +373,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                                  "dram", &error_abort);
         object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
@@ -398,9 +384,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
     /* EHCI */
     for (i = 0; i < sc->ehcis_num; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
@@ -410,9 +394,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* SDMC - SDRAM Memory Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
@@ -423,9 +405,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->wdt[i]),
                                  OBJECT(&s->scu), "scu", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
@@ -436,9 +416,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->macs_num; i++) {
         object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
@@ -448,9 +426,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->mii[i]), OBJECT(&s->ftgmac100[i]),
                                  "nic", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
             return;
         }
 
@@ -459,9 +435,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* XDMA */
-    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
@@ -470,18 +444,14 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_XDMA));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
                        aspeed_soc_get_irq(s, ASPEED_GPIO));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio_1_8v), 0,
@@ -490,9 +460,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_GPIO_1_8V));
 
     /* SDHCI */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
@@ -501,9 +469,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_SDHCI));
 
     /* eMMC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->emmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_EMMC]);
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 311458aa76..6faffc13cc 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -230,9 +230,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* CPU */
     for (i = 0; i < sc->num_cpus; i++) {
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -248,17 +246,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                                 sc->memmap[ASPEED_SRAM], &s->sram);
 
     /* SCU */
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
 
     /* VIC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->vic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]);
@@ -268,9 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
     /* RTC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
@@ -280,9 +272,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     /* Timer */
     object_property_set_link(OBJECT(&s->timerctrl),
                              OBJECT(&s->scu), "scu", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
@@ -302,9 +292,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     /* I2C */
     object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
@@ -320,9 +308,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
@@ -335,9 +321,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->spis_num; i++) {
         object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
@@ -348,9 +332,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* EHCI */
     for (i = 0; i < sc->ehcis_num; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
@@ -360,9 +342,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 
     /* SDMC - SDRAM Memory Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
@@ -373,9 +353,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
         object_property_set_link(OBJECT(&s->wdt[i]),
                                  OBJECT(&s->scu), "scu", &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
@@ -386,9 +364,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->macs_num; i++) {
         object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
@@ -398,9 +374,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 
     /* XDMA */
-    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
@@ -409,9 +383,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_XDMA));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
@@ -419,9 +391,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_GPIO));
 
     /* SDHCI */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 7ffdf62067..8313410ffe 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -161,9 +161,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     }
 
     /* Interrupt Controller */
-    sysbus_realize(SYS_BUS_DEVICE(&s->ic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ic), errp)) {
         return;
     }
 
@@ -172,9 +170,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     sysbus_pass_irq(SYS_BUS_DEVICE(s), SYS_BUS_DEVICE(&s->ic));
 
     /* Sys Timer */
-    sysbus_realize(SYS_BUS_DEVICE(&s->systmr), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systmr), errp)) {
         return;
     }
     memory_region_add_subregion(&s->peri_mr, ST_OFFSET,
@@ -185,9 +181,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
 
     /* UART0 */
     qdev_prop_set_chr(DEVICE(&s->uart0), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart0), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart0), errp)) {
         return;
     }
 
@@ -200,9 +194,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     /* AUX / UART1 */
     qdev_prop_set_chr(DEVICE(&s->aux), "chardev", serial_hd(1));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->aux), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->aux), errp)) {
         return;
     }
 
@@ -213,9 +205,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_AUX));
 
     /* Mailboxes */
-    sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), errp)) {
         return;
     }
 
@@ -239,9 +229,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->fb), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fb), errp)) {
         return;
     }
 
@@ -251,9 +239,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                        qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_FB));
 
     /* Property channel */
-    sysbus_realize(SYS_BUS_DEVICE(&s->property), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->property), errp)) {
         return;
     }
 
@@ -264,9 +250,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                       qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_PROPERTY));
 
     /* Random Number Generator */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
         return;
     }
 
@@ -289,9 +273,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
     }
 
@@ -302,9 +284,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_ARASANSDIO));
 
     /* SDHOST */
-    sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), errp)) {
         return;
     }
 
@@ -315,9 +295,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_SDIO));
 
     /* DMA Channels */
-    sysbus_realize(SYS_BUS_DEVICE(&s->dma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp)) {
         return;
     }
 
@@ -334,18 +312,14 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     }
 
     /* THERMAL */
-    sysbus_realize(SYS_BUS_DEVICE(&s->thermal), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->thermal), errp)) {
         return;
     }
     memory_region_add_subregion(&s->peri_mr, THERMAL_OFFSET,
                 sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->thermal), 0));
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
@@ -355,9 +329,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->gpio), "sd-bus");
 
     /* Mphi */
-    sysbus_realize(SYS_BUS_DEVICE(&s->mphi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mphi), errp)) {
         return;
     }
 
@@ -368,9 +340,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
                                INTERRUPT_HOSTPORT));
 
     /* DWC2 */
-    sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), errp)) {
         return;
     }
 
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index ed1793f7b7..51d156f0c5 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -86,9 +86,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
 
     object_property_add_const_link(OBJECT(&s->peripherals), "ram", obj);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), errp)) {
         return;
     }
 
@@ -99,9 +97,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
                             info->peri_base, 1);
 
     /* bcm2836 interrupt controller (and mailboxes, etc.) */
-    sysbus_realize(SYS_BUS_DEVICE(&s->control), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->control), errp)) {
         return;
     }
 
@@ -133,9 +129,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
             return;
         }
 
-        qdev_realize(DEVICE(&s->cpu[n].core), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[n].core), NULL, errp)) {
             return;
         }
 
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 5cbd115c53..c720e24ced 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -80,8 +80,7 @@ static void cubieboard_init(MachineState *machine)
         exit(1);
     }
 
-    qdev_realize(DEVICE(a10), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(a10), NULL, &err)) {
         error_reportf_err(err, "Couldn't realize Allwinner A10: ");
         exit(1);
     }
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index 13a83f7430..9fbb2258c9 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -62,16 +62,12 @@ static void digic_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
     for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
 
@@ -80,9 +76,7 @@ static void digic_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
 
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index b6452d918c..d5524d3e72 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -62,8 +62,7 @@ static void digic4_board_init(MachineState *machine, DigicBoard *board)
         exit(EXIT_FAILURE);
     }
 
-    qdev_realize(DEVICE(s), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(s), NULL, &err)) {
         error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
         exit(1);
     }
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index 7ab5c98fbe..f5418c8c12 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -85,15 +85,11 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     uint8_t i;
     Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
@@ -102,9 +98,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);
@@ -124,9 +118,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
@@ -149,9 +141,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->gpt[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
@@ -172,9 +162,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
@@ -185,18 +173,14 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
 
     qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->fec), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->fec), 0,
                        qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_FEC_IRQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->rngc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rngc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rngc), 0, FSL_IMX25_RNGC_ADDR);
@@ -214,9 +198,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
@@ -237,9 +219,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
@@ -267,9 +247,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
         object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
                                  "vendor",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index 42cca529c3..8326f5ff81 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -66,15 +66,11 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
     uint16_t i;
     Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX31_AVIC_ADDR);
@@ -83,9 +79,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
                        qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX31_CCM_ADDR);
@@ -102,9 +96,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
 
@@ -116,9 +108,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
         return;
     }
 
@@ -138,9 +128,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
 
@@ -162,9 +150,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the I2C */
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
         /* Map I2C memory */
@@ -188,9 +174,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
 
         object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 4ae3c3efc2..4c2da277ec 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -130,9 +130,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                      "start-powered-off", &error_abort);
         }
 
-        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -144,9 +142,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                             FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
                             &error_abort);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
@@ -158,16 +154,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                            qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6_CCM_ADDR);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->src), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->src), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6_SRC_ADDR);
@@ -187,9 +179,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
 
@@ -201,9 +191,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
     s->gpt.ccm = IMX_CCM(&s->ccm);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
         return;
     }
 
@@ -224,9 +212,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         s->epit[i].ccm = IMX_CCM(&s->ccm);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
             return;
         }
 
@@ -247,9 +233,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             { FSL_IMX6_I2C3_ADDR, FSL_IMX6_I2C3_IRQ }
         };
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
             return;
         }
 
@@ -307,9 +291,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
                                  &error_abort);
         object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
 
@@ -343,9 +325,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
                                  "vendor",
                                  &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
@@ -390,9 +370,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         };
 
         /* Initialize the SPI */
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -403,9 +381,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
     }
 
     qdev_set_nic_properties(DEVICE(&s->eth), &nd_table[0]);
-    sysbus_realize(SYS_BUS_DEVICE(&s->eth), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->eth), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index 3235c76194..b6143fba92 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -93,7 +93,6 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     MSF2State *s = MSF2_SOC(dev_soc);
     DeviceState *dev, *armv7m;
     SysBusDevice *busdev;
-    Error *err = NULL;
     int i;
 
     MemoryRegion *system_memory = get_system_memory();
@@ -125,9 +124,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
@@ -153,9 +150,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->timer);
     /* APB0 clock is the timer input clock */
     qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
-    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -168,9 +163,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->sysreg);
     qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
     qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -179,9 +172,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < MSF2_NUM_SPIS; i++) {
         gchar *bus_name;
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -199,9 +190,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     dev = DEVICE(&s->emac);
     object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
                              "ahb-bus", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index 20dd8b5897..a398bdfab8 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -67,9 +67,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
 
     object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->cpu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
         return;
     }
 
@@ -84,9 +82,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
     memory_region_add_subregion(&s->container, NRF51_SRAM_BASE, &s->sram);
 
     /* UART */
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0);
@@ -96,9 +92,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
                        BASE_TO_IRQ(NRF51_UART_BASE)));
 
     /* RNG */
-    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
         return;
     }
 
@@ -116,9 +110,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
         return;
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->nvm), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvm), errp)) {
         return;
     }
 
@@ -132,9 +124,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
     memory_region_add_subregion_overlap(&s->container, NRF51_FLASH_BASE, mr, 0);
 
     /* GPIO */
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
@@ -151,9 +141,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
 
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index 56aef686c9..5b008722e5 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -81,7 +81,6 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     STM32F205State *s = STM32F205_SOC(dev_soc);
     DeviceState *dev, *armv7m;
     SysBusDevice *busdev;
-    Error *err = NULL;
     int i;
 
     MemoryRegion *system_memory = get_system_memory();
@@ -107,17 +106,13 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
     /* System configuration controller */
     dev = DEVICE(&s->syscfg);
-    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -128,9 +123,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_USARTS; i++) {
         dev = DEVICE(&(s->usart[i]));
         qdev_prop_set_chr(dev, "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -142,9 +135,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_TIMERS; i++) {
         dev = DEVICE(&(s->timer[i]));
         qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -155,9 +146,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     /* ADC 1 to 3 */
     object_property_set_int(OBJECT(s->adc_irqs), STM_NUM_ADCS,
                             "num-lines", &error_abort);
-    qdev_realize(DEVICE(s->adc_irqs), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s->adc_irqs), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(s->adc_irqs), 0,
@@ -165,9 +154,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
 
     for (i = 0; i < STM_NUM_ADCS; i++) {
         dev = DEVICE(&(s->adc[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -179,9 +166,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     /* SPI 1 and 2 */
     for (i = 0; i < STM_NUM_SPIS; i++) {
         dev = DEVICE(&(s->spi[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index cf9228d8e7..48b7181665 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -118,17 +118,13 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
     object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
                                      "memory", &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
 
     /* System configuration controller */
     dev = DEVICE(&s->syscfg);
-    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
@@ -139,9 +135,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_USARTS; i++) {
         dev = DEVICE(&(s->usart[i]));
         qdev_prop_set_chr(dev, "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -153,9 +147,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     for (i = 0; i < STM_NUM_TIMERS; i++) {
         dev = DEVICE(&(s->timer[i]));
         qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
-        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -173,9 +165,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     }
     object_property_set_int(OBJECT(&s->adc_irqs), STM_NUM_ADCS,
                             "num-lines", &error_abort);
-    qdev_realize(DEVICE(&s->adc_irqs), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->adc_irqs), NULL, errp)) {
         return;
     }
     qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
@@ -183,9 +173,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
 
     for (i = 0; i < STM_NUM_ADCS; i++) {
         dev = DEVICE(&(s->adc[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -197,9 +185,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     /* SPI devices */
     for (i = 0; i < STM_NUM_SPIS; i++) {
         dev = DEVICE(&(s->spi[i]));
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
         busdev = SYS_BUS_DEVICE(dev);
@@ -209,9 +195,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
 
     /* EXTI device */
     dev = DEVICE(&s->exti);
-    sysbus_realize(SYS_BUS_DEVICE(&s->exti), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->exti), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(dev);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 1de9d4a89d..33e63a2c4e 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -176,7 +176,6 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
 static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
                                    const char *boot_cpu, Error **errp)
 {
-    Error *err = NULL;
     int i;
     int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS,
                        XLNX_ZYNQMP_NUM_RPU_CPUS);
@@ -209,9 +208,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
 
         object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
                                  &error_abort);
-        qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, errp)) {
             return;
         }
     }
@@ -367,16 +364,12 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
                                 "reset-cbar", &error_abort);
         object_property_set_int(OBJECT(&s->apu_cpu[i]), num_apus,
                                 "core-count", &error_abort);
-        qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, errp)) {
             return;
         }
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -470,9 +463,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
                                 &error_abort);
         object_property_set_int(OBJECT(&s->gem[i]), 2, "num-priority-queues",
                                 &error_abort);
-        sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem[i]), 0, gem_addr[i]);
@@ -482,9 +473,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
         qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
-        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
             return;
         }
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, uart_addr[i]);
@@ -494,9 +483,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
 
     object_property_set_int(OBJECT(&s->sata), SATA_NUM_PORTS, "num-ports",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
         return;
     }
 
@@ -528,9 +515,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(sdhci), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(sdhci), errp)) {
             return;
         }
         sysbus_mmio_map(sbd, 0, sdhci_addr[i]);
@@ -545,9 +530,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < XLNX_ZYNQMP_NUM_SPIS; i++) {
         gchar *bus_name;
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
 
@@ -562,9 +545,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
         g_free(bus_name);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->qspi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
@@ -584,17 +565,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
         g_free(target_bus);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->dp), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dp), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->dp), 0, DP_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dp), 0, gic_spi[DP_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), errp)) {
         return;
     }
     object_property_set_link(OBJECT(&s->dp), OBJECT(&s->dpdma), "dpdma",
@@ -602,17 +579,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->dpdma), 0, DPDMA_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dpdma), 0, gic_spi[DPDMA_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->ipi), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ipi), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ipi), 0, IPI_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->ipi), 0, gic_spi[IPI_IRQ]);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR);
@@ -624,9 +597,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
             return;
         }
 
@@ -636,9 +607,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     }
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA_CH; i++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), errp)) {
             return;
         }
 
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index f4493d6afa..fe0ae2d146 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2574,9 +2574,7 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
             return;
         }
 
-        qdev_realize_and_unref(dev, &fdctrl->bus.bus, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize_and_unref(dev, &fdctrl->bus.bus, errp)) {
             return;
         }
     }
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 1b7bc5de08..10c44dfda2 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -961,8 +961,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
     blockdev->iothread = iothread;
     blockdev->drive = drive;
 
-    qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err);
-    if (local_err) {
+    if (!qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err)) {
         error_propagate_prepend(errp, local_err,
                                 "realization of device %s failed: ",
                                 type);
diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
index 56f915e7c9..2cf3e44177 100644
--- a/hw/char/serial-pci-multi.c
+++ b/hw/char/serial-pci-multi.c
@@ -95,7 +95,6 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
     SerialState *s;
-    Error *err = NULL;
     size_t i, nports = multi_serial_get_port_count(pc);
 
     pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
@@ -106,9 +105,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
 
     for (i = 0; i < nports; i++) {
         s = pci->state + i;
-        qdev_realize(DEVICE(s), NULL, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(s), NULL, errp)) {
             multi_serial_pci_exit(dev);
             return;
         }
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 298f3adba7..cd56924a43 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -47,11 +47,8 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
 {
     PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
     SerialState *s = &pci->state;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
diff --git a/hw/char/serial.c b/hw/char/serial.c
index 9eebcb27e7..2386479492 100644
--- a/hw/char/serial.c
+++ b/hw/char/serial.c
@@ -989,11 +989,8 @@ static void serial_io_realize(DeviceState *dev, Error **errp)
 {
     SerialIO *sio = SERIAL_IO(dev);
     SerialState *s = &sio->serial;
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
@@ -1096,11 +1093,8 @@ static void serial_mm_realize(DeviceState *dev, Error **errp)
 {
     SerialMM *smm = SERIAL_MM(dev);
     SerialState *s = &smm->serial;
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(s), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(s), NULL, errp)) {
         return;
     }
 
diff --git a/hw/core/cpu.c b/hw/core/cpu.c
index 0f23409f1d..594441a150 100644
--- a/hw/core/cpu.c
+++ b/hw/core/cpu.c
@@ -59,8 +59,7 @@ CPUState *cpu_create(const char *typename)
 {
     Error *err = NULL;
     CPUState *cpu = CPU(object_new(typename));
-    qdev_realize(DEVICE(cpu), NULL, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
         error_report_err(err);
         object_unref(OBJECT(cpu));
         exit(EXIT_FAILURE);
diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
index e6085f5d44..c377be398d 100644
--- a/hw/cpu/a15mpcore.c
+++ b/hw/cpu/a15mpcore.c
@@ -53,7 +53,6 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev;
     SysBusDevice *busdev;
     int i;
-    Error *err = NULL;
     bool has_el3;
     bool has_el2 = false;
     Object *cpuobj;
@@ -76,9 +75,7 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
         qdev_prop_set_bit(gicdev, "has-virtualization-extensions", has_el2);
     }
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
index 642363d2f4..351295e518 100644
--- a/hw/cpu/a9mpcore.c
+++ b/hw/cpu/a9mpcore.c
@@ -50,16 +50,13 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
     SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
                  *wdtbusdev;
-    Error *err = NULL;
     int i;
     bool has_el3;
     Object *cpuobj;
 
     scudev = DEVICE(&s->scu);
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
     scubusdev = SYS_BUS_DEVICE(&s->scu);
@@ -78,9 +75,7 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
         object_property_get_bool(cpuobj, "has_el3", &error_abort);
     qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     gicbusdev = SYS_BUS_DEVICE(&s->gic);
@@ -93,27 +88,21 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
 
     gtimerdev = DEVICE(&s->gtimer);
     qdev_prop_set_uint32(gtimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), errp)) {
         return;
     }
     gtimerbusdev = SYS_BUS_DEVICE(&s->gtimer);
 
     mptimerdev = DEVICE(&s->mptimer);
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
         return;
     }
     mptimerbusdev = SYS_BUS_DEVICE(&s->mptimer);
 
     wdtdev = DEVICE(&s->wdt);
     qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt), errp)) {
         return;
     }
     wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
index a2afb992fb..89c4e35143 100644
--- a/hw/cpu/arm11mpcore.c
+++ b/hw/cpu/arm11mpcore.c
@@ -76,12 +76,9 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     DeviceState *gicdev = DEVICE(&s->gic);
     DeviceState *mptimerdev = DEVICE(&s->mptimer);
     DeviceState *wdtimerdev = DEVICE(&s->wdtimer);
-    Error *err = NULL;
 
     qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
         return;
     }
 
@@ -91,9 +88,7 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
                          ARM11MPCORE_NUM_GIC_PRIORITY_BITS);
 
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -104,16 +99,12 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
     qdev_init_gpio_in(dev, mpcore_priv_set_irq, s->num_irq - 32);
 
     qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
         return;
     }
 
     qdev_prop_set_uint32(wdtimerdev, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), errp)) {
         return;
     }
 
diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
index d2e426fa45..96f4d2517a 100644
--- a/hw/cpu/realview_mpcore.c
+++ b/hw/cpu/realview_mpcore.c
@@ -65,14 +65,11 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     DeviceState *priv = DEVICE(&s->priv);
     DeviceState *gic;
     SysBusDevice *gicbusdev;
-    Error *err = NULL;
     int n;
     int i;
 
     qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
-    sysbus_realize(SYS_BUS_DEVICE(&s->priv), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->priv), errp)) {
         return;
     }
     sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->priv));
@@ -81,9 +78,7 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
     }
     /* ??? IRQ routing is hardcoded to "normal" mode.  */
     for (n = 0; n < 4; n++) {
-        sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), errp)) {
             return;
         }
         gic = DEVICE(&s->gic[n]);
diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
index 41b88b878d..93ba5956ed 100644
--- a/hw/display/virtio-gpu-pci.c
+++ b/hw/display/virtio-gpu-pci.c
@@ -31,13 +31,9 @@ static void virtio_gpu_pci_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     VirtIOGPUBase *g = vgpu->vgpu;
     DeviceState *vdev = DEVICE(g);
     int i;
-    Error *local_error = NULL;
 
     virtio_pci_force_virtio_1(vpci_dev);
-    qdev_realize(vdev, BUS(&vpci_dev->bus), &local_error);
-
-    if (local_error) {
-        error_propagate(errp, local_error);
+    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index 67f409e106..fd550b35c8 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -93,7 +93,6 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     VirtIOVGABase *vvga = VIRTIO_VGA_BASE(vpci_dev);
     VirtIOGPUBase *g = vvga->vgpu;
     VGACommonState *vga = &vvga->vga;
-    Error *err = NULL;
     uint32_t offset;
     int i;
 
@@ -138,9 +137,7 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 
     /* init virtio bits */
     virtio_pci_force_virtio_1(vpci_dev);
-    qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index af9f4c5a85..3c4b6e6d70 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -2619,7 +2619,6 @@ static void nvic_systick_trigger(void *opaque, int n, int level)
 static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
 {
     NVICState *s = NVIC(dev);
-    Error *err = NULL;
     int regionlen;
 
     /* The armv7m container object will have set our CPU pointer */
@@ -2640,9 +2639,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
 
     s->num_prio_bits = arm_feature(&s->cpu->env, ARM_FEATURE_V7) ? 8 : 2;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
         return;
     }
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), 0,
@@ -2657,9 +2654,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
         object_initialize_child(OBJECT(dev), "systick-reg-s",
                                 &s->systick[M_REG_S], TYPE_SYSTICK);
 
-        sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {
             return;
         }
         sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_S]), 0,
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
index 85ba0b4655..7d33457e81 100644
--- a/hw/intc/pnv_xive.c
+++ b/hw/intc/pnv_xive.c
@@ -1833,9 +1833,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
@@ -1843,9 +1841,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
index f11fb5259a..9b12116b2a 100644
--- a/hw/intc/realview_gic.c
+++ b/hw/intc/realview_gic.c
@@ -26,7 +26,6 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     RealViewGICState *s = REALVIEW_GIC(dev);
     SysBusDevice *busdev;
-    Error *err = NULL;
     /* The GICs on the RealView boards have a fixed nonconfigurable
      * number of interrupt lines, so we don't need to expose this as
      * a qdev property.
@@ -34,9 +33,7 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
     int numirq = 96;
 
     qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", numirq);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
     busdev = SYS_BUS_DEVICE(&s->gic);
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index b7fc8dde7a..4e9ee90353 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -312,9 +312,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
     sysbus_init_mmio(SYS_BUS_DEVICE(xive), &xsrc->esb_mmio);
@@ -326,9 +324,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
                             &error_fatal);
     object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
                              &error_abort);
-    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
     }
     sysbus_init_mmio(SYS_BUS_DEVICE(xive), &end_xsrc->esb_mmio);
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index d365eeca66..0d336fb033 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -376,7 +376,6 @@ static const TypeInfo icp_info = {
 
 Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
 {
-    Error *local_err = NULL;
     Object *obj;
 
     obj = object_new(type);
@@ -384,10 +383,8 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
     object_unref(obj);
     object_property_set_link(obj, OBJECT(xi), ICP_PROP_XICS, &error_abort);
     object_property_set_link(obj, cpu, ICP_PROP_CPU, &error_abort);
-    qdev_realize(DEVICE(obj), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(obj), NULL, errp)) {
         object_unparent(obj);
-        error_propagate(errp, local_err);
         obj = NULL;
     }
 
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 2c30dc53d8..8e167306e7 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -765,8 +765,7 @@ Object *xive_tctx_create(Object *cpu, XivePresenter *xptr, Error **errp)
     object_unref(obj);
     object_property_set_link(obj, cpu, "cpu", &error_abort);
     object_property_set_link(obj, OBJECT(xptr), "presenter", &error_abort);
-    qdev_realize(DEVICE(obj), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(obj), NULL, &local_err)) {
         goto error;
     }
 
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index f634bcb2d1..ac044afa95 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -150,7 +150,6 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
     PIIX4State *s = PIIX4_PCI_DEVICE(dev);
     ISABus *isa_bus;
     qemu_irq *i8259_out_irq;
-    Error *err = NULL;
 
     isa_bus = isa_bus_new(DEVICE(dev), pci_address_space(dev),
                           pci_address_space_io(dev), errp);
@@ -183,9 +182,7 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
 
     /* RTC */
     qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
-    qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) {
         return;
     }
     isa_init_irq(ISA_DEVICE(&s->rtc), &s->rtc.irq, RTC_ISA_IRQ);
diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
index abebc7e2ef..cd4f3427d8 100644
--- a/hw/microblaze/xlnx-zynqmp-pmu.c
+++ b/hw/microblaze/xlnx-zynqmp-pmu.c
@@ -76,7 +76,6 @@ static void xlnx_zynqmp_pmu_soc_init(Object *obj)
 static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
 {
     XlnxZynqMPPMUSoCState *s = XLNX_ZYNQMP_PMU_SOC(dev);
-    Error *err = NULL;
 
     object_property_set_uint(OBJECT(&s->cpu), XLNX_ZYNQMP_PMU_ROM_ADDR,
                              "base-vectors", &error_abort);
@@ -96,9 +95,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
     object_property_set_str(OBJECT(&s->cpu), "8.40.b", "version",
                             &error_abort);
     object_property_set_uint(OBJECT(&s->cpu), 0, "pvr", &error_abort);
-    qdev_realize(DEVICE(&s->cpu), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
@@ -108,9 +105,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_uint(OBJECT(&s->intc), 0xffff, "intc-positive",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->intc), 0, XLNX_ZYNQMP_PMU_INTC_ADDR);
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index 0d7f3cf673..b4f2306596 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -71,7 +71,6 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
     CPUMIPSState *env;
     MIPSCPU *cpu;
     int i;
-    Error *err = NULL;
     target_ulong gcr_base;
     bool itu_present = false;
     bool saar_present = false;
@@ -109,9 +108,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
         if (saar_present) {
             s->itu.saar = &env->CP0_SAAR;
         }
-        sysbus_realize(SYS_BUS_DEVICE(&s->itu), &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(&s->itu), errp)) {
             return;
         }
 
@@ -125,9 +122,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                             &error_abort);
     object_property_set_int(OBJECT(&s->cpc), 1, "vp-start-running",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->cpc), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpc), errp)) {
         return;
     }
 
@@ -140,9 +135,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                             &error_abort);
     object_property_set_int(OBJECT(&s->gic), 128, "num-irq",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
     }
 
@@ -163,9 +156,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
                              &error_abort);
     object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gcr), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
         return;
     }
 
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 47aa3b0552..0d29d53116 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -524,13 +524,10 @@ static void cuda_reset(DeviceState *dev)
 static void cuda_realize(DeviceState *dev, Error **errp)
 {
     CUDAState *s = CUDA(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     struct tm tm;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), errp)) {
         return;
     }
 
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 3251c79f46..7cfe357cc4 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -98,11 +98,8 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
 {
     MacIOState *s = MACIO(d);
     SysBusDevice *sysbus_dev;
-    Error *err = NULL;
 
-    qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->dbdma);
@@ -116,9 +113,7 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
     qdev_prop_set_chr(DEVICE(&s->escc), "chrB", serial_hd(1));
     qdev_prop_set_uint32(DEVICE(&s->escc), "chnBtype", escc_serial);
     qdev_prop_set_uint32(DEVICE(&s->escc), "chnAtype", escc_serial);
-    qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), errp)) {
         return;
     }
 
@@ -159,9 +154,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
 
     qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
                          s->frequency);
-    qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
@@ -176,9 +169,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
     sysbus_connect_irq(sysbus_dev, 1, qdev_get_gpio_in(pic_dev,
                                                        OLDWORLD_ESCCA_IRQ));
 
-    qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), errp)) {
         return;
     }
     sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
@@ -345,9 +336,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
         object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
                                  &error_abort);
         qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
-        qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), errp)) {
             return;
         }
         sysbus_dev = SYS_BUS_DEVICE(&s->pmu);
@@ -363,9 +352,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
         qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
                              s->frequency);
 
-        qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
             return;
         }
         sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
index 41b626c46c..4b0983697c 100644
--- a/hw/misc/macio/pmu.c
+++ b/hw/misc/macio/pmu.c
@@ -741,13 +741,10 @@ static void pmu_reset(DeviceState *dev)
 static void pmu_realize(DeviceState *dev, Error **errp)
 {
     PMUState *s = VIA_PMU(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     struct tm tm;
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index 3ec904a55f..d85ca709d9 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -990,7 +990,6 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
     PnvPHB3 *phb = PNV_PHB3(dev);
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
-    Error *local_err = NULL;
     int i;
 
     if (phb->phb_id >= PNV8_CHIP_PHB3_MAX) {
@@ -1003,9 +1002,7 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
                                    &error_abort);
     object_property_set_int(OBJECT(&phb->lsis), PNV_PHB3_NUM_LSI, "nr-irqs",
                             &error_abort);
-    qdev_realize(DEVICE(&phb->lsis), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->lsis), NULL, errp)) {
         return;
     }
 
@@ -1022,18 +1019,14 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
                                    &error_abort);
     object_property_set_int(OBJECT(&phb->msis), PHB3_MAX_MSI, "nr-irqs",
                             &error_abort);
-    qdev_realize(DEVICE(&phb->msis), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->msis), NULL, errp)) {
         return;
     }
 
     /* Power Bus Common Queue */
     object_property_set_link(OBJECT(&phb->pbcq), OBJECT(phb), "phb",
                                    &error_abort);
-    qdev_realize(DEVICE(&phb->pbcq), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&phb->pbcq), NULL, errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 10716d759d..7739fd5984 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1169,7 +1169,6 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
     PnvPHB4 *phb = PNV_PHB4(dev);
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     XiveSource *xsrc = &phb->xsrc;
-    Error *local_err = NULL;
     int nr_irqs;
     char name[32];
 
@@ -1218,9 +1217,7 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
     }
     object_property_set_int(OBJECT(xsrc), nr_irqs, "nr-irqs", &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(phb), "xive", &error_fatal);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index 2d634c838e..40f993bd06 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -377,7 +377,6 @@ static void pnv_pec_instance_init(Object *obj)
 static void pnv_pec_realize(DeviceState *dev, Error **errp)
 {
     PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
-    Error *local_err = NULL;
     char name[64];
     int i;
 
@@ -390,9 +389,7 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
 
         object_property_set_int(stk_obj, i, "stack-no", &error_abort);
         object_property_set_link(stk_obj, OBJECT(pec), "pec", &error_abort);
-        qdev_realize(DEVICE(stk_obj), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
             return;
         }
     }
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 51bf95b303..5448d101d9 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -764,16 +764,13 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
 static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
                                           IrqLines *irqs, Error **errp)
 {
-    Error *err = NULL;
     DeviceState *dev;
     CPUState *cs;
 
     dev = qdev_new(TYPE_KVM_OPENPIC);
     qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
 
-    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 8bd03f3b10..392aa138de 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1137,9 +1137,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
                             "bar", &error_fatal);
     object_property_set_link(OBJECT(&chip8->psi), OBJECT(chip8->xics),
                              ICS_PROP_XICS, &error_abort);
-    qdev_realize(DEVICE(&chip8->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE,
@@ -1168,9 +1166,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     /* Create the simplified OCC model */
     object_property_set_link(OBJECT(&chip8->occ), OBJECT(&chip8->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip8->occ), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->occ), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_regs);
@@ -1182,9 +1178,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     /* HOMER */
     object_property_set_link(OBJECT(&chip8->homer), OBJECT(chip), "chip",
                              &error_abort);
-    qdev_realize(DEVICE(&chip8->homer), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip8->homer), NULL, errp)) {
         return;
     }
     /* Homer Xscom region */
@@ -1202,9 +1196,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
         object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
         object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
                                 &error_fatal);
-        sysbus_realize(SYS_BUS_DEVICE(phb), &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
             return;
         }
 
@@ -1359,7 +1351,6 @@ static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
 static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
 {
     Pnv9Chip *chip9 = PNV9_CHIP(chip);
-    Error *local_err = NULL;
     int i, j;
     int phb_id = 0;
 
@@ -1381,9 +1372,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
                                  &error_fatal);
         object_property_set_link(OBJECT(pec), OBJECT(get_system_memory()),
                                  "system-memory", &error_abort);
-        qdev_realize(DEVICE(pec), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(pec), NULL, errp)) {
             return;
         }
 
@@ -1406,9 +1395,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
             object_property_set_int(obj, PNV_PHB4_DEVICE_ID, "device-id",
                                     &error_fatal);
             object_property_set_link(obj, OBJECT(stack), "stack", &error_abort);
-            sysbus_realize(SYS_BUS_DEVICE(obj), &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
 
@@ -1466,9 +1453,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                             "tm-bar", &error_fatal);
     object_property_set_link(OBJECT(&chip9->xive), OBJECT(chip), "chip",
                              &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
@@ -1477,9 +1462,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* Processor Service Interface (PSI) Host Bridge */
     object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
                             "bar", &error_fatal);
-    qdev_realize(DEVICE(&chip9->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
@@ -1488,9 +1471,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* LPC */
     object_property_set_link(OBJECT(&chip9->lpc), OBJECT(&chip9->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->lpc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->lpc), NULL, errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip),
@@ -1502,9 +1483,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* Create the simplified OCC model */
     object_property_set_link(OBJECT(&chip9->occ), OBJECT(&chip9->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->occ), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->occ), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_regs);
@@ -1516,9 +1495,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     /* HOMER */
     object_property_set_link(OBJECT(&chip9->homer), OBJECT(chip), "chip",
                              &error_abort);
-    qdev_realize(DEVICE(&chip9->homer), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip9->homer), NULL, errp)) {
         return;
     }
     /* Homer Xscom region */
@@ -1598,9 +1575,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
     /* Processor Service Interface (PSI) Host Bridge */
     object_property_set_int(OBJECT(&chip10->psi), PNV10_PSIHB_BASE(chip),
                             "bar", &error_fatal);
-    qdev_realize(DEVICE(&chip10->psi), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip10->psi), NULL, errp)) {
         return;
     }
     pnv_xscom_add_subregion(chip, PNV10_XSCOM_PSIHB_BASE,
@@ -1609,9 +1584,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
     /* LPC */
     object_property_set_link(OBJECT(&chip10->lpc), OBJECT(&chip10->psi), "psi",
                              &error_abort);
-    qdev_realize(DEVICE(&chip10->lpc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&chip10->lpc), NULL, errp)) {
         return;
     }
     memory_region_add_subregion(get_system_memory(), PNV10_LPCM_BASE(chip),
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index c986c16db1..4724ddf96c 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -173,9 +173,7 @@ static void pnv_core_cpu_realize(PnvCore *pc, PowerPCCPU *cpu, Error **errp)
     Error *local_err = NULL;
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(pc->chip);
 
-    qdev_realize(DEVICE(cpu), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
         return;
     }
 
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 75b8ae9703..08756a79cd 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -510,9 +510,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    qdev_realize(DEVICE(ics), NULL, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(DEVICE(ics), NULL, errp)) {
         return;
     }
 
@@ -842,7 +840,6 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
 {
     PnvPsi *psi = PNV_PSI(dev);
     XiveSource *xsrc = &PNV9_PSI(psi)->source;
-    Error *local_err = NULL;
     int i;
 
     /* This is the only device with 4k ESB pages */
@@ -851,9 +848,7 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
     object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
                             &error_fatal);
     object_property_set_link(OBJECT(xsrc), OBJECT(psi), "xive", &error_abort);
-    qdev_realize(DEVICE(xsrc), NULL, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 26ad566f42..85330d08a1 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -239,8 +239,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
     CPUState *cs = CPU(cpu);
     Error *local_err = NULL;
 
-    qdev_realize(DEVICE(cpu), NULL, &local_err);
-    if (local_err) {
+    if (!qdev_realize(DEVICE(cpu), NULL, &local_err)) {
         goto error;
     }
 
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 897bf98587..a61d39ad71 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -302,7 +302,6 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
     spapr_irq_msi_init(spapr);
 
     if (spapr->irq->xics) {
-        Error *local_err = NULL;
         Object *obj;
 
         obj = object_new(TYPE_ICS_SPAPR);
@@ -311,9 +310,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
         object_property_set_link(obj, OBJECT(spapr), ICS_PROP_XICS,
                                  &error_abort);
         object_property_set_int(obj, smc->nr_xirqs, "nr-irqs", &error_abort);
-        qdev_realize(DEVICE(obj), NULL, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qdev_realize(DEVICE(obj), NULL, errp)) {
             return;
         }
 
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
index 19223e4c29..d40f065a6a 100644
--- a/hw/riscv/opentitan.c
+++ b/hw/riscv/opentitan.c
@@ -106,7 +106,6 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
     MachineState *ms = MACHINE(qdev_get_machine());
     LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
     MemoryRegion *sys_mem = get_system_memory();
-    Error *err = NULL;
 
     object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
                             &error_abort);
@@ -127,18 +126,14 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
                                 &s->flash_mem);
 
     /* PLIC */
-    sysbus_realize(SYS_BUS_DEVICE(&s->plic), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->plic), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0, memmap[IBEX_PLIC].base);
 
     /* UART */
     qdev_prop_set_chr(DEVICE(&(s->uart)), "chardev", serial_hd(0));
-    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart), 0, memmap[IBEX_UART].base);
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 0cb66ac4e2..416adfcce0 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -185,8 +185,6 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
 {
     MachineState *ms = MACHINE(qdev_get_machine());
     const struct MemmapEntry *memmap = sifive_e_memmap;
-    Error *err = NULL;
-
     SiFiveESoCState *s = RISCV_E_SOC(dev);
     MemoryRegion *sys_mem = get_system_memory();
 
@@ -221,9 +219,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
 
     /* GPIO */
 
-    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
         return;
     }
 
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index a1d2edfe13..12cd91b227 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -608,7 +608,6 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     char *plic_hart_config;
     size_t plic_hart_config_len;
     int i;
-    Error *err = NULL;
     NICInfo *nd = &nd_table[0];
 
     sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
@@ -710,9 +709,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
     }
     object_property_set_int(OBJECT(&s->gem), GEM_REVISION, "revision",
                             &error_abort);
-    sysbus_realize(SYS_BUS_DEVICE(&s->gem), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem), errp)) {
         return;
     }
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem), 0, memmap[SIFIVE_U_GEM].base);
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 164b1fd295..645b4080c5 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -442,18 +442,13 @@ static void init_event_facility(Object *obj)
 static void realize_event_facility(DeviceState *dev, Error **errp)
 {
     SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
-    Error *local_err = NULL;
 
-    qdev_realize(DEVICE(&event_facility->quiesce),
-                 BUS(&event_facility->sbus), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&event_facility->quiesce),
+                      BUS(&event_facility->sbus), errp)) {
         return;
     }
-    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
-                 BUS(&event_facility->sbus), &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
+                      BUS(&event_facility->sbus), errp)) {
         qdev_unrealize(DEVICE(&event_facility->quiesce));
         return;
     }
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 142e52a8ff..0517901024 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -829,8 +829,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
                                 "zPCI device could not be created: ");
         return NULL;
     }
-    qdev_realize_and_unref(dev, BUS(s->bus), &local_err);
-    if (local_err) {
+    if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) {
         object_unparent(OBJECT(dev));
         error_propagate_prepend(errp, local_err,
                                 "zPCI device could not be created: ");
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index d39f6d7785..03364343eb 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -338,8 +338,7 @@ static void sclp_realize(DeviceState *dev, Error **errp)
      * as we can't find a fitting bus via the qom tree, we have to add the
      * event facility to the sysbus, so e.g. a sclp console can be created.
      */
-    sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err);
-    if (err) {
+    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err)) {
         goto out;
     }
 
diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
index ca6753bff3..438626cf37 100644
--- a/hw/s390x/virtio-ccw-crypto.c
+++ b/hw/s390x/virtio-ccw-crypto.c
@@ -19,11 +19,8 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
index 4077160f49..aefe6b1b51 100644
--- a/hw/s390x/virtio-ccw-rng.c
+++ b/hw/s390x/virtio-ccw-rng.c
@@ -20,11 +20,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
 {
     VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
     DeviceState *vdev = DEVICE(&dev->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
         return;
     }
 
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index b878a08080..f3d2d63de8 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -293,9 +293,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     qdev_prop_set_enum(dev, "rerror", rerror);
     qdev_prop_set_enum(dev, "werror", werror);
 
-    qdev_realize_and_unref(dev, &bus->qbus, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
index 538d3bad3d..ad0bb6fdb4 100644
--- a/hw/sd/aspeed_sdhci.c
+++ b/hw/sd/aspeed_sdhci.c
@@ -145,9 +145,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
             return;
         }
 
-        sysbus_realize(sbd_slot, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!sysbus_realize(sbd_slot, errp)) {
             return;
         }
 
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index 25cec2ddea..0df0edb51d 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -266,8 +266,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
         goto fail;
     }
 
-    qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err);
-    if (err) {
+    if (!qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err)) {
         goto fail;
     }
 
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 957559b18d..ba27afe9f2 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -704,8 +704,7 @@ USBDevice *usbdevice_create(const char *cmdline)
         error_report("Failed to create USB device '%s'", f->name);
         return NULL;
     }
-    usb_realize_and_unref(dev, bus, &err);
-    if (err) {
+    if (!usb_realize_and_unref(dev, bus, &err)) {
         error_reportf_err(err, "Failed to initialize USB device '%s': ",
                           f->name);
         object_unparent(OBJECT(dev));
diff --git a/hw/virtio/virtio-rng-pci.c b/hw/virtio/virtio-rng-pci.c
index cf1afb47a6..b6cb0199a3 100644
--- a/hw/virtio/virtio-rng-pci.c
+++ b/hw/virtio/virtio-rng-pci.c
@@ -34,11 +34,8 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 {
     VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
     DeviceState *vdev = DEVICE(&vrng->vdev);
-    Error *err = NULL;
 
-    qdev_realize(vdev, BUS(&vpci_dev->bus), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
         return;
     }
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 22da107484..13a13a811a 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -676,8 +676,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     }
 
     dev->opts = opts;
-    qdev_realize(DEVICE(dev), bus, &err);
-    if (err != NULL) {
+    if (!qdev_realize(DEVICE(dev), bus, &err)) {
         dev->opts = NULL;
         goto err_del_dev;
     }
-- 
2.26.2



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

* [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (2 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
                     ` (2 more replies)
  2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
                   ` (42 subsequent siblings)
  46 siblings, 3 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Mark Cave-Ayland, pbonzini, David Gibson

macio_newworld_realize() effectively ignores ns->gpio realization
errors, leaking the Error object.  Fortunately, macio_gpio_realize()
can't actually fail.  Tidy up.

Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/misc/macio/macio.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 7cfe357cc4..bedf10e77b 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -329,7 +329,9 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
                                  &error_abort);
         memory_region_add_subregion(&s->bar, 0x50,
                                     sysbus_mmio_get_region(sysbus_dev, 0));
-        qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), &err);
+        if (!qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), errp)) {
+            return;
+        }
 
         /* PMU */
         object_initialize_child(OBJECT(s), "pmu", &s->pmu, TYPE_VIA_PMU);
-- 
2.26.2



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

* [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (3 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
                     ` (2 more replies)
  2020-06-24 16:43 ` [PATCH 06/46] error: Avoid error_propagate() when error is not used here Markus Armbruster
                   ` (41 subsequent siblings)
  46 siblings, 3 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Michael S . Tsirkin, Gonglei (Arei),
	pbonzini

virtio_crypto_pci_realize() continues after realization of its
"virtio-crypto-device" fails.  Only an object_property_set_link()
follows; looks harmless to me.  Tidy up anyway: return after failure,
just like virtio_rng_pci_realize() does.

Cc: "Gonglei (Arei)" <arei.gonglei@huawei.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/virtio/virtio-crypto-pci.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
index 72be531c95..0755722288 100644
--- a/hw/virtio/virtio-crypto-pci.c
+++ b/hw/virtio/virtio-crypto-pci.c
@@ -54,7 +54,9 @@ static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     }
 
     virtio_pci_force_virtio_1(vpci_dev);
-    qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
+    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
+        return;
+    }
     object_property_set_link(OBJECT(vcrypto),
                  OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
                  NULL);
-- 
2.26.2



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

* [PATCH 06/46] error: Avoid error_propagate() when error is not used here
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (4 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 18:17   ` Eric Blake
  2020-06-26 14:36   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 07/46] error: Avoid more " Markus Armbruster
                   ` (40 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When all we do with an Error we receive into a local variable is
propagating to somewhere else, we can just as well receive it there
right away.  Coccinelle script:

    @@
    identifier fun, err, errp;
    expression list args;
    @@
    -    fun(args, &err);
    +    fun(args, errp);
         ... when != err
             when strict
    -    error_propagate(errp, err);

    @@
    identifier fun, err, errp;
    expression list args;
    expression ret;
    @@
    -    ret = fun(args, &err);
    +    ret = fun(args, errp);
         ... when != err
             when strict
    -    error_propagate(errp, err);

    @@
    identifier fun, err, errp;
    expression list args;
    expression ret;
    @@
    -    ret = fun(args, &err);
    +    ret = fun(args, errp);
         ... when != err
             when strict
         if (
    (
             ret
    |
             !ret
    |
             ret == 0
    |
             ret != 0
    |
             ret < 0
    |
             ret != NULL
    |
             ret == NULL
    )
            )
         {
             ... when != err
                 when strict
    -        error_propagate(errp, err);
             ...
         }

    @@
    identifier fun, err, errp;
    expression list args;
    @@
         if (
    (
    -        fun(args, &err)
    +        fun(args, errp)
    |
    -        !fun(args, &err)
    +        !fun(args, errp)
    |
    -        fun(args, &err) == 0
    +        fun(args, errp) == 0
    |
    -        fun(args, &err) != 0
    +        fun(args, errp) != 0
    |
    -        fun(args, &err) < 0
    +        fun(args, errp) < 0
    |
    -        fun(args, &err) == NULL
    +        fun(args, errp) == NULL
    |
    -        fun(args, &err) != NULL
    +        fun(args, errp) != NULL
    )
            )
         {
             ... when != err;
                 when strict
    -        error_propagate(errp, err);
             ...
         }

The first two rules are prone to fail with "error_propagate(...)
... reachable by inconsistent control-flow paths".  Script without
them re-run where that happens.

Manually double-check @err is not used afterwards.  Dereferencing it
would be use after free, but checking whether it's null would be
legitimate.  One such change to qbus_realize() backed out.

Suboptimal line breaks tweaked manually.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 backends/cryptodev-vhost-user.c |  3 +--
 block.c                         |  3 +--
 block/file-posix.c              |  8 ++------
 block/parallels.c               |  3 +--
 block/qcow.c                    |  3 +--
 block/qcow2.c                   | 10 +++-------
 block/qed.c                     |  3 +--
 block/replication.c             |  4 +---
 block/vhdx.c                    |  3 +--
 block/vmdk.c                    |  7 ++-----
 block/vpc.c                     |  3 +--
 blockdev.c                      | 10 +++-------
 dump/dump.c                     |  7 ++-----
 hw/intc/xics_kvm.c              |  3 +--
 hw/s390x/s390-pci-bus.c         |  4 +---
 hw/usb/bus.c                    |  4 +---
 hw/vfio/pci.c                   | 10 +++-------
 iothread.c                      |  3 +--
 qdev-monitor.c                  |  3 +--
 qga/commands-win32.c            |  3 +--
 util/main-loop.c                |  4 +---
 util/qemu-option.c              |  3 +--
 22 files changed, 31 insertions(+), 73 deletions(-)

diff --git a/backends/cryptodev-vhost-user.c b/backends/cryptodev-vhost-user.c
index 8b8cbc4223..dbe5a8aae6 100644
--- a/backends/cryptodev-vhost-user.c
+++ b/backends/cryptodev-vhost-user.c
@@ -209,8 +209,7 @@ static void cryptodev_vhost_user_init(
         backend->conf.peers.ccs[i] = cc;
 
         if (i == 0) {
-            if (!qemu_chr_fe_init(&s->chr, chr, &local_err)) {
-                error_propagate(errp, local_err);
+            if (!qemu_chr_fe_init(&s->chr, chr, errp)) {
                 return;
             }
         }
diff --git a/block.c b/block.c
index 6dbcb7e083..30a72bc4c2 100644
--- a/block.c
+++ b/block.c
@@ -5680,10 +5680,9 @@ static void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs,
     if (bs->open_flags & BDRV_O_INACTIVE) {
         bs->open_flags &= ~BDRV_O_INACTIVE;
         bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
-        ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, &local_err);
+        ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, errp);
         if (ret < 0) {
             bs->open_flags |= BDRV_O_INACTIVE;
-            error_propagate(errp, local_err);
             return;
         }
         bdrv_set_perm(bs, perm, shared_perm);
diff --git a/block/file-posix.c b/block/file-posix.c
index 3ab8f5a0fa..2294bf5d00 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -3336,7 +3336,6 @@ static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
                      Error **errp)
 {
     BDRVRawState *s = bs->opaque;
-    Error *local_err = NULL;
     int ret;
 
 #if defined(__APPLE__) && defined(__MACH__)
@@ -3401,9 +3400,8 @@ hdev_open_Mac_error:
 
     s->type = FTYPE_FILE;
 
-    ret = raw_open_common(bs, options, flags, 0, true, &local_err);
+    ret = raw_open_common(bs, options, flags, 0, true, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
 #if defined(__APPLE__) && defined(__MACH__)
         if (*bsd_path) {
             filename = bsd_path;
@@ -3679,14 +3677,12 @@ static int cdrom_open(BlockDriverState *bs, QDict *options, int flags,
                       Error **errp)
 {
     BDRVRawState *s = bs->opaque;
-    Error *local_err = NULL;
     int ret;
 
     s->type = FTYPE_CD;
 
-    ret = raw_open_common(bs, options, flags, 0, true, &local_err);
+    ret = raw_open_common(bs, options, flags, 0, true, errp);
     if (ret) {
-        error_propagate(errp, local_err);
         return ret;
     }
 
diff --git a/block/parallels.c b/block/parallels.c
index 63a1cde8af..a84ec6a518 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -646,9 +646,8 @@ static int coroutine_fn parallels_co_create_opts(BlockDriver *drv,
     }
 
     /* Create and open the file (protocol layer) */
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto done;
     }
 
diff --git a/block/qcow.c b/block/qcow.c
index ee5d35fe20..dca2a1fe7d 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -973,9 +973,8 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver *drv,
     }
 
     /* Create and open the file (protocol layer) */
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/block/qcow2.c b/block/qcow2.c
index 0cd2e6757e..e81c284319 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1583,8 +1583,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
 
     /* read qcow2 extensions */
     if (qcow2_read_extensions(bs, header.header_length, ext_end, NULL,
-                              flags, &update_header, &local_err)) {
-        error_propagate(errp, local_err);
+                              flags, &update_header, errp)) {
         ret = -EINVAL;
         goto fail;
     }
@@ -3356,7 +3355,6 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
     int version;
     int refcount_order;
     uint64_t* refcount_table;
-    Error *local_err = NULL;
     int ret;
     uint8_t compression_type = QCOW2_COMPRESSION_TYPE_ZLIB;
 
@@ -3582,9 +3580,8 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
     }
     blk = blk_new_open(NULL, NULL, options,
                        BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_NO_FLUSH,
-                       &local_err);
+                       errp);
     if (blk == NULL) {
-        error_propagate(errp, local_err);
         ret = -EIO;
         goto out;
     }
@@ -3664,9 +3661,8 @@ qcow2_co_create(BlockdevCreateOptions *create_options, Error **errp)
     }
     blk = blk_new_open(NULL, NULL, options,
                        BDRV_O_RDWR | BDRV_O_NO_BACKING | BDRV_O_NO_IO,
-                       &local_err);
+                       errp);
     if (blk == NULL) {
-        error_propagate(errp, local_err);
         ret = -EIO;
         goto out;
     }
diff --git a/block/qed.c b/block/qed.c
index c0c65015c7..e369fd360a 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -749,9 +749,8 @@ static int coroutine_fn bdrv_qed_co_create_opts(BlockDriver *drv,
     }
 
     /* Create and open the file (protocol layer) */
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/block/replication.c b/block/replication.c
index ccf7b78160..aa7164dbe3 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -369,7 +369,6 @@ static void reopen_backing_file(BlockDriverState *bs, bool writable,
 {
     BDRVReplicationState *s = bs->opaque;
     BlockReopenQueue *reopen_queue = NULL;
-    Error *local_err = NULL;
 
     if (writable) {
         s->orig_hidden_read_only = bdrv_is_read_only(s->hidden_disk->bs);
@@ -394,8 +393,7 @@ static void reopen_backing_file(BlockDriverState *bs, bool writable,
     }
 
     if (reopen_queue) {
-        bdrv_reopen_multiple(reopen_queue, &local_err);
-        error_propagate(errp, local_err);
+        bdrv_reopen_multiple(reopen_queue, errp);
     }
 
     bdrv_subtree_drained_end(s->hidden_disk->bs);
diff --git a/block/vhdx.c b/block/vhdx.c
index fa9e544a5e..ac5a9094c4 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -2086,9 +2086,8 @@ static int coroutine_fn vhdx_co_create_opts(BlockDriver *drv,
     }
 
     /* Create and open the file (protocol layer) */
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/block/vmdk.c b/block/vmdk.c
index 62da465126..9a09193f3b 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -2250,19 +2250,16 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
 {
     int ret;
     BlockBackend *blk = NULL;
-    Error *local_err = NULL;
 
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto exit;
     }
 
     blk = blk_new_open(filename, NULL, NULL,
                        BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL,
-                       &local_err);
+                       errp);
     if (blk == NULL) {
-        error_propagate(errp, local_err);
         ret = -EIO;
         goto exit;
     }
diff --git a/block/vpc.c b/block/vpc.c
index c055591641..36412f764d 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -1115,9 +1115,8 @@ static int coroutine_fn vpc_co_create_opts(BlockDriver *drv,
     }
 
     /* Create and open the file (protocol layer) */
-    ret = bdrv_create_file(filename, opts, &local_err);
+    ret = bdrv_create_file(filename, opts, errp);
     if (ret < 0) {
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/blockdev.c b/blockdev.c
index 31d5eaf6bf..b66863c42a 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3147,9 +3147,8 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp)
                            arg->has_copy_mode, arg->copy_mode,
                            arg->has_auto_finalize, arg->auto_finalize,
                            arg->has_auto_dismiss, arg->auto_dismiss,
-                           &local_err);
+                           errp);
     bdrv_unref(target_bs);
-    error_propagate(errp, local_err);
 out:
     aio_context_release(aio_context);
 }
@@ -3177,7 +3176,6 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
     AioContext *aio_context;
     AioContext *old_context;
     BlockMirrorBackingMode backing_mode = MIRROR_LEAVE_BACKING_CHAIN;
-    Error *local_err = NULL;
     bool zero_target;
     int ret;
 
@@ -3219,8 +3217,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char *job_id,
                            has_copy_mode, copy_mode,
                            has_auto_finalize, auto_finalize,
                            has_auto_dismiss, auto_dismiss,
-                           &local_err);
-    error_propagate(errp, local_err);
+                           errp);
 out:
     aio_context_release(aio_context);
 }
@@ -3439,8 +3436,7 @@ void qmp_change_backing_file(const char *device,
     }
 
     if (ro) {
-        bdrv_reopen_set_read_only(image_bs, true, &local_err);
-        error_propagate(errp, local_err);
+        bdrv_reopen_set_read_only(image_bs, true, errp);
     }
 
 out:
diff --git a/dump/dump.c b/dump/dump.c
index 248ea06370..383bc7876b 100644
--- a/dump/dump.c
+++ b/dump/dump.c
@@ -1031,14 +1031,11 @@ out:
 
 static void write_dump_header(DumpState *s, Error **errp)
 {
-     Error *local_err = NULL;
-
     if (s->dump_info.d_class == ELFCLASS32) {
-        create_header32(s, &local_err);
+        create_header32(s, errp);
     } else {
-        create_header64(s, &local_err);
+        create_header64(s, errp);
     }
-    error_propagate(errp, local_err);
 }
 
 static size_t dump_bitmap_get_bufsize(DumpState *s)
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index 8d6156578f..6705220380 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -316,9 +316,8 @@ int ics_set_kvm_state(ICSState *ics, Error **errp)
             continue;
         }
 
-        ret = ics_set_kvm_state_one(ics, i, &local_err);
+        ret = ics_set_kvm_state_one(ics, i, errp);
         if (ret < 0) {
-            error_propagate(errp, local_err);
             return ret;
         }
     }
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 0517901024..be8535304e 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -741,7 +741,6 @@ static void s390_pcihost_realize(DeviceState *dev, Error **errp)
     BusState *bus;
     PCIHostState *phb = PCI_HOST_BRIDGE(dev);
     S390pciState *s = S390_PCI_HOST_BRIDGE(dev);
-    Error *local_err = NULL;
 
     DPRINTF("host_init\n");
 
@@ -765,8 +764,7 @@ static void s390_pcihost_realize(DeviceState *dev, Error **errp)
     QTAILQ_INIT(&s->zpci_devs);
 
     css_register_io_adapters(CSS_IO_ADAPTER_PCI, true, false,
-                             S390_ADAPTER_SUPPRESSIBLE, &local_err);
-    error_propagate(errp, local_err);
+                             S390_ADAPTER_SUPPRESSIBLE, errp);
 }
 
 static int s390_pci_msix_init(S390PCIBusDevice *pbdev)
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index ba27afe9f2..b17bda3b29 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -723,15 +723,13 @@ static bool usb_get_attached(Object *obj, Error **errp)
 static void usb_set_attached(Object *obj, bool value, Error **errp)
 {
     USBDevice *dev = USB_DEVICE(obj);
-    Error *err = NULL;
 
     if (dev->attached == value) {
         return;
     }
 
     if (value) {
-        usb_device_attach(dev, &err);
-        error_propagate(errp, err);
+        usb_device_attach(dev, errp);
     } else {
         usb_device_detach(dev);
     }
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 6838bcc4b3..fb51fc9f6e 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -116,7 +116,6 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp)
 {
 #ifdef CONFIG_KVM
     int irq_fd = event_notifier_get_fd(&vdev->intx.interrupt);
-    Error *err = NULL;
 
     if (vdev->no_kvm_intx || !kvm_irqfds_enabled() ||
         vdev->intx.route.mode != PCI_INTX_ENABLED ||
@@ -147,8 +146,7 @@ static void vfio_intx_enable_kvm(VFIOPCIDevice *vdev, Error **errp)
     if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0,
                                VFIO_IRQ_SET_ACTION_UNMASK,
                                event_notifier_get_fd(&vdev->intx.unmask),
-                               &err)) {
-        error_propagate(errp, err);
+                               errp)) {
         goto fail_vfio;
     }
 
@@ -294,8 +292,7 @@ static int vfio_intx_enable(VFIOPCIDevice *vdev, Error **errp)
     qemu_set_fd_handler(fd, vfio_intx_interrupt, NULL, vdev);
 
     if (vfio_set_irq_signaling(&vdev->vbasedev, VFIO_PCI_INTX_IRQ_INDEX, 0,
-                               VFIO_IRQ_SET_ACTION_TRIGGER, fd, &err)) {
-        error_propagate(errp, err);
+                               VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) {
         qemu_set_fd_handler(fd, NULL, NULL, vdev);
         event_notifier_cleanup(&vdev->intx.interrupt);
         return -errno;
@@ -2741,9 +2738,8 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
     if (!pdev->failover_pair_id) {
         error_setg(&vdev->migration_blocker,
                 "VFIO device doesn't support migration");
-        ret = migrate_add_blocker(vdev->migration_blocker, &err);
+        ret = migrate_add_blocker(vdev->migration_blocker, errp);
         if (ret) {
-            error_propagate(errp, err);
             error_free(vdev->migration_blocker);
             vdev->migration_blocker = NULL;
             return;
diff --git a/iothread.c b/iothread.c
index cb082b9b26..6f7ac976de 100644
--- a/iothread.c
+++ b/iothread.c
@@ -169,9 +169,8 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
 
     iothread->stopping = false;
     iothread->running = true;
-    iothread->ctx = aio_context_new(&local_error);
+    iothread->ctx = aio_context_new(errp);
     if (!iothread->ctx) {
-        error_propagate(errp, local_error);
         return;
     }
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 13a13a811a..e38030429b 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -808,9 +808,8 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
         qemu_opts_del(opts);
         return;
     }
-    dev = qdev_device_add(opts, &local_err);
+    dev = qdev_device_add(opts, errp);
     if (!dev) {
-        error_propagate(errp, local_err);
         qemu_opts_del(opts);
         return;
     }
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 5ba56327dd..49dd792d2c 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -2202,9 +2202,8 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
     }
 
     server = os_version.wProductType != VER_NT_WORKSTATION;
-    product_name = ga_get_win_product_name(&local_err);
+    product_name = ga_get_win_product_name(errp);
     if (product_name == NULL) {
-        error_propagate(errp, local_err);
         return NULL;
     }
 
diff --git a/util/main-loop.c b/util/main-loop.c
index eda63fe4e0..f69f055013 100644
--- a/util/main-loop.c
+++ b/util/main-loop.c
@@ -148,7 +148,6 @@ int qemu_init_main_loop(Error **errp)
 {
     int ret;
     GSource *src;
-    Error *local_error = NULL;
 
     init_clocks(qemu_timer_notify_cb);
 
@@ -157,9 +156,8 @@ int qemu_init_main_loop(Error **errp)
         return ret;
     }
 
-    qemu_aio_context = aio_context_new(&local_error);
+    qemu_aio_context = aio_context_new(errp);
     if (!qemu_aio_context) {
-        error_propagate(errp, local_error);
         return -EMFILE;
     }
     qemu_notify_bh = qemu_bh_new(notify_event_cb, NULL);
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 0ebfd97a98..fd667ea523 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -899,10 +899,9 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
      * (if unlikely) future misuse:
      */
     assert(!defaults || list->merge_lists);
-    opts = qemu_opts_create(list, id, !defaults, &local_err);
+    opts = qemu_opts_create(list, id, !defaults, errp);
     g_free(id);
     if (opts == NULL) {
-        error_propagate(errp, local_err);
         return NULL;
     }
 
-- 
2.26.2



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

* [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (5 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 06/46] error: Avoid error_propagate() when error is not used here Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 18:21   ` Eric Blake
  2020-06-26 17:21   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
                   ` (39 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When all we do with an Error we receive into a local variable is
propagating to somewhere else, we can just as well receive it there
right away.  The previous commit did that for simple cases with
Coccinelle.  Do it for a few more manually.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 blockdev.c     |  5 +----
 hw/core/numa.c | 44 ++++++++++++++------------------------------
 qdev-monitor.c | 11 ++++-------
 3 files changed, 19 insertions(+), 41 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index b66863c42a..73736a4eaf 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
     }
 
     /* Actual block device init: Functionality shared with blockdev-add */
-    blk = blockdev_init(filename, bs_opts, &local_err);
+    blk = blockdev_init(filename, bs_opts, errp);
     bs_opts = NULL;
     if (!blk) {
-        error_propagate(errp, local_err);
         goto fail;
-    } else {
-        assert(!local_err);
     }
 
     /* Create legacy DriveInfo */
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 5f81900f88..aa8c6be210 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -449,40 +449,33 @@ void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
 
 void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
 {
-    Error *err = NULL;
-
     if (!ms->numa_state) {
         error_setg(errp, "NUMA is not supported by this machine-type");
-        goto end;
+        return;
     }
 
     switch (object->type) {
     case NUMA_OPTIONS_TYPE_NODE:
-        parse_numa_node(ms, &object->u.node, &err);
-        if (err) {
-            goto end;
-        }
+        parse_numa_node(ms, &object->u.node, errp);
         break;
     case NUMA_OPTIONS_TYPE_DIST:
-        parse_numa_distance(ms, &object->u.dist, &err);
-        if (err) {
-            goto end;
-        }
+        parse_numa_distance(ms, &object->u.dist, errp);
         break;
     case NUMA_OPTIONS_TYPE_CPU:
         if (!object->u.cpu.has_node_id) {
-            error_setg(&err, "Missing mandatory node-id property");
-            goto end;
+            error_setg(errp, "Missing mandatory node-id property");
+            return;
         }
         if (!ms->numa_state->nodes[object->u.cpu.node_id].present) {
-            error_setg(&err, "Invalid node-id=%" PRId64 ", NUMA node must be "
-                "defined with -numa node,nodeid=ID before it's used with "
-                "-numa cpu,node-id=ID", object->u.cpu.node_id);
-            goto end;
+            error_setg(errp, "Invalid node-id=%" PRId64 ", NUMA node must be "
+                       "defined with -numa node,nodeid=ID before it's used with "
+                       "-numa cpu,node-id=ID", object->u.cpu.node_id);
+            return;
         }
 
-        machine_set_cpu_numa_node(ms, qapi_NumaCpuOptions_base(&object->u.cpu),
-                                  &err);
+        machine_set_cpu_numa_node(ms,
+                                  qapi_NumaCpuOptions_base(&object->u.cpu),
+                                  errp);
         break;
     case NUMA_OPTIONS_TYPE_HMAT_LB:
         if (!ms->numa_state->hmat_enabled) {
@@ -492,10 +485,7 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
             return;
         }
 
-        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, &err);
-        if (err) {
-            goto end;
-        }
+        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, errp);
         break;
     case NUMA_OPTIONS_TYPE_HMAT_CACHE:
         if (!ms->numa_state->hmat_enabled) {
@@ -505,17 +495,11 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
             return;
         }
 
-        parse_numa_hmat_cache(ms, &object->u.hmat_cache, &err);
-        if (err) {
-            goto end;
-        }
+        parse_numa_hmat_cache(ms, &object->u.hmat_cache, errp);
         break;
     default:
         abort();
     }
-
-end:
-    error_propagate(errp, err);
 }
 
 static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
diff --git a/qdev-monitor.c b/qdev-monitor.c
index e38030429b..40c34bb9cf 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -600,7 +600,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     const char *driver, *path;
     DeviceState *dev = NULL;
     BusState *bus = NULL;
-    Error *err = NULL;
     bool hide;
 
     driver = qemu_opt_get(opts, "driver");
@@ -655,15 +654,14 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     dev = qdev_new(driver);
 
     /* Check whether the hotplug is allowed by the machine */
-    if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
+    if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
         /* Error must be set in the machine hook */
-        assert(err);
         goto err_del_dev;
     }
 
     if (!bus && qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) {
         /* No bus, no machine hotplug handler --> device is not hotpluggable */
-        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
+        error_setg(errp, "Device '%s' can not be hotplugged on this machine",
                    driver);
         goto err_del_dev;
     }
@@ -671,19 +669,18 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
     qdev_set_id(dev, qemu_opts_id(opts));
 
     /* set properties */
-    if (qemu_opt_foreach(opts, set_property, dev, &err)) {
+    if (qemu_opt_foreach(opts, set_property, dev, errp)) {
         goto err_del_dev;
     }
 
     dev->opts = opts;
-    if (!qdev_realize(DEVICE(dev), bus, &err)) {
+    if (!qdev_realize(DEVICE(dev), bus, errp)) {
         dev->opts = NULL;
         goto err_del_dev;
     }
     return dev;
 
 err_del_dev:
-    error_propagate(errp, err);
     if (dev) {
         object_unparent(OBJECT(dev));
         object_unref(OBJECT(dev));
-- 
2.26.2



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

* [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (6 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 07/46] error: Avoid more " Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 18:32   ` Eric Blake
  2020-06-26 18:22   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker() Markus Armbruster
                   ` (38 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Replace

    error_setg(&err, ...);
    error_propagate(errp, err);

by

    error_setg(errp, ...);

Related pattern:

    if (...) {
        error_setg(&err, ...);
        goto out;
    }
    ...
 out:
    error_propagate(errp, err);
    return;

When all paths to label out are that way, replace by

    if (...) {
        error_setg(errp, ...);
        return;
    }

and delete the label along with the error_propagate().

When we have at most one other path that actually needs to propagate,
and maybe one at the end that where propagation is unnecessary, e.g.

    foo(..., &err);
    if (err) {
        goto out;
    }
    ...
    bar(..., &err);
 out:
    error_propagate(errp, err);
    return;

move the error_propagate() to where it's needed, like

    if (...) {
        foo(..., &err);
        error_propagate(errp, err);
        return;
    }
    ...
    bar(..., errp);
    return;

and transform the error_setg() as above.

Bonus: the elimination of gotos will make later patches in this series
easier to review.

Candidates for conversion tracked down with this Coccinelle script:

    @@
    identifier err, errp;
    expression list args;
    @@
    -    error_setg(&err, args);
    +    error_setg(errp, args);
	 ... when != err
	 error_propagate(errp, err);

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 backends/cryptodev.c        | 11 +++---
 backends/hostmem-file.c     | 19 +++-------
 backends/hostmem-memfd.c    | 15 ++++----
 backends/hostmem.c          | 27 ++++++--------
 block/throttle-groups.c     | 22 +++++------
 hw/hyperv/vmbus.c           |  5 +--
 hw/i386/pc.c                | 35 ++++++------------
 hw/mem/nvdimm.c             | 17 ++++-----
 hw/mem/pc-dimm.c            | 14 +++----
 hw/misc/aspeed_sdmc.c       |  3 +-
 hw/ppc/rs6000_mc.c          |  9 ++---
 hw/ppc/spapr.c              | 73 ++++++++++++++++---------------------
 hw/ppc/spapr_pci.c          | 14 +++----
 hw/s390x/ipl.c              | 23 +++++-------
 hw/s390x/sclp.c             | 12 ++----
 hw/xen/xen_pt_config_init.c |  3 +-
 iothread.c                  | 12 +++---
 net/colo-compare.c          | 20 ++++------
 net/dump.c                  | 10 ++---
 net/filter-buffer.c         | 10 ++---
 qga/commands-win32.c        | 16 +++-----
 21 files changed, 151 insertions(+), 219 deletions(-)

diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index a3841c4e41..8645f297e3 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -159,16 +159,15 @@ cryptodev_backend_set_queues(Object *obj, Visitor *v, const char *name,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err, "Property '%s.%s' doesn't take value '%"
-                   PRIu32 "'", object_get_typename(obj), name, value);
-        goto out;
+        error_setg(errp, "Property '%s.%s' doesn't take value '%" PRIu32 "'",
+                   object_get_typename(obj), name, value);
+        return;
     }
     backend->conf.peers.queues = value;
-out:
-    error_propagate(errp, local_err);
 }
 
 static void
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index cdabb412e6..098c8e6e64 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -114,19 +114,17 @@ static void file_memory_backend_set_align(Object *o, Visitor *v,
     uint64_t val;
 
     if (host_memory_backend_mr_inited(backend)) {
-        error_setg(&local_err, "cannot change property '%s' of %s",
-                   name, object_get_typename(o));
-        goto out;
+        error_setg(errp, "cannot change property '%s' of %s", name,
+                   object_get_typename(o));
+        return;
     }
 
     visit_type_size(v, name, &val, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     fb->align = val;
-
- out:
-    error_propagate(errp, local_err);
 }
 
 static bool file_memory_backend_get_pmem(Object *o, Error **errp)
@@ -140,7 +138,6 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
 
     if (host_memory_backend_mr_inited(backend)) {
-
         error_setg(errp, "cannot change property 'pmem' of %s.",
                    object_get_typename(o));
         return;
@@ -148,13 +145,9 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
 
 #ifndef CONFIG_LIBPMEM
     if (value) {
-        Error *local_err = NULL;
-
-        error_setg(&local_err,
-                   "Lack of libpmem support while setting the 'pmem=on'"
+        error_setg(errp, "Lack of libpmem support while setting the 'pmem=on'"
                    " of %s. We can't ensure data persistence.",
                    object_get_typename(o));
-        error_propagate(errp, local_err);
         return;
     }
 #endif
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 1b5e4bfe0d..9582c7f8fc 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -81,22 +81,21 @@ memfd_backend_set_hugetlbsize(Object *obj, Visitor *v, const char *name,
     uint64_t value;
 
     if (host_memory_backend_mr_inited(MEMORY_BACKEND(obj))) {
-        error_setg(&local_err, "cannot change property value");
-        goto out;
+        error_setg(errp, "cannot change property value");
+        return;
     }
 
     visit_type_size(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err, "Property '%s.%s' doesn't take value '%"
-                   PRIu64 "'", object_get_typename(obj), name, value);
-        goto out;
+        error_setg(errp, "Property '%s.%s' doesn't take value '%" PRIu64 "'",
+                   object_get_typename(obj), name, value);
+        return;
     }
     m->hugetlbsize = value;
-out:
-    error_propagate(errp, local_err);
 }
 
 static void
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 61e3255f5c..2a0c92d458 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -58,24 +58,23 @@ host_memory_backend_set_size(Object *obj, Visitor *v, const char *name,
     uint64_t value;
 
     if (host_memory_backend_mr_inited(backend)) {
-        error_setg(&local_err, "cannot change property %s of %s ",
-                   name, object_get_typename(obj));
-        goto out;
+        error_setg(errp, "cannot change property %s of %s ", name,
+                   object_get_typename(obj));
+        return;
     }
 
     visit_type_size(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err,
+        error_setg(errp,
                    "property '%s' of %s doesn't take value '%" PRIu64 "'",
                    name, object_get_typename(obj), value);
-        goto out;
+        return;
     }
     backend->size = value;
-out:
-    error_propagate(errp, local_err);
 }
 
 static void
@@ -259,17 +258,15 @@ static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (value <= 0) {
-        error_setg(&local_err,
-                   "property '%s' of %s doesn't take value '%d'",
-                   name, object_get_typename(obj), value);
-        goto out;
+        error_setg(errp, "property '%s' of %s doesn't take value '%d'", name,
+                   object_get_typename(obj), value);
+        return;
     }
     backend->prealloc_threads = value;
-out:
-    error_propagate(errp, local_err);
 }
 
 static void host_memory_backend_init(Object *obj)
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 784fa4a16c..60a2aad75a 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -819,17 +819,18 @@ static void throttle_group_set(Object *obj, Visitor *v, const char * name,
      * transaction, as certain combinations are invalid.
      */
     if (tg->is_initialized) {
-        error_setg(&local_err, "Property cannot be set after initialization");
-        goto ret;
+        error_setg(errp, "Property cannot be set after initialization");
+        return;
     }
 
     visit_type_int64(v, name, &value, &local_err);
     if (local_err) {
-        goto ret;
+        error_propagate(errp, local_err);
+        return;
     }
     if (value < 0) {
-        error_setg(&local_err, "Property values cannot be negative");
-        goto ret;
+        error_setg(errp, "Property values cannot be negative");
+        return;
     }
 
     cfg = &tg->ts.cfg;
@@ -842,9 +843,9 @@ static void throttle_group_set(Object *obj, Visitor *v, const char * name,
         break;
     case BURST_LENGTH:
         if (value > UINT_MAX) {
-            error_setg(&local_err, "%s value must be in the"
-                       "range [0, %u]", info->name, UINT_MAX);
-            goto ret;
+            error_setg(errp, "%s value must be in the" "range [0, %u]",
+                       info->name, UINT_MAX);
+            return;
         }
         cfg->buckets[info->type].burst_length = value;
         break;
@@ -852,11 +853,6 @@ static void throttle_group_set(Object *obj, Visitor *v, const char * name,
         cfg->op_size = value;
         break;
     }
-
-ret:
-    error_propagate(errp, local_err);
-    return;
-
 }
 
 static void throttle_group_get(Object *obj, Visitor *v, const char *name,
diff --git a/hw/hyperv/vmbus.c b/hw/hyperv/vmbus.c
index f371240176..569dcf8fb3 100644
--- a/hw/hyperv/vmbus.c
+++ b/hw/hyperv/vmbus.c
@@ -1459,8 +1459,8 @@ static void create_channels(VMBus *vmbus, VMBusDevice *dev, Error **errp)
 
     dev->num_channels = vdc->num_channels ? vdc->num_channels(dev) : 1;
     if (dev->num_channels < 1) {
-        error_setg(&err, "invalid #channels: %u", dev->num_channels);
-        goto error_out;
+        error_setg(errp, "invalid #channels: %u", dev->num_channels);
+        return;
     }
 
     dev->channels = g_new0(VMBusChannel, dev->num_channels);
@@ -1477,7 +1477,6 @@ err_init:
     while (i--) {
         deinit_channel(&dev->channels[i]);
     }
-error_out:
     error_propagate(errp, err);
 }
 
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index f670bcd6e6..70d832536b 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1352,7 +1352,6 @@ out:
 static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
 
     /*
@@ -1361,21 +1360,18 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
      * addition to cover this case.
      */
     if (!pcms->acpi_dev || !x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
-        error_setg(&local_err,
+        error_setg(errp,
                    "memory hotplug is not enabled: missing acpi device or acpi disabled");
-        goto out;
+        return;
     }
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
-        error_setg(&local_err,
-                   "nvdimm device hot unplug is not supported yet.");
-        goto out;
+        error_setg(errp, "nvdimm device hot unplug is not supported yet.");
+        return;
     }
 
     hotplug_handler_unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev,
-                                   &local_err);
-out:
-    error_propagate(errp, local_err);
+                                   errp);
 }
 
 static void pc_memory_unplug(HotplugHandler *hotplug_dev,
@@ -1455,31 +1451,23 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
     int idx = -1;
-    Error *local_err = NULL;
     X86CPU *cpu = X86_CPU(dev);
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
 
     if (!pcms->acpi_dev) {
-        error_setg(&local_err, "CPU hot unplug not supported without ACPI");
-        goto out;
+        error_setg(errp, "CPU hot unplug not supported without ACPI");
+        return;
     }
 
     pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, &idx);
     assert(idx != -1);
     if (idx == 0) {
-        error_setg(&local_err, "Boot CPU is unpluggable");
-        goto out;
+        error_setg(errp, "Boot CPU is unpluggable");
+        return;
     }
 
     hotplug_handler_unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev,
-                                   &local_err);
-    if (local_err) {
-        goto out;
-    }
-
- out:
-    error_propagate(errp, local_err);
-
+                                   errp);
 }
 
 static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev,
@@ -1885,10 +1873,9 @@ static void pc_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
         return;
     }
     if (value > 4 * GiB) {
-        error_setg(&error,
+        error_setg(errp,
                    "Machine option 'max-ram-below-4g=%"PRIu64
                    "' expects size less than or equal to 4G", value);
-        error_propagate(errp, error);
         return;
     }
 
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 76f66e0b19..93f7af1c58 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -49,24 +49,23 @@ static void nvdimm_set_label_size(Object *obj, Visitor *v, const char *name,
     uint64_t value;
 
     if (nvdimm->nvdimm_mr) {
-        error_setg(&local_err, "cannot change property value");
-        goto out;
+        error_setg(errp, "cannot change property value");
+        return;
     }
 
     visit_type_size(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (value < MIN_NAMESPACE_LABEL_SIZE) {
-        error_setg(&local_err, "Property '%s.%s' (0x%" PRIx64 ") is required"
-                   " at least 0x%lx", object_get_typename(obj),
-                   name, value, MIN_NAMESPACE_LABEL_SIZE);
-        goto out;
+        error_setg(errp, "Property '%s.%s' (0x%" PRIx64 ") is required"
+                   " at least 0x%lx", object_get_typename(obj), name, value,
+                   MIN_NAMESPACE_LABEL_SIZE);
+        return;
     }
 
     nvdimm->label_size = value;
-out:
-    error_propagate(errp, local_err);
 }
 
 static void nvdimm_get_uuid(Object *obj, Visitor *v, const char *name,
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index f2a86ec4ee..50e049ce1e 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -44,24 +44,24 @@ void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,
                                    &error_abort);
     if ((slot < 0 || slot >= machine->ram_slots) &&
          slot != PC_DIMM_UNASSIGNED_SLOT) {
-        error_setg(&local_err, "invalid slot number %d, valid range is [0-%"
-                   PRIu64 "]", slot, machine->ram_slots - 1);
-        goto out;
+        error_setg(errp,
+                   "invalid slot number %d, valid range is [0-%" PRIu64 "]",
+                   slot, machine->ram_slots - 1);
+        return;
     }
 
     slot = pc_dimm_get_free_slot(slot == PC_DIMM_UNASSIGNED_SLOT ? NULL : &slot,
                                  machine->ram_slots, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     object_property_set_int(OBJECT(dimm), slot, PC_DIMM_SLOT_PROP,
                             &error_abort);
     trace_mhp_pc_dimm_assigned_slot(slot);
 
     memory_device_pre_plug(MEMORY_DEVICE(dimm), machine, legacy_align,
-                           &local_err);
-out:
-    error_propagate(errp, local_err);
+                           errp);
 }
 
 void pc_dimm_plug(PCDIMMDevice *dimm, MachineState *machine, Error **errp)
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 25e1e58356..6fefb05695 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -241,9 +241,8 @@ static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
     }
 
     sz = size_to_str(value);
-    error_setg(&local_err, "Invalid RAM size %s", sz);
+    error_setg(errp, "Invalid RAM size %s", sz);
     g_free(sz);
-    error_propagate(errp, local_err);
 }
 
 static void aspeed_sdmc_initfn(Object *obj)
diff --git a/hw/ppc/rs6000_mc.c b/hw/ppc/rs6000_mc.c
index f8a498bd8a..ce97365f5e 100644
--- a/hw/ppc/rs6000_mc.c
+++ b/hw/ppc/rs6000_mc.c
@@ -169,7 +169,8 @@ static void rs6000mc_realize(DeviceState *dev, Error **errp)
             memory_region_init_ram(&s->simm[socket], OBJECT(dev), name,
                                    s->simm_size[socket] * MiB, &local_err);
             if (local_err) {
-                goto out;
+                error_propagate(errp, local_err);
+                return;
             }
             memory_region_add_subregion_overlap(get_system_memory(), 0,
                                                 &s->simm[socket], socket);
@@ -177,10 +178,10 @@ static void rs6000mc_realize(DeviceState *dev, Error **errp)
     }
     if (ram_size) {
         /* unable to push all requested RAM in SIMMs */
-        error_setg(&local_err, "RAM size incompatible with this board. "
+        error_setg(errp, "RAM size incompatible with this board. "
                    "Try again with something else, like %" PRId64 " MB",
                    s->ram_size / MiB - ram_size);
-        goto out;
+        return;
     }
 
     if (s->autoconfigure) {
@@ -196,8 +197,6 @@ static void rs6000mc_realize(DeviceState *dev, Error **errp)
 
     isa_register_portio_list(ISA_DEVICE(dev), &s->portio, 0x0,
                              rs6000mc_port_list, s, "rs6000mc");
-out:
-    error_propagate(errp, local_err);
 }
 
 static const VMStateDescription vmstate_rs6000mc = {
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 83b974870c..bcd094ba3b 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2497,23 +2497,23 @@ static void spapr_set_vsmt_mode(SpaprMachineState *spapr, Error **errp)
     unsigned int smp_threads = ms->smp.threads;
 
     if (!kvm_enabled() && (smp_threads > 1)) {
-        error_setg(&local_err, "TCG cannot support more than 1 thread/core "
-                     "on a pseries machine");
-        goto out;
+        error_setg(errp, "TCG cannot support more than 1 thread/core "
+                   "on a pseries machine");
+        return;
     }
     if (!is_power_of_2(smp_threads)) {
-        error_setg(&local_err, "Cannot support %d threads/core on a pseries "
-                     "machine because it must be a power of 2", smp_threads);
-        goto out;
+        error_setg(errp, "Cannot support %d threads/core on a pseries "
+                   "machine because it must be a power of 2", smp_threads);
+        return;
     }
 
     /* Detemine the VSMT mode to use: */
     if (vsmt_user) {
         if (spapr->vsmt < smp_threads) {
-            error_setg(&local_err, "Cannot support VSMT mode %d"
-                         " because it must be >= threads/core (%d)",
-                         spapr->vsmt, smp_threads);
-            goto out;
+            error_setg(errp, "Cannot support VSMT mode %d"
+                       " because it must be >= threads/core (%d)",
+                       spapr->vsmt, smp_threads);
+            return;
         }
         /* In this case, spapr->vsmt has been set by the command line */
     } else if (!smc->smp_threads_vsmt) {
@@ -2543,8 +2543,6 @@ static void spapr_set_vsmt_mode(SpaprMachineState *spapr, Error **errp)
              * behaviour will be correct */
             if ((kvm_smt >= smp_threads) && ((spapr->vsmt % kvm_smt) == 0)) {
                 warn_report_err(local_err);
-                local_err = NULL;
-                goto out;
             } else {
                 if (!vsmt_user) {
                     error_append_hint(&local_err,
@@ -2554,13 +2552,11 @@ static void spapr_set_vsmt_mode(SpaprMachineState *spapr, Error **errp)
                                       smp_threads, kvm_smt, spapr->vsmt);
                 }
                 kvmppc_error_append_smt_possible_hint(&local_err);
-                goto out;
+                error_propagate(errp, local_err);
             }
         }
     }
     /* else TCG: nothing to do currently */
-out:
-    error_propagate(errp, local_err);
 }
 
 static void spapr_init_cpus(SpaprMachineState *spapr)
@@ -3686,9 +3682,8 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
     SpaprDrc *drc;
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
-        error_setg(&local_err,
-                   "nvdimm device hot unplug is not supported yet.");
-        goto out;
+        error_setg(errp, "nvdimm device hot unplug is not supported yet.");
+        return;
     }
 
     size = memory_device_get_region_size(MEMORY_DEVICE(dimm), &error_abort);
@@ -3697,7 +3692,8 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
     addr_start = object_property_get_uint(OBJECT(dimm), PC_DIMM_ADDR_PROP,
                                          &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
 
     /*
@@ -3707,10 +3703,9 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
      * bail out to avoid detaching DRCs that were already released.
      */
     if (spapr_pending_dimm_unplugs_find(spapr, dimm)) {
-        error_setg(&local_err,
-                   "Memory unplug already in progress for device %s",
+        error_setg(errp, "Memory unplug already in progress for device %s",
                    dev->id);
-        goto out;
+        return;
     }
 
     spapr_pending_dimm_unplugs_add(spapr, nr_lmbs, dimm);
@@ -3729,8 +3724,6 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
                           addr_start / SPAPR_MEMORY_BLOCK_SIZE);
     spapr_hotplug_req_remove_by_count_indexed(SPAPR_DR_CONNECTOR_TYPE_LMB,
                                               nr_lmbs, spapr_drc_index(drc));
-out:
-    error_propagate(errp, local_err);
 }
 
 /* Callback to be called during DRC release. */
@@ -3891,7 +3884,6 @@ static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     MachineState *machine = MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
-    Error *local_err = NULL;
     CPUCore *cc = CPU_CORE(dev);
     const char *base_core_type = spapr_get_cpu_core_type(machine->cpu_type);
     const char *type = object_get_typename(OBJECT(dev));
@@ -3900,18 +3892,18 @@ static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     unsigned int smp_threads = machine->smp.threads;
 
     if (dev->hotplugged && !mc->has_hotpluggable_cpus) {
-        error_setg(&local_err, "CPU hotplug not supported for this machine");
-        goto out;
+        error_setg(errp, "CPU hotplug not supported for this machine");
+        return;
     }
 
     if (strcmp(base_core_type, type)) {
-        error_setg(&local_err, "CPU core type should be %s", base_core_type);
-        goto out;
+        error_setg(errp, "CPU core type should be %s", base_core_type);
+        return;
     }
 
     if (cc->core_id % smp_threads) {
-        error_setg(&local_err, "invalid core id %d", cc->core_id);
-        goto out;
+        error_setg(errp, "invalid core id %d", cc->core_id);
+        return;
     }
 
     /*
@@ -3921,26 +3913,23 @@ static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
      * total vcpus not a multiple of threads-per-core.
      */
     if (mc->has_hotpluggable_cpus && (cc->nr_threads != smp_threads)) {
-        error_setg(&local_err, "invalid nr-threads %d, must be %d",
-                   cc->nr_threads, smp_threads);
-        goto out;
+        error_setg(errp, "invalid nr-threads %d, must be %d", cc->nr_threads,
+                   smp_threads);
+        return;
     }
 
     core_slot = spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index);
     if (!core_slot) {
-        error_setg(&local_err, "core id %d out of range", cc->core_id);
-        goto out;
+        error_setg(errp, "core id %d out of range", cc->core_id);
+        return;
     }
 
     if (core_slot->cpu) {
-        error_setg(&local_err, "core %d already populated", cc->core_id);
-        goto out;
+        error_setg(errp, "core %d already populated", cc->core_id);
+        return;
     }
 
-    numa_cpu_pre_plug(core_slot, dev, &local_err);
-
-out:
-    error_propagate(errp, local_err);
+    numa_cpu_pre_plug(core_slot, dev, errp);
 }
 
 int spapr_phb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 0f00e2421f..c475d0c6ee 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1499,10 +1499,10 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
          * we need to let them know it's not enabled
          */
         if (plugged_dev->hotplugged) {
-            error_setg(&local_err, QERR_BUS_NO_HOTPLUG,
+            error_setg(errp, QERR_BUS_NO_HOTPLUG,
                        object_get_typename(OBJECT(phb)));
         }
-        goto out;
+        return;
     }
 
     g_assert(drc);
@@ -1517,15 +1517,16 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
      */
     if (plugged_dev->hotplugged && bus->devices[PCI_DEVFN(slotnr, 0)] &&
         PCI_FUNC(pdev->devfn) != 0) {
-        error_setg(&local_err, "PCI: slot %d function 0 already ocuppied by %s,"
+        error_setg(errp, "PCI: slot %d function 0 already ocuppied by %s,"
                    " additional functions can no longer be exposed to guest.",
                    slotnr, bus->devices[PCI_DEVFN(slotnr, 0)]->name);
-        goto out;
+        return;
     }
 
     spapr_drc_attach(drc, DEVICE(pdev), &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
 
     /* If this is function 0, signal hotplug for all the device functions.
@@ -1551,9 +1552,6 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
             }
         }
     }
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static void spapr_pci_bridge_unplug(SpaprPhbState *phb,
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index ce21494c08..df5b4b311a 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -117,7 +117,6 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
     uint64_t pentry;
     char *magic;
     int kernel_size;
-    Error *err = NULL;
 
     int bios_size;
     char *bios_filename;
@@ -135,8 +134,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
 
         bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
         if (bios_filename == NULL) {
-            error_setg(&err, "could not find stage1 bootloader");
-            goto error;
+            error_setg(errp, "could not find stage1 bootloader");
+            return;
         }
 
         bios_size = load_elf(bios_filename, NULL,
@@ -155,8 +154,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
         g_free(bios_filename);
 
         if (bios_size == -1) {
-            error_setg(&err, "could not load bootloader '%s'", bios_name);
-            goto error;
+            error_setg(errp, "could not load bootloader '%s'", bios_name);
+            return;
         }
 
         /* default boot target is the bios */
@@ -170,8 +169,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
         if (kernel_size < 0) {
             kernel_size = load_image_targphys(ipl->kernel, 0, ram_size);
             if (kernel_size < 0) {
-                error_setg(&err, "could not load kernel '%s'", ipl->kernel);
-                goto error;
+                error_setg(errp, "could not load kernel '%s'", ipl->kernel);
+                return;
             }
             /* if this is Linux use KERN_IMAGE_START */
             magic = rom_ptr(LINUX_MAGIC_ADDR, 6);
@@ -183,8 +182,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
                 if (ipl_psw) {
                     pentry = be32_to_cpu(*ipl_psw) & PSW_MASK_SHORT_ADDR;
                 } else {
-                    error_setg(&err, "Could not get IPL PSW");
-                    goto error;
+                    error_setg(errp, "Could not get IPL PSW");
+                    return;
                 }
             }
         }
@@ -217,8 +216,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
             initrd_size = load_image_targphys(ipl->initrd, initrd_offset,
                                               ram_size - initrd_offset);
             if (initrd_size == -1) {
-                error_setg(&err, "could not load initrd '%s'", ipl->initrd);
-                goto error;
+                error_setg(errp, "could not load initrd '%s'", ipl->initrd);
+                return;
             }
 
             /*
@@ -248,8 +247,6 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
      * TODO: there should be a better way to do this.
      */
     qemu_register_reset(resettable_cold_reset_fn, dev);
-error:
-    error_propagate(errp, err);
 }
 
 static Property s390_ipl_properties[] = {
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 03364343eb..a0ce444b4b 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -329,7 +329,6 @@ static void sclp_realize(DeviceState *dev, Error **errp)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
     SCLPDevice *sclp = SCLP(dev);
-    Error *err = NULL;
     uint64_t hw_limit;
     int ret;
 
@@ -338,20 +337,17 @@ static void sclp_realize(DeviceState *dev, Error **errp)
      * as we can't find a fitting bus via the qom tree, we have to add the
      * event facility to the sysbus, so e.g. a sclp console can be created.
      */
-    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err)) {
-        goto out;
+    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), errp)) {
+        return;
     }
 
     ret = s390_set_memory_limit(machine->maxram_size, &hw_limit);
     if (ret == -E2BIG) {
-        error_setg(&err, "host supports a maximum of %" PRIu64 " GB",
+        error_setg(errp, "host supports a maximum of %" PRIu64 " GB",
                    hw_limit / GiB);
     } else if (ret) {
-        error_setg(&err, "setting the guest size failed");
+        error_setg(errp, "setting the guest size failed");
     }
-
-out:
-    error_propagate(errp, err);
 }
 
 static void sclp_memory_init(SCLPDevice *sclp)
diff --git a/hw/xen/xen_pt_config_init.c b/hw/xen/xen_pt_config_init.c
index 31ec5add1d..d0d7c720a6 100644
--- a/hw/xen/xen_pt_config_init.c
+++ b/hw/xen/xen_pt_config_init.c
@@ -2052,10 +2052,9 @@ void xen_pt_config_init(XenPCIPassthroughState *s, Error **errp)
                                                   reg_grp_offset,
                                                   &reg_grp_entry->size);
             if (rc < 0) {
-                error_setg(&err, "Failed to initialize %d/%zu, type = 0x%x,"
+                error_setg(errp, "Failed to initialize %d/%zu, type = 0x%x,"
                            " rc: %d", i, ARRAY_SIZE(xen_pt_emu_reg_grps),
                            xen_pt_emu_reg_grps[i].grp_type, rc);
-                error_propagate(errp, err);
                 xen_pt_config_delete(s);
                 return;
             }
diff --git a/iothread.c b/iothread.c
index 6f7ac976de..b465e5c25b 100644
--- a/iothread.c
+++ b/iothread.c
@@ -244,13 +244,14 @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
 
     visit_type_int64(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
 
     if (value < 0) {
-        error_setg(&local_err, "%s value must be in range [0, %"PRId64"]",
+        error_setg(errp, "%s value must be in range [0, %" PRId64 "]",
                    info->name, INT64_MAX);
-        goto out;
+        return;
     }
 
     *field = value;
@@ -260,11 +261,8 @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
                                     iothread->poll_max_ns,
                                     iothread->poll_grow,
                                     iothread->poll_shrink,
-                                    &local_err);
+                                    errp);
     }
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static void iothread_class_init(ObjectClass *klass, void *class_data)
diff --git a/net/colo-compare.c b/net/colo-compare.c
index f15779dedc..b18b096a6e 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -1098,17 +1098,15 @@ static void compare_set_timeout(Object *obj, Visitor *v,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err, "Property '%s.%s' requires a positive value",
+        error_setg(errp, "Property '%s.%s' requires a positive value",
                    object_get_typename(obj), name);
-        goto out;
+        return;
     }
     s->compare_timeout = value;
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static void compare_get_expired_scan_cycle(Object *obj, Visitor *v,
@@ -1131,17 +1129,15 @@ static void compare_set_expired_scan_cycle(Object *obj, Visitor *v,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err, "Property '%s.%s' requires a positive value",
+        error_setg(errp, "Property '%s.%s' requires a positive value",
                    object_get_typename(obj), name);
-        goto out;
+        return;
     }
     s->expired_scan_cycle = value;
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static void compare_pri_rs_finalize(SocketReadState *pri_rs)
diff --git a/net/dump.c b/net/dump.c
index 61389e7dad..e8c4071d59 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -197,17 +197,15 @@ static void filter_dump_set_maxlen(Object *obj, Visitor *v, const char *name,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (value == 0) {
-        error_setg(&local_err, "Property '%s.%s' doesn't take value '%u'",
+        error_setg(errp, "Property '%s.%s' doesn't take value '%u'",
                    object_get_typename(obj), name, value);
-        goto out;
+        return;
     }
     nfds->maxlen = value;
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static char *file_dump_get_filename(Object *obj, Error **errp)
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index 93050f86cf..c3892911b8 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -175,17 +175,15 @@ static void filter_buffer_set_interval(Object *obj, Visitor *v,
 
     visit_type_uint32(v, name, &value, &local_err);
     if (local_err) {
-        goto out;
+        error_propagate(errp, local_err);
+        return;
     }
     if (!value) {
-        error_setg(&local_err, "Property '%s.%s' requires a positive value",
+        error_setg(errp, "Property '%s.%s' requires a positive value",
                    object_get_typename(obj), name);
-        goto out;
+        return;
     }
     s->interval = value;
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static void filter_buffer_init(Object *obj)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 49dd792d2c..b186ddb4aa 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -282,9 +282,8 @@ static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,
 
     HANDLE thread = CreateThread(NULL, 0, func, opaque, 0, NULL);
     if (!thread) {
-        error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
+        error_setg(errp, QERR_QGA_COMMAND_FAILED,
                    "failed to dispatch asynchronous command");
-        error_propagate(errp, local_err);
     }
 }
 
@@ -1274,31 +1273,28 @@ static void check_suspend_mode(GuestSuspendMode mode, Error **errp)
 
     ZeroMemory(&sys_pwr_caps, sizeof(sys_pwr_caps));
     if (!GetPwrCapabilities(&sys_pwr_caps)) {
-        error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
+        error_setg(errp, QERR_QGA_COMMAND_FAILED,
                    "failed to determine guest suspend capabilities");
-        goto out;
+        return;
     }
 
     switch (mode) {
     case GUEST_SUSPEND_MODE_DISK:
         if (!sys_pwr_caps.SystemS4) {
-            error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
+            error_setg(errp, QERR_QGA_COMMAND_FAILED,
                        "suspend-to-disk not supported by OS");
         }
         break;
     case GUEST_SUSPEND_MODE_RAM:
         if (!sys_pwr_caps.SystemS3) {
-            error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
+            error_setg(errp, QERR_QGA_COMMAND_FAILED,
                        "suspend-to-ram not supported by OS");
         }
         break;
     default:
-        error_setg(&local_err, QERR_INVALID_PARAMETER_VALUE, "mode",
+        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "mode",
                    "GuestSuspendMode");
     }
-
-out:
-    error_propagate(errp, local_err);
 }
 
 static DWORD WINAPI do_suspend(LPVOID opaque)
-- 
2.26.2



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

* [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (7 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:34   ` Eric Blake
  2020-06-29  8:29   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 10/46] qemu-option: Check return value instead of @err where convenient Markus Armbruster
                   ` (37 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When migrate_add_blocker(blocker, &errp) is followed by
error_propagate(errp, err), we can often just as well do
migrate_add_blocker(..., errp).

Do that with this Coccinelle script:

    @@
    expression blocker, err, errp;
    expression ret;
    @@
    -    ret = migrate_add_blocker(blocker, &err);
    -    if (err) {
    +    ret = migrate_add_blocker(blocker, errp);
    +    if (ret < 0) {
	     ... when != err;
    -        error_propagate(errp, err);
	     ...
	 }

    @@
    expression blocker, err, errp;
    @@
    -    migrate_add_blocker(blocker, &err);
    -    if (err) {
    +    if (migrate_add_blocker(blocker, errp) < 0) {
	     ... when != err;
    -        error_propagate(errp, err);
	     ...
	 }

Double-check @err is not used afterwards.  Dereferencing it would be
use after free, but checking whether it's null would be legitimate.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/parallels.c            | 5 ++---
 block/qcow.c                 | 6 ++----
 block/vdi.c                  | 6 ++----
 block/vhdx.c                 | 5 ++---
 block/vmdk.c                 | 6 ++----
 block/vpc.c                  | 5 ++---
 block/vvfat.c                | 5 ++---
 hw/display/virtio-gpu-base.c | 5 +----
 hw/intc/arm_gic_kvm.c        | 4 +---
 hw/intc/arm_gicv3_its_kvm.c  | 4 +---
 hw/intc/arm_gicv3_kvm.c      | 4 +---
 hw/misc/ivshmem.c            | 4 +---
 hw/scsi/vhost-scsi.c         | 4 +---
 13 files changed, 20 insertions(+), 43 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index a84ec6a518..860dbb80a2 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -862,9 +862,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The Parallels format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail;
     }
diff --git a/block/qcow.c b/block/qcow.c
index dca2a1fe7d..eefa3b63da 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -121,7 +121,6 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
     unsigned int len, i, shift;
     int ret;
     QCowHeader header;
-    Error *local_err = NULL;
     QCryptoBlockOpenOptions *crypto_opts = NULL;
     unsigned int cflags = 0;
     QDict *encryptopts = NULL;
@@ -314,9 +313,8 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The qcow format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail;
     }
diff --git a/block/vdi.c b/block/vdi.c
index 2f506a01ba..5fca67f52d 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -375,7 +375,6 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
     VdiHeader header;
     size_t bmap_size;
     int ret;
-    Error *local_err = NULL;
     QemuUUID uuid_link, uuid_parent;
 
     bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
@@ -496,9 +495,8 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The vdi format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail_free_bmap;
     }
diff --git a/block/vhdx.c b/block/vhdx.c
index ac5a9094c4..b9ef4ff074 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -1089,9 +1089,8 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The vhdx format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail;
     }
diff --git a/block/vmdk.c b/block/vmdk.c
index 9a09193f3b..28cec50f38 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1263,7 +1263,6 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
     int ret;
     BDRVVmdkState *s = bs->opaque;
     uint32_t magic;
-    Error *local_err = NULL;
 
     bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
                                BDRV_CHILD_IMAGE, false, errp);
@@ -1317,9 +1316,8 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The vmdk format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail;
     }
diff --git a/block/vpc.c b/block/vpc.c
index 36412f764d..7290f36514 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -448,9 +448,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
     error_setg(&s->migration_blocker, "The vpc format used by node '%s' "
                "does not support live migration",
                bdrv_get_device_or_node_name(bs));
-    ret = migrate_add_blocker(s->migration_blocker, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    ret = migrate_add_blocker(s->migration_blocker, errp);
+    if (ret < 0) {
         error_free(s->migration_blocker);
         goto fail;
     }
diff --git a/block/vvfat.c b/block/vvfat.c
index c65a98e3ee..a28e3fa442 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1282,9 +1282,8 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
                    "The vvfat (rw) format used by node '%s' "
                    "does not support live migration",
                    bdrv_get_device_or_node_name(bs));
-        ret = migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        ret = migrate_add_blocker(s->migration_blocker, errp);
+        if (ret < 0) {
             error_free(s->migration_blocker);
             goto fail;
         }
diff --git a/hw/display/virtio-gpu-base.c b/hw/display/virtio-gpu-base.c
index c159351be3..7961308606 100644
--- a/hw/display/virtio-gpu-base.c
+++ b/hw/display/virtio-gpu-base.c
@@ -128,7 +128,6 @@ virtio_gpu_base_device_realize(DeviceState *qdev,
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
     VirtIOGPUBase *g = VIRTIO_GPU_BASE(qdev);
-    Error *local_err = NULL;
     int i;
 
     if (g->conf.max_outputs > VIRTIO_GPU_MAX_SCANOUTS) {
@@ -139,9 +138,7 @@ virtio_gpu_base_device_realize(DeviceState *qdev,
     g->use_virgl_renderer = false;
     if (virtio_gpu_virgl_enabled(g->conf)) {
         error_setg(&g->migration_blocker, "virgl is not yet migratable");
-        migrate_add_blocker(g->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (migrate_add_blocker(g->migration_blocker, errp) < 0) {
             error_free(g->migration_blocker);
             return false;
         }
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index d7df423a7a..07b95143c9 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -517,9 +517,7 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
     if (!kvm_arm_gic_can_save_restore(s)) {
         error_setg(&s->migration_blocker, "This operating system kernel does "
                                           "not support vGICv2 migration");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (migrate_add_blocker(s->migration_blocker, errp) < 0) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
index ad0ebabc87..87bc4aeca1 100644
--- a/hw/intc/arm_gicv3_its_kvm.c
+++ b/hw/intc/arm_gicv3_its_kvm.c
@@ -113,9 +113,7 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
         GITS_CTLR)) {
         error_setg(&s->migration_blocker, "This operating system kernel "
                    "does not support vITS migration");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (migrate_add_blocker(s->migration_blocker, errp) < 0) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
index ca43bf87ca..eddd07c743 100644
--- a/hw/intc/arm_gicv3_kvm.c
+++ b/hw/intc/arm_gicv3_kvm.c
@@ -858,9 +858,7 @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
                                GICD_CTLR)) {
         error_setg(&s->migration_blocker, "This operating system kernel does "
                                           "not support vGICv3 migration");
-        migrate_add_blocker(s->migration_blocker, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (migrate_add_blocker(s->migration_blocker, errp) < 0) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index a8dc9b377d..fc128b25e2 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -898,9 +898,7 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp)
     if (!ivshmem_is_master(s)) {
         error_setg(&s->migration_blocker,
                    "Migration is disabled when using feature 'peer mode' in device 'ivshmem'");
-        migrate_add_blocker(s->migration_blocker, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (migrate_add_blocker(s->migration_blocker, errp) < 0) {
             error_free(s->migration_blocker);
             return;
         }
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index c1b012aea4..13b05af29b 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -207,9 +207,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
                 "When external environment supports it (Orchestrator migrates "
                 "target SCSI device state or use shared storage over network), "
                 "set 'migratable' property to true to enable migration.");
-        migrate_add_blocker(vsc->migration_blocker, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (migrate_add_blocker(vsc->migration_blocker, errp) < 0) {
             error_free(vsc->migration_blocker);
             goto free_virtio;
         }
-- 
2.26.2



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

* [PATCH 10/46] qemu-option: Check return value instead of @err where convenient
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (8 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:36   ` Eric Blake
  2020-06-29  9:11   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
                   ` (36 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Convert uses like

    opts = qemu_opts_create(..., &err);
    if (err) {
        ...
    }

to

    opts = qemu_opts_create(..., &err);
    if (!opts) {
        ...
    }

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/parallels.c  |  4 ++--
 blockdev.c         |  5 ++---
 qdev-monitor.c     |  6 ++----
 util/qemu-config.c | 10 ++++------
 util/qemu-option.c | 12 ++++--------
 5 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 860dbb80a2..b15c9ac28d 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -823,8 +823,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         }
     }
 
-    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, &local_err);
-    if (local_err != NULL) {
+    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
+    if (!opts) {
         goto fail_options;
     }
 
diff --git a/blockdev.c b/blockdev.c
index 73736a4eaf..481f36c543 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -504,9 +504,8 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
     /* Check common options by copying from bs_opts to opts, all other options
      * stay in bs_opts for processing by bdrv_open(). */
     id = qdict_get_try_str(bs_opts, "id");
-    opts = qemu_opts_create(&qemu_common_drive_opts, id, 1, &error);
-    if (error) {
-        error_propagate(errp, error);
+    opts = qemu_opts_create(&qemu_common_drive_opts, id, 1, errp);
+    if (!opts) {
         goto err_no_opts;
     }
 
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 40c34bb9cf..3143dd2afb 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -792,13 +792,11 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict)
 
 void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
 {
-    Error *local_err = NULL;
     QemuOpts *opts;
     DeviceState *dev;
 
-    opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, errp);
+    if (!opts) {
         return;
     }
     if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
diff --git a/util/qemu-config.c b/util/qemu-config.c
index 772f5a219e..c0d0e9b8ef 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -493,9 +493,8 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
         goto out;
     }
 
-    subopts = qemu_opts_create(opts, NULL, 0, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    subopts = qemu_opts_create(opts, NULL, 0, errp);
+    if (!subopts) {
         goto out;
     }
 
@@ -538,10 +537,9 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
             }
 
             opt_name = g_strdup_printf("%s.%u", opts->name, i++);
-            subopts = qemu_opts_create(opts, opt_name, 1, &local_err);
+            subopts = qemu_opts_create(opts, opt_name, 1, errp);
             g_free(opt_name);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            if (!subopts) {
                 goto out;
             }
 
diff --git a/util/qemu-option.c b/util/qemu-option.c
index fd667ea523..6119f971a4 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -670,11 +670,9 @@ void qemu_opts_set(QemuOptsList *list, const char *id,
                    const char *name, const char *value, Error **errp)
 {
     QemuOpts *opts;
-    Error *local_err = NULL;
 
-    opts = qemu_opts_create(list, id, 1, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    opts = qemu_opts_create(list, id, 1, errp);
+    if (!opts) {
         return;
     }
     qemu_opt_set(opts, name, value, errp);
@@ -1011,10 +1009,8 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
     QemuOpts *opts;
     const QDictEntry *entry;
 
-    opts = qemu_opts_create(list, qdict_get_try_str(qdict, "id"), 1,
-                            &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    opts = qemu_opts_create(list, qdict_get_try_str(qdict, "id"), 1, errp);
+    if (!opts) {
         return NULL;
     }
 
-- 
2.26.2



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

* [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (9 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 10/46] qemu-option: Check return value instead of @err where convenient Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:37   ` Eric Blake
                     ` (2 more replies)
  2020-06-24 16:43 ` [PATCH 12/46] qemu-option: Factor out helper find_default_by_name() Markus Armbruster
                   ` (35 subsequent siblings)
  46 siblings, 3 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

This is to make the next commit easier to review.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 6119f971a4..9941005c91 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -270,6 +270,7 @@ static void qemu_opt_del_all(QemuOpts *opts, const char *name)
 const char *qemu_opt_get(QemuOpts *opts, const char *name)
 {
     QemuOpt *opt;
+    const QemuOptDesc *desc;
 
     if (opts == NULL) {
         return NULL;
@@ -277,7 +278,7 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
 
     opt = qemu_opt_find(opts, name);
     if (!opt) {
-        const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name);
+        desc = find_desc_by_name(opts->list->desc, name);
         if (desc && desc->def_value_str) {
             return desc->def_value_str;
         }
@@ -348,6 +349,7 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
                                      bool defval, bool del)
 {
     QemuOpt *opt;
+    const QemuOptDesc *desc;
     bool ret = defval;
 
     if (opts == NULL) {
@@ -356,7 +358,7 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name);
+        desc = find_desc_by_name(opts->list->desc, name);
         if (desc && desc->def_value_str) {
             parse_option_bool(name, desc->def_value_str, &ret, &error_abort);
         }
@@ -384,6 +386,7 @@ static uint64_t qemu_opt_get_number_helper(QemuOpts *opts, const char *name,
                                            uint64_t defval, bool del)
 {
     QemuOpt *opt;
+    const QemuOptDesc *desc;
     uint64_t ret = defval;
 
     if (opts == NULL) {
@@ -392,7 +395,7 @@ static uint64_t qemu_opt_get_number_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name);
+        desc = find_desc_by_name(opts->list->desc, name);
         if (desc && desc->def_value_str) {
             parse_option_number(name, desc->def_value_str, &ret, &error_abort);
         }
@@ -421,6 +424,7 @@ static uint64_t qemu_opt_get_size_helper(QemuOpts *opts, const char *name,
                                          uint64_t defval, bool del)
 {
     QemuOpt *opt;
+    const QemuOptDesc *desc;
     uint64_t ret = defval;
 
     if (opts == NULL) {
@@ -429,7 +433,7 @@ static uint64_t qemu_opt_get_size_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name);
+        desc = find_desc_by_name(opts->list->desc, name);
         if (desc && desc->def_value_str) {
             parse_option_size(name, desc->def_value_str, &ret, &error_abort);
         }
@@ -540,18 +544,18 @@ void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
                        Error **errp)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc = opts->list->desc;
+    const QemuOptDesc *desc;
 
-    opt = g_malloc0(sizeof(*opt));
-    opt->desc = find_desc_by_name(desc, name);
-    if (!opt->desc && !opts_accepts_any(opts)) {
+    desc = find_desc_by_name(opts->list->desc, name);
+    if (!desc && !opts_accepts_any(opts)) {
         error_setg(errp, QERR_INVALID_PARAMETER, name);
-        g_free(opt);
         return;
     }
 
+    opt = g_malloc0(sizeof(*opt));
     opt->name = g_strdup(name);
     opt->opts = opts;
+    opt->desc = desc;
     opt->value.boolean = !!val;
     opt->str = g_strdup(val ? "on" : "off");
     QTAILQ_INSERT_TAIL(&opts->head, opt, next);
@@ -561,18 +565,18 @@ void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
                          Error **errp)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc = opts->list->desc;
+    const QemuOptDesc *desc;
 
-    opt = g_malloc0(sizeof(*opt));
-    opt->desc = find_desc_by_name(desc, name);
-    if (!opt->desc && !opts_accepts_any(opts)) {
+    desc = find_desc_by_name(opts->list->desc, name);
+    if (!desc && !opts_accepts_any(opts)) {
         error_setg(errp, QERR_INVALID_PARAMETER, name);
-        g_free(opt);
         return;
     }
 
+    opt = g_malloc0(sizeof(*opt));
     opt->name = g_strdup(name);
     opt->opts = opts;
+    opt->desc = desc;
     opt->value.uint = val;
     opt->str = g_strdup_printf("%" PRId64, val);
     QTAILQ_INSERT_TAIL(&opts->head, opt, next);
-- 
2.26.2



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

* [PATCH 12/46] qemu-option: Factor out helper find_default_by_name()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (10 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:38   ` Eric Blake
  2020-06-29  9:46   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 13/46] qemu-option: Simplify around find_default_by_name() Markus Armbruster
                   ` (34 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 47 ++++++++++++++++++++++++++--------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 9941005c91..ddcf3072c5 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -142,6 +142,13 @@ static const QemuOptDesc *find_desc_by_name(const QemuOptDesc *desc,
     return NULL;
 }
 
+static const char *find_default_by_name(QemuOpts *opts, const char *name)
+{
+    const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name);
+
+    return desc ? desc->def_value_str : NULL;
+}
+
 void parse_option_size(const char *name, const char *value,
                        uint64_t *ret, Error **errp)
 {
@@ -270,7 +277,7 @@ static void qemu_opt_del_all(QemuOpts *opts, const char *name)
 const char *qemu_opt_get(QemuOpts *opts, const char *name)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc;
+    const char *def_val;
 
     if (opts == NULL) {
         return NULL;
@@ -278,9 +285,9 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
 
     opt = qemu_opt_find(opts, name);
     if (!opt) {
-        desc = find_desc_by_name(opts->list->desc, name);
-        if (desc && desc->def_value_str) {
-            return desc->def_value_str;
+        def_val = find_default_by_name(opts, name);
+        if (def_val) {
+            return def_val;
         }
     }
     return opt ? opt->str : NULL;
@@ -312,7 +319,7 @@ const char *qemu_opt_iter_next(QemuOptsIter *iter)
 char *qemu_opt_get_del(QemuOpts *opts, const char *name)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc;
+    const char *def_val;
     char *str = NULL;
 
     if (opts == NULL) {
@@ -321,9 +328,9 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
 
     opt = qemu_opt_find(opts, name);
     if (!opt) {
-        desc = find_desc_by_name(opts->list->desc, name);
-        if (desc && desc->def_value_str) {
-            str = g_strdup(desc->def_value_str);
+        def_val = find_default_by_name(opts, name);
+        if (def_val) {
+            str = g_strdup(def_val);
         }
         return str;
     }
@@ -349,7 +356,7 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
                                      bool defval, bool del)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc;
+    const char *def_val;
     bool ret = defval;
 
     if (opts == NULL) {
@@ -358,9 +365,9 @@ static bool qemu_opt_get_bool_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        desc = find_desc_by_name(opts->list->desc, name);
-        if (desc && desc->def_value_str) {
-            parse_option_bool(name, desc->def_value_str, &ret, &error_abort);
+        def_val = find_default_by_name(opts, name);
+        if (def_val) {
+            parse_option_bool(name, def_val, &ret, &error_abort);
         }
         return ret;
     }
@@ -386,7 +393,7 @@ static uint64_t qemu_opt_get_number_helper(QemuOpts *opts, const char *name,
                                            uint64_t defval, bool del)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc;
+    const char *def_val;
     uint64_t ret = defval;
 
     if (opts == NULL) {
@@ -395,9 +402,9 @@ static uint64_t qemu_opt_get_number_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        desc = find_desc_by_name(opts->list->desc, name);
-        if (desc && desc->def_value_str) {
-            parse_option_number(name, desc->def_value_str, &ret, &error_abort);
+        def_val = find_default_by_name(opts, name);
+        if (def_val) {
+            parse_option_number(name, def_val, &ret, &error_abort);
         }
         return ret;
     }
@@ -424,7 +431,7 @@ static uint64_t qemu_opt_get_size_helper(QemuOpts *opts, const char *name,
                                          uint64_t defval, bool del)
 {
     QemuOpt *opt;
-    const QemuOptDesc *desc;
+    const char *def_val;
     uint64_t ret = defval;
 
     if (opts == NULL) {
@@ -433,9 +440,9 @@ static uint64_t qemu_opt_get_size_helper(QemuOpts *opts, const char *name,
 
     opt = qemu_opt_find(opts, name);
     if (opt == NULL) {
-        desc = find_desc_by_name(opts->list->desc, name);
-        if (desc && desc->def_value_str) {
-            parse_option_size(name, desc->def_value_str, &ret, &error_abort);
+        def_val = find_default_by_name(opts, name);
+        if (def_val) {
+            parse_option_size(name, def_val, &ret, &error_abort);
         }
         return ret;
     }
-- 
2.26.2



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

* [PATCH 13/46] qemu-option: Simplify around find_default_by_name()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (11 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 12/46] qemu-option: Factor out helper find_default_by_name() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:46   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 14/46] qemu-option: Factor out helper opt_create() Markus Armbruster
                   ` (33 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index ddcf3072c5..d9293814b4 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -286,11 +286,9 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
     opt = qemu_opt_find(opts, name);
     if (!opt) {
         def_val = find_default_by_name(opts, name);
-        if (def_val) {
-            return def_val;
-        }
+        return def_val;
     }
-    return opt ? opt->str : NULL;
+    return opt->str;
 }
 
 void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts, const char *name)
@@ -320,7 +318,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
 {
     QemuOpt *opt;
     const char *def_val;
-    char *str = NULL;
+    char *str;
 
     if (opts == NULL) {
         return NULL;
@@ -329,10 +327,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
     opt = qemu_opt_find(opts, name);
     if (!opt) {
         def_val = find_default_by_name(opts, name);
-        if (def_val) {
-            str = g_strdup(def_val);
-        }
-        return str;
+        return g_strdup(def_val);
     }
     str = opt->str;
     opt->str = NULL;
-- 
2.26.2



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

* [PATCH 14/46] qemu-option: Factor out helper opt_create()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (12 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 13/46] qemu-option: Simplify around find_default_by_name() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:47   ` Eric Blake
  2020-06-29 10:09   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure Markus Armbruster
                   ` (32 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

There is just one use so far.  The next commit will add more.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index d9293814b4..3cdf0c0800 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -502,6 +502,23 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
     }
 }
 
+static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value,
+                           bool prepend)
+{
+    QemuOpt *opt = g_malloc0(sizeof(*opt));
+
+    opt->name = g_strdup(name);
+    opt->str = value;
+    opt->opts = opts;
+    if (prepend) {
+        QTAILQ_INSERT_HEAD(&opts->head, opt, next);
+    } else {
+        QTAILQ_INSERT_TAIL(&opts->head, opt, next);
+    }
+
+    return opt;
+}
+
 static void opt_set(QemuOpts *opts, const char *name, char *value,
                     bool prepend, bool *help_wanted, Error **errp)
 {
@@ -519,16 +536,8 @@ static void opt_set(QemuOpts *opts, const char *name, char *value,
         return;
     }
 
-    opt = g_malloc0(sizeof(*opt));
-    opt->name = g_strdup(name);
-    opt->opts = opts;
-    if (prepend) {
-        QTAILQ_INSERT_HEAD(&opts->head, opt, next);
-    } else {
-        QTAILQ_INSERT_TAIL(&opts->head, opt, next);
-    }
+    opt = opt_create(opts, name, value, prepend);
     opt->desc = desc;
-    opt->str = value;
     qemu_opt_parse(opt, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
-- 
2.26.2



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

* [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (13 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 14/46] qemu-option: Factor out helper opt_create() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:50   ` Eric Blake
  2020-06-29 10:37   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void Markus Armbruster
                   ` (31 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

opt_set() frees its argument @value on failure.  Slightly unclean;
functions ideally do nothing on failure.

To tidy this up, move opt_create() from opt_set() into its callers,
along with the cleanup.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 util/qemu-option.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/util/qemu-option.c b/util/qemu-option.c
index 3cdf0c0800..14946e81f2 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -519,36 +519,39 @@ static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value,
     return opt;
 }
 
-static void opt_set(QemuOpts *opts, const char *name, char *value,
-                    bool prepend, bool *help_wanted, Error **errp)
+static bool opt_set(QemuOpts *opts, QemuOpt *opt, bool *help_wanted,
+                    Error **errp)
 {
-    QemuOpt *opt;
     const QemuOptDesc *desc;
     Error *local_err = NULL;
 
-    desc = find_desc_by_name(opts->list->desc, name);
+    desc = find_desc_by_name(opts->list->desc, opt->name);
     if (!desc && !opts_accepts_any(opts)) {
-        g_free(value);
-        error_setg(errp, QERR_INVALID_PARAMETER, name);
-        if (help_wanted && is_help_option(name)) {
+        error_setg(errp, QERR_INVALID_PARAMETER, opt->name);
+        if (help_wanted && is_help_option(opt->name)) {
             *help_wanted = true;
         }
-        return;
+        return false;
     }
 
-    opt = opt_create(opts, name, value, prepend);
     opt->desc = desc;
     qemu_opt_parse(opt, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
-        qemu_opt_del(opt);
+        return false;
     }
+
+    return true;
 }
 
 void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
                   Error **errp)
 {
-    opt_set(opts, name, g_strdup(value), false, NULL, errp);
+    QemuOpt *opt = opt_create(opts, name, g_strdup(value), false);
+
+    if (!opt_set(opts, opt, NULL, errp)) {
+        qemu_opt_del(opt);
+    }
 }
 
 void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
@@ -820,9 +823,9 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
                           const char *firstname, bool prepend,
                           bool *help_wanted, Error **errp)
 {
-    Error *local_err = NULL;
     char *option, *value;
     const char *p;
+    QemuOpt *opt;
 
     for (p = params; *p;) {
         p = get_opt_name_value(p, firstname, &option, &value);
@@ -834,10 +837,10 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
             continue;
         }
 
-        opt_set(opts, option, value, prepend, help_wanted, &local_err);
+        opt = opt_create(opts, option, value, prepend);
         g_free(option);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!opt_set(opts, opt, help_wanted, errp)) {
+            qemu_opt_del(opt);
             return;
         }
     }
-- 
2.26.2



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

* [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (14 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:55   ` Eric Blake
  2020-06-29 11:15   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle Markus Armbruster
                   ` (30 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

See recent commit "error: Document Error API usage rules" for
rationale.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qemu/option.h | 16 ++++----
 blockdev.c            |  5 ++-
 util/qemu-option.c    | 92 +++++++++++++++++++++++++------------------
 3 files changed, 64 insertions(+), 49 deletions(-)

diff --git a/include/qemu/option.h b/include/qemu/option.h
index eb4097889d..2d77b10f90 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -30,7 +30,7 @@
 
 const char *get_opt_value(const char *p, char **value);
 
-void parse_option_size(const char *name, const char *value,
+bool parse_option_size(const char *name, const char *value,
                        uint64_t *ret, Error **errp);
 bool has_help_option(const char *param);
 
@@ -80,11 +80,11 @@ uint64_t qemu_opt_get_number_del(QemuOpts *opts, const char *name,
 uint64_t qemu_opt_get_size_del(QemuOpts *opts, const char *name,
                                uint64_t defval);
 int qemu_opt_unset(QemuOpts *opts, const char *name);
-void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
+bool qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
                   Error **errp);
-void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
+bool qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
                        Error **errp);
-void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
+bool qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
                          Error **errp);
 typedef int (*qemu_opt_loopfunc)(void *opaque,
                                  const char *name, const char *value,
@@ -106,13 +106,13 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
                            int fail_if_exists, Error **errp);
 void qemu_opts_reset(QemuOptsList *list);
 void qemu_opts_loc_restore(QemuOpts *opts);
-void qemu_opts_set(QemuOptsList *list, const char *id,
+bool qemu_opts_set(QemuOptsList *list, const char *id,
                    const char *name, const char *value, Error **errp);
 const char *qemu_opts_id(QemuOpts *opts);
 void qemu_opts_set_id(QemuOpts *opts, char *id);
 void qemu_opts_del(QemuOpts *opts);
-void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp);
-void qemu_opts_do_parse(QemuOpts *opts, const char *params,
+bool qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp);
+bool qemu_opts_do_parse(QemuOpts *opts, const char *params,
                         const char *firstname, Error **errp);
 QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params,
                                   bool permit_abbrev);
@@ -125,7 +125,7 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
 QDict *qemu_opts_to_qdict_filtered(QemuOpts *opts, QDict *qdict,
                                    QemuOptsList *list, bool del);
 QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
-void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
+bool qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
 
 typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp);
 int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
diff --git a/blockdev.c b/blockdev.c
index 481f36c543..1987625aba 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -705,7 +705,7 @@ BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs)
               : QTAILQ_FIRST(&monitor_bdrv_states);
 }
 
-static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
+static bool qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
                             Error **errp)
 {
     const char *value;
@@ -715,7 +715,7 @@ static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
         if (qemu_opt_find(opts, to)) {
             error_setg(errp, "'%s' and its alias '%s' can't be used at the "
                        "same time", to, from);
-            return;
+            return false;
         }
     }
 
@@ -724,6 +724,7 @@ static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
         qemu_opt_set(opts, to, value, &error_abort);
         qemu_opt_unset(opts, from);
     }
+    return true;
 }
 
 QemuOptsList qemu_legacy_drive_opts = {
diff --git a/util/qemu-option.c b/util/qemu-option.c
index 14946e81f2..ff1e703b52 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -96,7 +96,7 @@ const char *get_opt_value(const char *p, char **value)
     return offset;
 }
 
-static void parse_option_bool(const char *name, const char *value, bool *ret,
+static bool parse_option_bool(const char *name, const char *value, bool *ret,
                               Error **errp)
 {
     if (!strcmp(value, "on")) {
@@ -106,10 +106,12 @@ static void parse_option_bool(const char *name, const char *value, bool *ret,
     } else {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    name, "'on' or 'off'");
+        return false;
     }
+    return true;
 }
 
-static void parse_option_number(const char *name, const char *value,
+static bool parse_option_number(const char *name, const char *value,
                                 uint64_t *ret, Error **errp)
 {
     uint64_t number;
@@ -119,13 +121,14 @@ static void parse_option_number(const char *name, const char *value,
     if (err == -ERANGE) {
         error_setg(errp, "Value '%s' is too large for parameter '%s'",
                    value, name);
-        return;
+        return false;
     }
     if (err) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name, "a number");
-        return;
+        return false;
     }
     *ret = number;
+    return true;
 }
 
 static const QemuOptDesc *find_desc_by_name(const QemuOptDesc *desc,
@@ -149,7 +152,7 @@ static const char *find_default_by_name(QemuOpts *opts, const char *name)
     return desc ? desc->def_value_str : NULL;
 }
 
-void parse_option_size(const char *name, const char *value,
+bool parse_option_size(const char *name, const char *value,
                        uint64_t *ret, Error **errp)
 {
     uint64_t size;
@@ -159,7 +162,7 @@ void parse_option_size(const char *name, const char *value,
     if (err == -ERANGE) {
         error_setg(errp, "Value '%s' is out of range for parameter '%s'",
                    value, name);
-        return;
+        return false;
     }
     if (err) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name,
@@ -167,9 +170,10 @@ void parse_option_size(const char *name, const char *value,
         error_append_hint(errp, "Optional suffix k, M, G, T, P or E means"
                           " kilo-, mega-, giga-, tera-, peta-\n"
                           "and exabytes, respectively.\n");
-        return;
+        return false;
     }
     *ret = size;
+    return true;
 }
 
 static const char *opt_type_to_string(enum QemuOptType type)
@@ -460,24 +464,24 @@ uint64_t qemu_opt_get_size_del(QemuOpts *opts, const char *name,
     return qemu_opt_get_size_helper(opts, name, defval, true);
 }
 
-static void qemu_opt_parse(QemuOpt *opt, Error **errp)
+static bool qemu_opt_parse(QemuOpt *opt, Error **errp)
 {
     if (opt->desc == NULL)
-        return;
+        return true;
 
     switch (opt->desc->type) {
     case QEMU_OPT_STRING:
         /* nothing */
-        return;
+        return true;
     case QEMU_OPT_BOOL:
-        parse_option_bool(opt->name, opt->str, &opt->value.boolean, errp);
-        break;
+        return parse_option_bool(opt->name, opt->str, &opt->value.boolean,
+                                 errp);
     case QEMU_OPT_NUMBER:
-        parse_option_number(opt->name, opt->str, &opt->value.uint, errp);
-        break;
+        return parse_option_number(opt->name, opt->str, &opt->value.uint,
+                                   errp);
     case QEMU_OPT_SIZE:
-        parse_option_size(opt->name, opt->str, &opt->value.uint, errp);
-        break;
+        return parse_option_size(opt->name, opt->str, &opt->value.uint,
+                                 errp);
     default:
         abort();
     }
@@ -544,17 +548,19 @@ static bool opt_set(QemuOpts *opts, QemuOpt *opt, bool *help_wanted,
     return true;
 }
 
-void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
+bool qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
                   Error **errp)
 {
     QemuOpt *opt = opt_create(opts, name, g_strdup(value), false);
 
     if (!opt_set(opts, opt, NULL, errp)) {
         qemu_opt_del(opt);
+        return false;
     }
+    return true;
 }
 
-void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
+bool qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
                        Error **errp)
 {
     QemuOpt *opt;
@@ -563,7 +569,7 @@ void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
     desc = find_desc_by_name(opts->list->desc, name);
     if (!desc && !opts_accepts_any(opts)) {
         error_setg(errp, QERR_INVALID_PARAMETER, name);
-        return;
+        return false;
     }
 
     opt = g_malloc0(sizeof(*opt));
@@ -573,9 +579,10 @@ void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
     opt->value.boolean = !!val;
     opt->str = g_strdup(val ? "on" : "off");
     QTAILQ_INSERT_TAIL(&opts->head, opt, next);
+    return true;
 }
 
-void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
+bool qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
                          Error **errp)
 {
     QemuOpt *opt;
@@ -584,7 +591,7 @@ void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
     desc = find_desc_by_name(opts->list->desc, name);
     if (!desc && !opts_accepts_any(opts)) {
         error_setg(errp, QERR_INVALID_PARAMETER, name);
-        return;
+        return false;
     }
 
     opt = g_malloc0(sizeof(*opt));
@@ -594,6 +601,7 @@ void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
     opt->value.uint = val;
     opt->str = g_strdup_printf("%" PRId64, val);
     QTAILQ_INSERT_TAIL(&opts->head, opt, next);
+    return true;
 }
 
 /**
@@ -684,16 +692,16 @@ void qemu_opts_loc_restore(QemuOpts *opts)
     loc_restore(&opts->loc);
 }
 
-void qemu_opts_set(QemuOptsList *list, const char *id,
+bool qemu_opts_set(QemuOptsList *list, const char *id,
                    const char *name, const char *value, Error **errp)
 {
     QemuOpts *opts;
 
     opts = qemu_opts_create(list, id, 1, errp);
     if (!opts) {
-        return;
+        return false;
     }
-    qemu_opt_set(opts, name, value, errp);
+    return qemu_opt_set(opts, name, value, errp);
 }
 
 const char *qemu_opts_id(QemuOpts *opts)
@@ -819,7 +827,7 @@ static const char *get_opt_name_value(const char *params,
     return p;
 }
 
-static void opts_do_parse(QemuOpts *opts, const char *params,
+static bool opts_do_parse(QemuOpts *opts, const char *params,
                           const char *firstname, bool prepend,
                           bool *help_wanted, Error **errp)
 {
@@ -841,9 +849,11 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
         g_free(option);
         if (!opt_set(opts, opt, help_wanted, errp)) {
             qemu_opt_del(opt);
-            return;
+            return false;
         }
     }
+
+    return true;
 }
 
 static char *opts_parse_id(const char *params)
@@ -889,10 +899,10 @@ bool has_help_option(const char *params)
  * key=, and is treated as if key was @firstname.
  * On error, store an error object through @errp if non-null.
  */
-void qemu_opts_do_parse(QemuOpts *opts, const char *params,
+bool qemu_opts_do_parse(QemuOpts *opts, const char *params,
                        const char *firstname, Error **errp)
 {
-    opts_do_parse(opts, params, firstname, false, NULL, errp);
+    return opts_do_parse(opts, params, firstname, false, NULL, errp);
 }
 
 static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
@@ -980,17 +990,18 @@ void qemu_opts_set_defaults(QemuOptsList *list, const char *params,
     assert(opts);
 }
 
-static void qemu_opts_from_qdict_entry(QemuOpts *opts,
+static bool qemu_opts_from_qdict_entry(QemuOpts *opts,
                                        const QDictEntry *entry,
                                        Error **errp)
 {
     const char *key = qdict_entry_key(entry);
     QObject *obj = qdict_entry_value(entry);
-    char buf[32], *tmp = NULL;
+    char buf[32];
+    g_autofree char *tmp = NULL;
     const char *value;
 
     if (!strcmp(key, "id")) {
-        return;
+        return true;
     }
 
     switch (qobject_type(obj)) {
@@ -1007,11 +1018,10 @@ static void qemu_opts_from_qdict_entry(QemuOpts *opts,
         value = buf;
         break;
     default:
-        return;
+        return true;
     }
 
-    qemu_opt_set(opts, key, value, errp);
-    g_free(tmp);
+    return qemu_opt_set(opts, key, value, errp);
 }
 
 /*
@@ -1053,7 +1063,7 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
  * from the QDict. When this function returns, the QDict contains only those
  * entries that couldn't be added to the QemuOpts.
  */
-void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
+bool qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
 {
     const QDictEntry *entry, *next;
 
@@ -1068,13 +1078,15 @@ void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
             qemu_opts_from_qdict_entry(opts, entry, &local_err);
             if (local_err) {
                 error_propagate(errp, local_err);
-                return;
+                return false;
             }
             qdict_del(qdict, entry->key);
         }
 
         entry = next;
     }
+
+    return true;
 }
 
 /*
@@ -1134,7 +1146,7 @@ QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
 /* Validate parsed opts against descriptions where no
  * descriptions were provided in the QemuOptsList.
  */
-void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
+bool qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
 {
     QemuOpt *opt;
     Error *local_err = NULL;
@@ -1145,15 +1157,17 @@ void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
         opt->desc = find_desc_by_name(desc, opt->name);
         if (!opt->desc) {
             error_setg(errp, QERR_INVALID_PARAMETER, opt->name);
-            return;
+            return false;
         }
 
         qemu_opt_parse(opt, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
-            return;
+            return false;
         }
     }
+
+    return true;
 }
 
 /**
-- 
2.26.2



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

* [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (15 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:08   ` Eric Blake
  2020-06-29 13:58   ` Vladimir Sementsov-Ogievskiy
  2020-06-24 16:43 ` [PATCH 18/46] qemu-option: Smooth error checking manually Markus Armbruster
                   ` (29 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The previous commit enables conversion of

    foo(..., &err);
    if (err) {
        ...
    }

to

    if (!foo(..., &err)) {
        ...
    }

for QemuOpts functions that now return true / false on success /
error.  Coccinelle script:

    @@
    identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, qemu_opts_validate};
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, qemu_opts_validate};
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Tidy up line breaks and whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block.c                       | 18 ++++++------------
 block/blkdebug.c              |  4 +---
 block/blklogwrites.c          |  4 +---
 block/blkverify.c             |  4 +---
 block/crypto.c                |  5 +----
 block/curl.c                  |  5 +----
 block/file-posix.c            |  8 ++------
 block/file-win32.c            |  8 ++------
 block/gluster.c               | 17 +++++------------
 block/iscsi.c                 |  4 +---
 block/nbd.c                   |  5 +----
 block/parallels.c             |  3 +--
 block/qcow2.c                 |  4 +---
 block/quorum.c                |  3 +--
 block/raw-format.c            |  5 +----
 block/replication.c           |  3 +--
 block/sheepdog.c              |  5 +----
 block/ssh.c                   |  4 +---
 block/throttle.c              |  5 +----
 block/vpc.c                   |  4 +---
 block/vvfat.c                 |  5 +----
 block/vxhs.c                  |  6 ++----
 blockdev.c                    | 15 ++++-----------
 chardev/char.c                |  6 ++----
 contrib/ivshmem-server/main.c |  4 ++--
 hw/net/virtio-net.c           |  5 ++---
 hw/smbios/smbios.c            | 33 ++++++++-------------------------
 qapi/string-input-visitor.c   |  5 +----
 qemu-img.c                    | 19 +++++++------------
 tpm.c                         |  5 +----
 util/qemu-config.c            | 15 ++++-----------
 util/qemu-option.c            | 26 +++++---------------------
 32 files changed, 70 insertions(+), 192 deletions(-)

diff --git a/block.c b/block.c
index 30a72bc4c2..77e85f13db 100644
--- a/block.c
+++ b/block.c
@@ -1629,9 +1629,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
     assert(options != NULL && bs->options != options);
 
     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail_opts;
     }
@@ -4091,9 +4089,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
 
     /* Process generic block layer options */
     opts = qemu_opts_create(&bdrv_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, reopen_state->options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, reopen_state->options, errp)) {
         ret = -EINVAL;
         goto error;
     }
@@ -6077,8 +6073,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
 
     /* Parse -o options */
     if (options) {
-        qemu_opts_do_parse(opts, options, NULL, &local_err);
-        if (local_err) {
+        if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
             goto out;
         }
     }
@@ -6091,8 +6086,8 @@ void bdrv_img_create(const char *filename, const char *fmt,
     }
 
     if (base_filename) {
-        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
-        if (local_err) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
+                          &local_err)) {
             error_setg(errp, "Backing file not supported for file format '%s'",
                        fmt);
             goto out;
@@ -6100,8 +6095,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
     }
 
     if (base_fmt) {
-        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
-        if (local_err) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err)) {
             error_setg(errp, "Backing file format not supported for file "
                              "format '%s'", fmt);
             goto out;
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 7194bc7f06..fa4b4fefdc 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -472,9 +472,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
     uint64_t align;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/blklogwrites.c b/block/blklogwrites.c
index 6753bd9a3e..57315f56b4 100644
--- a/block/blklogwrites.c
+++ b/block/blklogwrites.c
@@ -149,10 +149,8 @@ static int blk_log_writes_open(BlockDriverState *bs, QDict *options, int flags,
     bool log_append;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
-        error_propagate(errp, local_err);
         goto fail;
     }
 
diff --git a/block/blkverify.c b/block/blkverify.c
index 2f261de24b..4aed53ab59 100644
--- a/block/blkverify.c
+++ b/block/blkverify.c
@@ -116,9 +116,7 @@ static int blkverify_open(BlockDriverState *bs, QDict *options, int flags,
     int ret;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/crypto.c b/block/crypto.c
index 973b57b3eb..5b2b97ea2f 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -212,7 +212,6 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
 {
     BlockCrypto *crypto = bs->opaque;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     int ret = -EINVAL;
     QCryptoBlockOpenOptions *open_opts = NULL;
     unsigned int cflags = 0;
@@ -228,9 +227,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
         bs->file->bs->supported_write_flags;
 
     opts = qemu_opts_create(opts_spec, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto cleanup;
     }
 
diff --git a/block/curl.c b/block/curl.c
index 6e325901dc..4f907c47be 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -669,7 +669,6 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVCURLState *s = bs->opaque;
     CURLState *state = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
     const char *file;
     const char *cookie;
     const char *cookie_secret;
@@ -695,9 +694,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
 
     qemu_mutex_init(&s->mutex);
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto out_noclean;
     }
 
diff --git a/block/file-posix.c b/block/file-posix.c
index 2294bf5d00..70cbb8460c 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -490,9 +490,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
     OnOffAuto locking;
 
     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
@@ -1000,9 +998,7 @@ static int raw_reopen_prepare(BDRVReopenState *state,
 
     /* Handle options changes */
     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, state->options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, state->options, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/file-win32.c b/block/file-win32.c
index 221aaf713e..ab69bd811a 100644
--- a/block/file-win32.c
+++ b/block/file-win32.c
@@ -338,9 +338,7 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
     s->type = FTYPE_FILE;
 
     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
@@ -739,9 +737,7 @@ static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
 
     QemuOpts *opts = qemu_opts_create(&raw_runtime_opts, NULL, 0,
                                       &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto done;
     }
diff --git a/block/gluster.c b/block/gluster.c
index 31233cac69..c620880f27 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -523,8 +523,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
 
     /* create opts info from runtime_json_opts list */
     opts = qemu_opts_create(&runtime_json_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
         goto out;
     }
 
@@ -555,8 +554,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
 
         /* create opts info from runtime_type_opts list */
         opts = qemu_opts_create(&runtime_type_opts, NULL, 0, &error_abort);
-        qemu_opts_absorb_qdict(opts, backing_options, &local_err);
-        if (local_err) {
+        if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
             goto out;
         }
 
@@ -586,8 +584,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         if (gsconf->type == SOCKET_ADDRESS_TYPE_INET) {
             /* create opts info from runtime_inet_opts list */
             opts = qemu_opts_create(&runtime_inet_opts, NULL, 0, &error_abort);
-            qemu_opts_absorb_qdict(opts, backing_options, &local_err);
-            if (local_err) {
+            if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
                 goto out;
             }
 
@@ -635,8 +632,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         } else {
             /* create opts info from runtime_unix_opts list */
             opts = qemu_opts_create(&runtime_unix_opts, NULL, 0, &error_abort);
-            qemu_opts_absorb_qdict(opts, backing_options, &local_err);
-            if (local_err) {
+            if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
                 goto out;
             }
 
@@ -815,13 +811,10 @@ static int qemu_gluster_open(BlockDriverState *bs,  QDict *options,
     int ret = 0;
     BlockdevOptionsGluster *gconf = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
     const char *filename, *logfile;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/iscsi.c b/block/iscsi.c
index a8b76979d8..78d58ff400 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1792,9 +1792,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
     int i, ret = 0, timeout = 0, lun;
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/nbd.c b/block/nbd.c
index eed160c5cd..9789c56476 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -1836,13 +1836,10 @@ static int nbd_process_options(BlockDriverState *bs, QDict *options,
 {
     BDRVNBDState *s = bs->opaque;
     QemuOpts *opts;
-    Error *local_err = NULL;
     int ret = -EINVAL;
 
     opts = qemu_opts_create(&nbd_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto error;
     }
 
diff --git a/block/parallels.c b/block/parallels.c
index b15c9ac28d..ef0d92d05c 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -828,8 +828,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         goto fail_options;
     }
 
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err != NULL) {
+    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
         goto fail_options;
     }
 
diff --git a/block/qcow2.c b/block/qcow2.c
index e81c284319..a9137a535b 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -977,9 +977,7 @@ static int qcow2_update_options_prepare(BlockDriverState *bs,
     encryptfmt = qdict_get_try_str(encryptopts, "format");
 
     opts = qemu_opts_create(&qcow2_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/quorum.c b/block/quorum.c
index 7cf7ab1546..beb3b6dbcc 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -922,8 +922,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
         ret = -EINVAL;
         goto exit;
     }
diff --git a/block/raw-format.c b/block/raw-format.c
index 233d019ca3..42ec50802b 100644
--- a/block/raw-format.c
+++ b/block/raw-format.c
@@ -74,14 +74,11 @@ static QemuOptsList raw_create_opts = {
 static int raw_read_options(QDict *options, uint64_t *offset, bool *has_size,
                             uint64_t *size, Error **errp)
 {
-    Error *local_err = NULL;
     QemuOpts *opts = NULL;
     int ret;
 
     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto end;
     }
diff --git a/block/replication.c b/block/replication.c
index aa7164dbe3..00a50b095e 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -99,8 +99,7 @@ static int replication_open(BlockDriverState *bs, QDict *options,
 
     ret = -EINVAL;
     opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
         goto fail;
     }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 27a30d17f4..9cb5ae5fc6 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -1550,15 +1550,12 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
     uint64_t snap_id;
     char *buf = NULL;
     QemuOpts *opts;
-    Error *local_err = NULL;
 
     s->bs = bs;
     s->aio_context = bdrv_get_aio_context(bs);
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto err_no_fd;
     }
diff --git a/block/ssh.c b/block/ssh.c
index 098dbe03c1..f00b89684a 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -622,9 +622,7 @@ static BlockdevOptionsSsh *ssh_parse_options(QDict *options, Error **errp)
 
     /* Translate legacy options */
     opts = qemu_opts_create(&ssh_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto fail;
     }
 
diff --git a/block/throttle.c b/block/throttle.c
index 0ebbad0743..1c1ac57bee 100644
--- a/block/throttle.c
+++ b/block/throttle.c
@@ -46,12 +46,9 @@ static int throttle_parse_options(QDict *options, char **group, Error **errp)
 {
     int ret;
     const char *group_name;
-    Error *local_err = NULL;
     QemuOpts *opts = qemu_opts_create(&throttle_opts, NULL, 0, &error_abort);
 
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fin;
     }
diff --git a/block/vpc.c b/block/vpc.c
index 7290f36514..6d8a43aed9 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -235,9 +235,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     opts = qemu_opts_create(&vpc_runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/vvfat.c b/block/vvfat.c
index a28e3fa442..fc46de1cfc 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1154,7 +1154,6 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
     bool floppy;
     const char *dirname, *label;
     QemuOpts *opts;
-    Error *local_err = NULL;
     int ret;
 
 #ifdef DEBUG
@@ -1162,9 +1161,7 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
 #endif
 
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/vxhs.c b/block/vxhs.c
index d79fc97df6..237df4f185 100644
--- a/block/vxhs.c
+++ b/block/vxhs.c
@@ -318,8 +318,7 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     tcp_opts = qemu_opts_create(&runtime_tcp_opts, NULL, 0, &error_abort);
 
-    qemu_opts_absorb_qdict(opts, options, &local_err);
-    if (local_err) {
+    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
         ret = -EINVAL;
         goto out;
     }
@@ -346,8 +345,7 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     /* get the 'server.' arguments */
     qdict_extract_subqdict(options, &backing_options, VXHS_OPT_SERVER".");
 
-    qemu_opts_absorb_qdict(tcp_opts, backing_options, &local_err);
-    if (local_err != NULL) {
+    if (!qemu_opts_absorb_qdict(tcp_opts, backing_options, &local_err)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/blockdev.c b/blockdev.c
index 1987625aba..59b0b8ffaf 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -509,9 +509,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
         goto err_no_opts;
     }
 
-    qemu_opts_absorb_qdict(opts, bs_opts, &error);
-    if (error) {
-        error_propagate(errp, error);
+    if (!qemu_opts_absorb_qdict(opts, bs_opts, errp)) {
         goto early_err;
     }
 
@@ -795,7 +793,6 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
     bool read_only = false;
     bool copy_on_read;
     const char *filename;
-    Error *local_err = NULL;
     int i;
 
     /* Change legacy command line options into QMP ones */
@@ -827,10 +824,8 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
     };
 
     for (i = 0; i < ARRAY_SIZE(opt_renames); i++) {
-        qemu_opt_rename(all_opts, opt_renames[i].from, opt_renames[i].to,
-                        &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qemu_opt_rename(all_opts, opt_renames[i].from,
+                             opt_renames[i].to, errp)) {
             return NULL;
         }
     }
@@ -867,9 +862,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
 
     legacy_opts = qemu_opts_create(&qemu_legacy_drive_opts, NULL, 0,
                                    &error_abort);
-    qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(legacy_opts, bs_opts, errp)) {
         goto fail;
     }
 
diff --git a/chardev/char.c b/chardev/char.c
index e3051295ac..2fc720fb07 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -444,8 +444,7 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename,
         qemu_opt_set(opts, "host", host, &error_abort);
         qemu_opt_set(opts, "port", port, &error_abort);
         if (p[pos] == ',') {
-            qemu_opts_do_parse(opts, p+pos+1, NULL, &local_err);
-            if (local_err) {
+            if (!qemu_opts_do_parse(opts, p + pos + 1, NULL, &local_err)) {
                 error_report_err(local_err);
                 goto fail;
             }
@@ -484,8 +483,7 @@ QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename,
     }
     if (strstart(filename, "unix:", &p)) {
         qemu_opt_set(opts, "backend", "socket", &error_abort);
-        qemu_opts_do_parse(opts, p, "path", &local_err);
-        if (local_err) {
+        if (!qemu_opts_do_parse(opts, p, "path", &local_err)) {
             error_report_err(local_err);
             goto fail;
         }
diff --git a/contrib/ivshmem-server/main.c b/contrib/ivshmem-server/main.c
index e4cd35f74c..ee08c4ced0 100644
--- a/contrib/ivshmem-server/main.c
+++ b/contrib/ivshmem-server/main.c
@@ -103,8 +103,8 @@ ivshmem_server_parse_args(IvshmemServerArgs *args, int argc, char *argv[])
             break;
 
         case 'l': /* shm size */
-            parse_option_size("shm_size", optarg, &args->shm_size, &err);
-            if (err) {
+            if (!parse_option_size("shm_size", optarg, &args->shm_size,
+                                   &err)) {
                 error_report_err(err);
                 ivshmem_server_help(argv[0]);
                 exit(1);
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 9bb5578e5d..04b012e487 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3118,9 +3118,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
     }
     qdev_set_parent_bus(n->primary_dev, n->primary_bus);
     n->primary_should_be_hidden = false;
-    qemu_opt_set_bool(n->primary_device_opts,
-                      "partially_hotplugged", true, &err);
-    if (err) {
+    if (!qemu_opt_set_bool(n->primary_device_opts,
+                           "partially_hotplugged", true, &err)) {
         goto out;
     }
     hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev);
diff --git a/hw/smbios/smbios.c b/hw/smbios/smbios.c
index ffd98727ee..f560826904 100644
--- a/hw/smbios/smbios.c
+++ b/hw/smbios/smbios.c
@@ -953,7 +953,6 @@ 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);
@@ -964,9 +963,7 @@ 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, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!qemu_opts_validate(opts, qemu_smbios_file_opts, errp)) {
             return;
         }
 
@@ -1051,9 +1048,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
 
         switch (type) {
         case 0:
-            qemu_opts_validate(opts, qemu_smbios_type0_opts, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type0_opts, errp)) {
                 return;
             }
             save_opt(&type0.vendor, opts, "vendor");
@@ -1071,9 +1066,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             }
             return;
         case 1:
-            qemu_opts_validate(opts, qemu_smbios_type1_opts, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type1_opts, errp)) {
                 return;
             }
             save_opt(&type1.manufacturer, opts, "manufacturer");
@@ -1093,9 +1086,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
             }
             return;
         case 2:
-            qemu_opts_validate(opts, qemu_smbios_type2_opts, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type2_opts, errp)) {
                 return;
             }
             save_opt(&type2.manufacturer, opts, "manufacturer");
@@ -1106,9 +1097,7 @@ 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, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type3_opts, errp)) {
                 return;
             }
             save_opt(&type3.manufacturer, opts, "manufacturer");
@@ -1118,9 +1107,7 @@ 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, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type4_opts, errp)) {
                 return;
             }
             save_opt(&type4.sock_pfx, opts, "sock_pfx");
@@ -1131,17 +1118,13 @@ 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, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type11_opts, errp)) {
                 return;
             }
             save_opt_list(&type11.nvalues, &type11.values, opts, "value");
             return;
         case 17:
-            qemu_opts_validate(opts, qemu_smbios_type17_opts, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!qemu_opts_validate(opts, qemu_smbios_type17_opts, errp)) {
                 return;
             }
             save_opt(&type17.loc_pfx, opts, "loc_pfx");
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index 9be418b6d6..de483fe847 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -314,13 +314,10 @@ static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
                             Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
-    Error *err = NULL;
     uint64_t val;
 
     assert(siv->lm == LM_NONE);
-    parse_option_size(name, siv->string, &val, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!parse_option_size(name, siv->string, &val, errp)) {
         return;
     }
 
diff --git a/qemu-img.c b/qemu-img.c
index d7e846e607..27bf94e7ae 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -467,8 +467,8 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
     Error *err = NULL;
 
     if (base_filename) {
-        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &err);
-        if (err) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
+                          &err)) {
             error_report("Backing file not supported for file format '%s'",
                          fmt);
             error_free(err);
@@ -476,8 +476,7 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
         }
     }
     if (base_fmt) {
-        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err);
-        if (err) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err)) {
             error_report("Backing file format not supported for file "
                          "format '%s'", fmt);
             error_free(err);
@@ -2496,8 +2495,7 @@ static int img_convert(int argc, char **argv)
 
         opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
         if (options) {
-            qemu_opts_do_parse(opts, options, NULL, &local_err);
-            if (local_err) {
+            if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
                 error_report_err(local_err);
                 ret = -1;
                 goto out;
@@ -3973,8 +3971,7 @@ static int img_resize(int argc, char **argv)
 
     /* Parse size */
     param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
-    qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err);
-    if (err) {
+    if (!qemu_opt_set(param, BLOCK_OPT_SIZE, size, &err)) {
         error_report_err(err);
         ret = -1;
         qemu_opts_del(param);
@@ -4221,8 +4218,7 @@ static int img_amend(int argc, char **argv)
 
     create_opts = qemu_opts_append(create_opts, bs->drv->create_opts);
     opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
-    qemu_opts_do_parse(opts, options, NULL, &err);
-    if (err) {
+    if (!qemu_opts_do_parse(opts, options, NULL, &err)) {
         error_report_err(err);
         ret = -1;
         goto out;
@@ -5354,8 +5350,7 @@ static int img_measure(int argc, char **argv)
     create_opts = qemu_opts_append(create_opts, bdrv_file.create_opts);
     opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
     if (options) {
-        qemu_opts_do_parse(opts, options, NULL, &local_err);
-        if (local_err) {
+        if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
             error_report_err(local_err);
             error_report("Invalid options for file format '%s'", out_fmt);
             goto out;
diff --git a/tpm.c b/tpm.c
index 9c9e20bbb7..fe03b24858 100644
--- a/tpm.c
+++ b/tpm.c
@@ -85,7 +85,6 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
     const char *id;
     const TPMBackendClass *be;
     TPMBackend *drv;
-    Error *local_err = NULL;
     int i;
 
     if (!QLIST_EMPTY(&tpm_backends)) {
@@ -116,9 +115,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_propagate(errp, local_err);
+    if (!qemu_opts_validate(opts, be->opts, errp)) {
         return 1;
     }
 
diff --git a/util/qemu-config.c b/util/qemu-config.c
index c0d0e9b8ef..660f47b005 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -339,8 +339,7 @@ int qemu_set_option(const char *str)
         return -1;
     }
 
-    qemu_opt_set(opts, arg, str + offset + 1, &local_err);
-    if (local_err) {
+    if (!qemu_opt_set(opts, arg, str + offset + 1, &local_err)) {
         error_report_err(local_err);
         return -1;
     }
@@ -441,8 +440,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
                 error_report("no group defined");
                 goto out;
             }
-            qemu_opt_set(opts, arg, value, &local_err);
-            if (local_err) {
+            if (!qemu_opt_set(opts, arg, value, &local_err)) {
                 error_report_err(local_err);
                 goto out;
             }
@@ -481,7 +479,6 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
     QemuOpts *subopts;
     QDict *subqdict;
     QList *list = NULL;
-    Error *local_err = NULL;
     size_t orig_size, enum_size;
     char *prefix;
 
@@ -498,9 +495,7 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
         goto out;
     }
 
-    qemu_opts_absorb_qdict(subopts, subqdict, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opts_absorb_qdict(subopts, subqdict, errp)) {
         goto out;
     }
 
@@ -543,9 +538,7 @@ static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,
                 goto out;
             }
 
-            qemu_opts_absorb_qdict(subopts, section, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            if (!qemu_opts_absorb_qdict(subopts, section, errp)) {
                 qemu_opts_del(subopts);
                 goto out;
             }
diff --git a/util/qemu-option.c b/util/qemu-option.c
index ff1e703b52..da74a239e9 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -527,7 +527,6 @@ static bool opt_set(QemuOpts *opts, QemuOpt *opt, bool *help_wanted,
                     Error **errp)
 {
     const QemuOptDesc *desc;
-    Error *local_err = NULL;
 
     desc = find_desc_by_name(opts->list->desc, opt->name);
     if (!desc && !opts_accepts_any(opts)) {
@@ -539,9 +538,7 @@ static bool opt_set(QemuOpts *opts, QemuOpt *opt, bool *help_wanted,
     }
 
     opt->desc = desc;
-    qemu_opt_parse(opt, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!qemu_opt_parse(opt, errp)) {
         return false;
     }
 
@@ -912,7 +909,6 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
     const char *firstname;
     char *id = opts_parse_id(params);
     QemuOpts *opts;
-    Error *local_err = NULL;
 
     assert(!permit_abbrev || list->implied_opt_name);
     firstname = permit_abbrev ? list->implied_opt_name : NULL;
@@ -931,9 +927,7 @@ static QemuOpts *opts_parse(QemuOptsList *list, const char *params,
         return NULL;
     }
 
-    opts_do_parse(opts, params, firstname, defaults, help_wanted, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!opts_do_parse(opts, params, firstname, defaults, help_wanted, errp)) {
         qemu_opts_del(opts);
         return NULL;
     }
@@ -1033,7 +1027,6 @@ static bool qemu_opts_from_qdict_entry(QemuOpts *opts,
 QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
                                Error **errp)
 {
-    Error *local_err = NULL;
     QemuOpts *opts;
     const QDictEntry *entry;
 
@@ -1047,9 +1040,7 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
     for (entry = qdict_first(qdict);
          entry;
          entry = qdict_next(qdict, entry)) {
-        qemu_opts_from_qdict_entry(opts, entry, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qemu_opts_from_qdict_entry(opts, entry, errp)) {
             qemu_opts_del(opts);
             return NULL;
         }
@@ -1070,14 +1061,10 @@ bool qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp)
     entry = qdict_first(qdict);
 
     while (entry != NULL) {
-        Error *local_err = NULL;
-
         next = qdict_next(qdict, entry);
 
         if (find_desc_by_name(opts->list->desc, entry->key)) {
-            qemu_opts_from_qdict_entry(opts, entry, &local_err);
-            if (local_err) {
-                error_propagate(errp, local_err);
+            if (!qemu_opts_from_qdict_entry(opts, entry, errp)) {
                 return false;
             }
             qdict_del(qdict, entry->key);
@@ -1149,7 +1136,6 @@ QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict)
 bool qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
 {
     QemuOpt *opt;
-    Error *local_err = NULL;
 
     assert(opts_accepts_any(opts));
 
@@ -1160,9 +1146,7 @@ bool qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
             return false;
         }
 
-        qemu_opt_parse(opt, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!qemu_opt_parse(opt, errp)) {
             return false;
         }
     }
-- 
2.26.2



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

* [PATCH 18/46] qemu-option: Smooth error checking manually
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (16 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:10   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
                   ` (28 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When foo(..., &err) is followed by error_propagate(errp, err), we can
often just as well do foo(..., errp).  The previous commit did that
for simple cases with Coccinelle.  Do it for a few more manually.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block.c             | 2 +-
 block/gluster.c     | 8 ++++----
 block/parallels.c   | 2 +-
 block/quorum.c      | 2 +-
 block/replication.c | 2 +-
 block/vxhs.c        | 4 ++--
 hw/net/virtio-net.c | 4 ++--
 7 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/block.c b/block.c
index 77e85f13db..93a5fbf60a 100644
--- a/block.c
+++ b/block.c
@@ -6073,7 +6073,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
 
     /* Parse -o options */
     if (options) {
-        if (!qemu_opts_do_parse(opts, options, NULL, &local_err)) {
+        if (!qemu_opts_do_parse(opts, options, NULL, errp)) {
             goto out;
         }
     }
diff --git a/block/gluster.c b/block/gluster.c
index c620880f27..4f1448e2bc 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -523,7 +523,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
 
     /* create opts info from runtime_json_opts list */
     opts = qemu_opts_create(&runtime_json_opts, NULL, 0, &error_abort);
-    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto out;
     }
 
@@ -554,7 +554,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
 
         /* create opts info from runtime_type_opts list */
         opts = qemu_opts_create(&runtime_type_opts, NULL, 0, &error_abort);
-        if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
+        if (!qemu_opts_absorb_qdict(opts, backing_options, errp)) {
             goto out;
         }
 
@@ -584,7 +584,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         if (gsconf->type == SOCKET_ADDRESS_TYPE_INET) {
             /* create opts info from runtime_inet_opts list */
             opts = qemu_opts_create(&runtime_inet_opts, NULL, 0, &error_abort);
-            if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
+            if (!qemu_opts_absorb_qdict(opts, backing_options, errp)) {
                 goto out;
             }
 
@@ -632,7 +632,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
         } else {
             /* create opts info from runtime_unix_opts list */
             opts = qemu_opts_create(&runtime_unix_opts, NULL, 0, &error_abort);
-            if (!qemu_opts_absorb_qdict(opts, backing_options, &local_err)) {
+            if (!qemu_opts_absorb_qdict(opts, backing_options, errp)) {
                 goto out;
             }
 
diff --git a/block/parallels.c b/block/parallels.c
index ef0d92d05c..0397f3894f 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -828,7 +828,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         goto fail_options;
     }
 
-    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto fail_options;
     }
 
diff --git a/block/quorum.c b/block/quorum.c
index beb3b6dbcc..9ed20e1998 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -922,7 +922,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     opts = qemu_opts_create(&quorum_runtime_opts, NULL, 0, &error_abort);
-    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto exit;
     }
diff --git a/block/replication.c b/block/replication.c
index 00a50b095e..7f4ab357a4 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -99,7 +99,7 @@ static int replication_open(BlockDriverState *bs, QDict *options,
 
     ret = -EINVAL;
     opts = qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_abort);
-    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         goto fail;
     }
 
diff --git a/block/vxhs.c b/block/vxhs.c
index 237df4f185..20513a43f4 100644
--- a/block/vxhs.c
+++ b/block/vxhs.c
@@ -318,7 +318,7 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     tcp_opts = qemu_opts_create(&runtime_tcp_opts, NULL, 0, &error_abort);
 
-    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
         ret = -EINVAL;
         goto out;
     }
@@ -345,7 +345,7 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     /* get the 'server.' arguments */
     qdict_extract_subqdict(options, &backing_options, VXHS_OPT_SERVER".");
 
-    if (!qemu_opts_absorb_qdict(tcp_opts, backing_options, &local_err)) {
+    if (!qemu_opts_absorb_qdict(tcp_opts, backing_options, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 04b012e487..7502ff0b1e 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -3119,8 +3119,8 @@ static bool failover_replug_primary(VirtIONet *n, Error **errp)
     qdev_set_parent_bus(n->primary_dev, n->primary_bus);
     n->primary_should_be_hidden = false;
     if (!qemu_opt_set_bool(n->primary_device_opts,
-                           "partially_hotplugged", true, &err)) {
-        goto out;
+                           "partially_hotplugged", true, errp)) {
+        return false;
     }
     hotplug_ctrl = qdev_get_hotplug_handler(n->primary_dev);
     if (hotplug_ctrl) {
-- 
2.26.2



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

* [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (17 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 18/46] qemu-option: Smooth error checking manually Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:12   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create() Markus Armbruster
                   ` (27 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The previous commit enables another round of the transformation from
recent commit "error: Avoid unnecessary error_propagate() after
error_setg()".

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/quorum.c      | 16 +++++++---------
 block/replication.c | 12 +++++-------
 block/vxhs.c        | 10 ++++------
 3 files changed, 16 insertions(+), 22 deletions(-)

diff --git a/block/quorum.c b/block/quorum.c
index 9ed20e1998..6df9449fc2 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -910,13 +910,12 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
     /* count how many different children are present */
     s->num_children = qdict_array_entries(options, "children.");
     if (s->num_children < 0) {
-        error_setg(&local_err, "Option children is not a valid array");
+        error_setg(errp, "Option children is not a valid array");
         ret = -EINVAL;
         goto exit;
     }
     if (s->num_children < 1) {
-        error_setg(&local_err,
-                   "Number of provided children must be 1 or more");
+        error_setg(errp, "Number of provided children must be 1 or more");
         ret = -EINVAL;
         goto exit;
     }
@@ -929,7 +928,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
 
     s->threshold = qemu_opt_get_number(opts, QUORUM_OPT_VOTE_THRESHOLD, 0);
     /* and validate it against s->num_children */
-    ret = quorum_valid_threshold(s->threshold, s->num_children, &local_err);
+    ret = quorum_valid_threshold(s->threshold, s->num_children, errp);
     if (ret < 0) {
         goto exit;
     }
@@ -942,7 +941,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
                               -EINVAL, NULL);
     }
     if (ret < 0) {
-        error_setg(&local_err, "Please set read-pattern as fifo or quorum");
+        error_setg(errp, "Please set read-pattern as fifo or quorum");
         goto exit;
     }
     s->read_pattern = ret;
@@ -950,7 +949,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
     if (s->read_pattern == QUORUM_READ_PATTERN_QUORUM) {
         s->is_blkverify = qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false);
         if (s->is_blkverify && (s->num_children != 2 || s->threshold != 2)) {
-            error_setg(&local_err, "blkverify=on can only be set if there are "
+            error_setg(errp, "blkverify=on can only be set if there are "
                        "exactly two files and vote-threshold is 2");
             ret = -EINVAL;
             goto exit;
@@ -959,7 +958,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
         s->rewrite_corrupted = qemu_opt_get_bool(opts, QUORUM_OPT_REWRITE,
                                                  false);
         if (s->rewrite_corrupted && s->is_blkverify) {
-            error_setg(&local_err,
+            error_setg(errp,
                        "rewrite-corrupted=on cannot be used with blkverify=on");
             ret = -EINVAL;
             goto exit;
@@ -979,6 +978,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
                                          &child_of_bds, BDRV_CHILD_DATA, false,
                                          &local_err);
         if (local_err) {
+            error_propagate(errp, local_err);
             ret = -EINVAL;
             goto close_exit;
         }
@@ -1004,8 +1004,6 @@ close_exit:
     g_free(opened);
 exit:
     qemu_opts_del(opts);
-    /* propagate error */
-    error_propagate(errp, local_err);
     return ret;
 }
 
diff --git a/block/replication.c b/block/replication.c
index 7f4ab357a4..0c70215784 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -85,7 +85,6 @@ static int replication_open(BlockDriverState *bs, QDict *options,
 {
     int ret;
     BDRVReplicationState *s = bs->opaque;
-    Error *local_err = NULL;
     QemuOpts *opts = NULL;
     const char *mode;
     const char *top_id;
@@ -105,7 +104,7 @@ static int replication_open(BlockDriverState *bs, QDict *options,
 
     mode = qemu_opt_get(opts, REPLICATION_MODE);
     if (!mode) {
-        error_setg(&local_err, "Missing the option mode");
+        error_setg(errp, "Missing the option mode");
         goto fail;
     }
 
@@ -113,7 +112,8 @@ static int replication_open(BlockDriverState *bs, QDict *options,
         s->mode = REPLICATION_MODE_PRIMARY;
         top_id = qemu_opt_get(opts, REPLICATION_TOP_ID);
         if (top_id) {
-            error_setg(&local_err, "The primary side does not support option top-id");
+            error_setg(errp,
+                       "The primary side does not support option top-id");
             goto fail;
         }
     } else if (!strcmp(mode, "secondary")) {
@@ -121,11 +121,11 @@ static int replication_open(BlockDriverState *bs, QDict *options,
         top_id = qemu_opt_get(opts, REPLICATION_TOP_ID);
         s->top_id = g_strdup(top_id);
         if (!s->top_id) {
-            error_setg(&local_err, "Missing the option top-id");
+            error_setg(errp, "Missing the option top-id");
             goto fail;
         }
     } else {
-        error_setg(&local_err,
+        error_setg(errp,
                    "The option mode's value should be primary or secondary");
         goto fail;
     }
@@ -136,8 +136,6 @@ static int replication_open(BlockDriverState *bs, QDict *options,
 
 fail:
     qemu_opts_del(opts);
-    error_propagate(errp, local_err);
-
     return ret;
 }
 
diff --git a/block/vxhs.c b/block/vxhs.c
index 20513a43f4..ef2848fb60 100644
--- a/block/vxhs.c
+++ b/block/vxhs.c
@@ -300,7 +300,6 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     QemuOpts *opts = NULL;
     QemuOpts *tcp_opts = NULL;
     char *of_vsa_addr = NULL;
-    Error *local_err = NULL;
     const char *vdisk_id_opt;
     const char *server_host_opt;
     int ret = 0;
@@ -326,14 +325,14 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
     /* vdisk-id is the disk UUID */
     vdisk_id_opt = qemu_opt_get(opts, VXHS_OPT_VDISK_ID);
     if (!vdisk_id_opt) {
-        error_setg(&local_err, QERR_MISSING_PARAMETER, VXHS_OPT_VDISK_ID);
+        error_setg(errp, QERR_MISSING_PARAMETER, VXHS_OPT_VDISK_ID);
         ret = -EINVAL;
         goto out;
     }
 
     /* vdisk-id may contain a leading '/' */
     if (strlen(vdisk_id_opt) > UUID_FMT_LEN + 1) {
-        error_setg(&local_err, "vdisk-id cannot be more than %d characters",
+        error_setg(errp, "vdisk-id cannot be more than %d characters",
                    UUID_FMT_LEN);
         ret = -EINVAL;
         goto out;
@@ -352,14 +351,14 @@ static int vxhs_open(BlockDriverState *bs, QDict *options,
 
     server_host_opt = qemu_opt_get(tcp_opts, VXHS_OPT_HOST);
     if (!server_host_opt) {
-        error_setg(&local_err, QERR_MISSING_PARAMETER,
+        error_setg(errp, QERR_MISSING_PARAMETER,
                    VXHS_OPT_SERVER"."VXHS_OPT_HOST);
         ret = -EINVAL;
         goto out;
     }
 
     if (strlen(server_host_opt) > MAXHOSTNAMELEN) {
-        error_setg(&local_err, "server.host cannot be more than %d characters",
+        error_setg(errp, "server.host cannot be more than %d characters",
                    MAXHOSTNAMELEN);
         ret = -EINVAL;
         goto out;
@@ -412,7 +411,6 @@ out:
 
     if (ret < 0) {
         vxhs_unref();
-        error_propagate(errp, local_err);
         g_free(s->vdisk_hostinfo.host);
         g_free(s->vdisk_guid);
         g_free(s->tlscredsid);
-- 
2.26.2



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

* [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (18 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:14   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter() Markus Armbruster
                   ` (26 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When creating an image fails because the format doesn't support option
"backing_file" or "backing_fmt", bdrv_img_create() first has
qemu_opt_set() put a generic error into @local_err, then puts the real
error into @errp with error_setg(), and then propagates the former to
the latter, which throws away the generic error.  A bit complicated,
but works.

Not that qemu_opt_set() returns a useful value, we can simply ignore
the generic error instead.

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

diff --git a/block.c b/block.c
index 93a5fbf60a..2dcf9afd61 100644
--- a/block.c
+++ b/block.c
@@ -6087,7 +6087,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
 
     if (base_filename) {
         if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
-                          &local_err)) {
+                          NULL)) {
             error_setg(errp, "Backing file not supported for file format '%s'",
                        fmt);
             goto out;
@@ -6095,7 +6095,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
     }
 
     if (base_fmt) {
-        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err)) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) {
             error_setg(errp, "Backing file format not supported for file "
                              "format '%s'", fmt);
             goto out;
-- 
2.26.2



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

* [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (19 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:15   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void Markus Armbruster
                   ` (25 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 monitor/hmp-cmds.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 2b0b58a336..d7810cb564 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1247,7 +1247,6 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
     MigrateSetParameters *p = g_new0(MigrateSetParameters, 1);
     uint64_t valuebw = 0;
     uint64_t cache_size;
-    MultiFDCompression compress_type;
     Error *err = NULL;
     int val, ret;
 
@@ -1343,11 +1342,8 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
         break;
     case MIGRATION_PARAMETER_MULTIFD_COMPRESSION:
         p->has_multifd_compression = true;
-        visit_type_MultiFDCompression(v, param, &compress_type, &err);
-        if (err) {
-            break;
-        }
-        p->multifd_compression = compress_type;
+        visit_type_MultiFDCompression(v, param, &p->multifd_compression,
+                                      &err);
         break;
     case MIGRATION_PARAMETER_MULTIFD_ZLIB_LEVEL:
         p->has_multifd_zlib_level = true;
-- 
2.26.2



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

* [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (20 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:43   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 23/46] qapi: Smooth error checking with Coccinelle Markus Armbruster
                   ` (24 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

See recent commit "error: Document Error API usage rules" for
rationale.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 docs/devel/qapi-code-gen.txt  |  51 +++++------
 include/qapi/clone-visitor.h  |   8 +-
 include/qapi/visitor-impl.h   |  26 +++---
 include/qapi/visitor.h        | 102 ++++++++++++---------
 audio/audio_legacy.c          |  15 ++--
 qapi/opts-visitor.c           |  58 +++++++-----
 qapi/qapi-clone-visitor.c     |  33 ++++---
 qapi/qapi-dealloc-visitor.c   |  27 ++++--
 qapi/qapi-visit-core.c        | 165 ++++++++++++++++++----------------
 qapi/qobject-input-visitor.c  | 109 +++++++++++++---------
 qapi/qobject-output-visitor.c |  27 ++++--
 qapi/string-input-visitor.c   |  62 +++++++------
 qapi/string-output-visitor.c  |  32 ++++---
 scripts/qapi/visit.py         |  58 +++++-------
 14 files changed, 435 insertions(+), 338 deletions(-)

diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
index a7794ef658..9bfc57063c 100644
--- a/docs/devel/qapi-code-gen.txt
+++ b/docs/devel/qapi-code-gen.txt
@@ -1408,42 +1408,38 @@ Example:
     #include "example-qapi-types.h"
 
 
-    void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp);
-    void visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp);
-    void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp);
+    bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp);
+    bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp);
+    bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp);
 
-    void visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp);
+    bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp);
 
     #endif /* EXAMPLE_QAPI_VISIT_H */
     $ cat qapi-generated/example-qapi-visit.c
 [Uninteresting stuff omitted...]
 
-    void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
+    bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
     {
         Error *err = NULL;
 
-        visit_type_int(v, "integer", &obj->integer, &err);
-        if (err) {
-            goto out;
+        if (!visit_type_int(v, "integer", &obj->integer, errp)) {
+            return false;
         }
         if (visit_optional(v, "string", &obj->has_string)) {
-            visit_type_str(v, "string", &obj->string, &err);
-            if (err) {
-                goto out;
+            if (!visit_type_str(v, "string", &obj->string, errp)) {
+                return false;
             }
         }
-
-    out:
         error_propagate(errp, err);
+        return !err;
     }
 
-    void visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
+    bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
     {
         Error *err = NULL;
 
-        visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), &err);
-        if (err) {
-            goto out;
+        if (!visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), errp)) {
+            return false;
         }
         if (!*obj) {
             /* incomplete */
@@ -1461,19 +1457,18 @@ Example:
             qapi_free_UserDefOne(*obj);
             *obj = NULL;
         }
-    out:
         error_propagate(errp, err);
+        return !err;
     }
 
-    void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
+    bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
     {
         Error *err = NULL;
         UserDefOneList *tail;
         size_t size = sizeof(**obj);
 
-        visit_start_list(v, name, (GenericList **)obj, size, &err);
-        if (err) {
-            goto out;
+        if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) {
+            return false;
         }
 
         for (tail = *obj; tail;
@@ -1492,21 +1487,19 @@ Example:
             qapi_free_UserDefOneList(*obj);
             *obj = NULL;
         }
-    out:
         error_propagate(errp, err);
+        return !err;
     }
 
-    void visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
+    bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
     {
         Error *err = NULL;
 
-        visit_type_UserDefOneList(v, "arg1", &obj->arg1, &err);
-        if (err) {
-            goto out;
+        if (!visit_type_UserDefOneList(v, "arg1", &obj->arg1, errp)) {
+            return false;
         }
-
-    out:
         error_propagate(errp, err);
+        return !err;
     }
 
 [Uninteresting stuff omitted...]
diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
index 5b665ee38c..adf9a788e2 100644
--- a/include/qapi/clone-visitor.h
+++ b/include/qapi/clone-visitor.h
@@ -20,10 +20,10 @@
  */
 typedef struct QapiCloneVisitor QapiCloneVisitor;
 
-void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
+void *qapi_clone(const void *src, bool (*visit_type)(Visitor *, const char *,
                                                      void **, Error **));
 void qapi_clone_members(void *dst, const void *src, size_t sz,
-                        void (*visit_type_members)(Visitor *, void *,
+                        bool (*visit_type_members)(Visitor *, void *,
                                                    Error **));
 
 /*
@@ -34,7 +34,7 @@ void qapi_clone_members(void *dst, const void *src, size_t sz,
  */
 #define QAPI_CLONE(type, src)                                           \
     ((type *)qapi_clone(src,                                            \
-                        (void (*)(Visitor *, const char *, void**,      \
+                        (bool (*)(Visitor *, const char *, void **,     \
                                   Error **))visit_type_ ## type))
 
 /*
@@ -45,7 +45,7 @@ void qapi_clone_members(void *dst, const void *src, size_t sz,
  */
 #define QAPI_CLONE_MEMBERS(type, dst, src)                              \
     qapi_clone_members(dst, src, sizeof(type),                          \
-                       (void (*)(Visitor *, void *,                     \
+                       (bool (*)(Visitor *, void *,                     \
                                  Error **))visit_type_ ## type ## _members)
 
 #endif
diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
index 98dc533d39..7362c043be 100644
--- a/include/qapi/visitor-impl.h
+++ b/include/qapi/visitor-impl.h
@@ -48,31 +48,31 @@ struct Visitor
      */
 
     /* Must be set to visit structs */
-    void (*start_struct)(Visitor *v, const char *name, void **obj,
+    bool (*start_struct)(Visitor *v, const char *name, void **obj,
                          size_t size, Error **errp);
 
     /* Optional; intended for input visitors */
-    void (*check_struct)(Visitor *v, Error **errp);
+    bool (*check_struct)(Visitor *v, Error **errp);
 
     /* Must be set to visit structs */
     void (*end_struct)(Visitor *v, void **obj);
 
     /* Must be set; implementations may require @list to be non-null,
      * but must document it. */
-    void (*start_list)(Visitor *v, const char *name, GenericList **list,
+    bool (*start_list)(Visitor *v, const char *name, GenericList **list,
                        size_t size, Error **errp);
 
     /* Must be set */
     GenericList *(*next_list)(Visitor *v, GenericList *tail, size_t size);
 
     /* Optional; intended for input visitors */
-    void (*check_list)(Visitor *v, Error **errp);
+    bool (*check_list)(Visitor *v, Error **errp);
 
     /* Must be set */
     void (*end_list)(Visitor *v, void **list);
 
     /* Must be set by input and clone visitors to visit alternates */
-    void (*start_alternate)(Visitor *v, const char *name,
+    bool (*start_alternate)(Visitor *v, const char *name,
                             GenericAlternate **obj, size_t size,
                             Error **errp);
 
@@ -80,33 +80,33 @@ struct Visitor
     void (*end_alternate)(Visitor *v, void **obj);
 
     /* Must be set */
-    void (*type_int64)(Visitor *v, const char *name, int64_t *obj,
+    bool (*type_int64)(Visitor *v, const char *name, int64_t *obj,
                        Error **errp);
 
     /* Must be set */
-    void (*type_uint64)(Visitor *v, const char *name, uint64_t *obj,
+    bool (*type_uint64)(Visitor *v, const char *name, uint64_t *obj,
                         Error **errp);
 
     /* Optional; fallback is type_uint64() */
-    void (*type_size)(Visitor *v, const char *name, uint64_t *obj,
+    bool (*type_size)(Visitor *v, const char *name, uint64_t *obj,
                       Error **errp);
 
     /* Must be set */
-    void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp);
+    bool (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp);
 
     /* Must be set */
-    void (*type_str)(Visitor *v, const char *name, char **obj, Error **errp);
+    bool (*type_str)(Visitor *v, const char *name, char **obj, Error **errp);
 
     /* Must be set to visit numbers */
-    void (*type_number)(Visitor *v, const char *name, double *obj,
+    bool (*type_number)(Visitor *v, const char *name, double *obj,
                         Error **errp);
 
     /* Must be set to visit arbitrary QTypes */
-    void (*type_any)(Visitor *v, const char *name, QObject **obj,
+    bool (*type_any)(Visitor *v, const char *name, QObject **obj,
                      Error **errp);
 
     /* Must be set to visit explicit null values.  */
-    void (*type_null)(Visitor *v, const char *name, QNull **obj,
+    bool (*type_null)(Visitor *v, const char *name, QNull **obj,
                       Error **errp);
 
     /* Must be set for input visitors to visit structs, optional otherwise.
diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index 5573906966..7d1b8d579c 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -60,7 +60,7 @@
  * All QAPI types have a corresponding function with a signature
  * roughly compatible with this:
  *
- * void visit_type_FOO(Visitor *v, const char *name, T obj, Error **errp);
+ * bool visit_type_FOO(Visitor *v, const char *name, T obj, Error **errp);
  *
  * where T is FOO for scalar types, and FOO * otherwise.  The scalar
  * visitors are declared here; the remaining visitors are generated in
@@ -95,14 +95,16 @@
  * incomplete object, such an object is possible only by manual
  * construction.
  *
+ * visit_type_FOO() returns true on success, false on error.
+ *
  * For the QAPI object types (structs, unions, and alternates), there
  * is an additional generated function in qapi-visit-MODULE.h
  * compatible with:
  *
- * void visit_type_FOO_members(Visitor *v, FOO *obj, Error **errp);
+ * bool visit_type_FOO_members(Visitor *v, FOO *obj, Error **errp);
  *
  * for visiting the members of a type without also allocating the QAPI
- * struct.
+ * struct.  It also returns true on success, false on error.
  *
  * Additionally, QAPI pointer types (structs, unions, alternates, and
  * lists) have a generated function in qapi-types-MODULE.h compatible
@@ -131,8 +133,7 @@
  *  Visitor *v;
  *
  *  v = FOO_visitor_new(...);
- *  visit_type_Foo(v, NULL, &f, &err);
- *  if (err) {
+ *  if (!visit_type_Foo(v, NULL, &f, &err)) {
  *      ...handle error...
  *  } else {
  *      ...use f...
@@ -148,8 +149,7 @@
  *  Visitor *v;
  *
  *  v = FOO_visitor_new(...);
- *  visit_type_FooList(v, NULL, &l, &err);
- *  if (err) {
+ *  if (!visit_type_FooList(v, NULL, &l, &err)) {
  *      ...handle error...
  *  } else {
  *      for ( ; l; l = l->next) {
@@ -186,34 +186,32 @@
  * <example>
  *  Visitor *v;
  *  Error *err = NULL;
+ *  bool ok = false;
  *  int value;
  *
  *  v = FOO_visitor_new(...);
- *  visit_start_struct(v, NULL, NULL, 0, &err);
- *  if (err) {
+ *  if (!visit_start_struct(v, NULL, NULL, 0, &err)) {
  *      goto out;
  *  }
- *  visit_start_list(v, "list", NULL, 0, &err);
- *  if (err) {
+ *  if (!visit_start_list(v, "list", NULL, 0, &err)) {
  *      goto outobj;
  *  }
  *  value = 1;
- *  visit_type_int(v, NULL, &value, &err);
- *  if (err) {
+ *  if (!visit_type_int(v, NULL, &value, &err)) {
  *      goto outlist;
  *  }
  *  value = 2;
- *  visit_type_int(v, NULL, &value, &err);
- *  if (err) {
+ *  if (!visit_type_int(v, NULL, &value, &err)) {
  *      goto outlist;
  *  }
+ *  ok = true;
  * outlist:
- *  if (!err) {
- *      visit_check_list(v, &err);
+ *  if (ok) {
+ *      ok = visit_check_list(v, &err);
  *  }
  *  visit_end_list(v, NULL);
- *  if (!err) {
- *      visit_check_struct(v, &err);
+ *  if (ok) {
+ *      ok = visit_check_struct(v, &err);
  *  }
  * outobj:
  *  visit_end_struct(v, NULL);
@@ -286,6 +284,8 @@ void visit_free(Visitor *v);
  * On failure, set *@obj to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * After visit_start_struct() succeeds, the caller may visit its
  * members one after the other, passing the member's name and address
  * within the struct.  Finally, visit_end_struct() needs to be called
@@ -295,7 +295,7 @@ void visit_free(Visitor *v);
  * FIXME Should this be named visit_start_object, since it is also
  * used for QAPI unions, and maps to JSON objects?
  */
-void visit_start_struct(Visitor *v, const char *name, void **obj,
+bool visit_start_struct(Visitor *v, const char *name, void **obj,
                         size_t size, Error **errp);
 
 /*
@@ -304,12 +304,14 @@ void visit_start_struct(Visitor *v, const char *name, void **obj,
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * Should be called prior to visit_end_struct() if all other
  * intermediate visit steps were successful, to allow the visitor one
  * last chance to report errors.  May be skipped on a cleanup path,
  * where there is no need to check for further errors.
  */
-void visit_check_struct(Visitor *v, Error **errp);
+bool visit_check_struct(Visitor *v, Error **errp);
 
 /*
  * Complete an object visit started earlier.
@@ -341,6 +343,8 @@ void visit_end_struct(Visitor *v, void **obj);
  * On failure, set *@list to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * After visit_start_list() succeeds, the caller may visit its members
  * one after the other.  A real visit (where @list is non-NULL) uses
  * visit_next_list() for traversing the linked list, while a virtual
@@ -351,7 +355,7 @@ void visit_end_struct(Visitor *v, void **obj);
  * same @list to clean up, even if intermediate visits fail.  See the
  * examples above.
  */
-void visit_start_list(Visitor *v, const char *name, GenericList **list,
+bool visit_start_list(Visitor *v, const char *name, GenericList **list,
                       size_t size, Error **errp);
 
 /*
@@ -376,12 +380,14 @@ GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size);
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * Should be called prior to visit_end_list() if all other
  * intermediate visit steps were successful, to allow the visitor one
  * last chance to report errors.  May be skipped on a cleanup path,
  * where there is no need to check for further errors.
  */
-void visit_check_list(Visitor *v, Error **errp);
+bool visit_check_list(Visitor *v, Error **errp);
 
 /*
  * Complete a list visit started earlier.
@@ -412,11 +418,13 @@ void visit_end_list(Visitor *v, void **list);
  * On failure, set *@obj to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * If successful, this must be paired with visit_end_alternate() with
  * the same @obj to clean up, even if visiting the contents of the
  * alternate fails.
  */
-void visit_start_alternate(Visitor *v, const char *name,
+bool visit_start_alternate(Visitor *v, const char *name,
                            GenericAlternate **obj, size_t size,
                            Error **errp);
 
@@ -468,12 +476,14 @@ bool visit_optional(Visitor *v, const char *name, bool *present);
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * May call visit_type_str() under the hood, and the enum visit may
  * fail even if the corresponding string visit succeeded; this implies
  * that an input visitor's visit_type_str() must have no unwelcome
  * side effects.
  */
-void visit_type_enum(Visitor *v, const char *name, int *obj,
+bool visit_type_enum(Visitor *v, const char *name, int *obj,
                      const QEnumLookup *lookup, Error **errp);
 
 /*
@@ -499,28 +509,30 @@ bool visit_is_dealloc(Visitor *v);
  *
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
+ *
+ * Return true on succes, false on failure.
  */
-void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp);
+bool visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp);
 
 /*
  * Visit a uint8_t value.
  * Like visit_type_int(), except clamps the value to uint8_t range.
  */
-void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
+bool visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
                       Error **errp);
 
 /*
  * Visit a uint16_t value.
  * Like visit_type_int(), except clamps the value to uint16_t range.
  */
-void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
+bool visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
                        Error **errp);
 
 /*
  * Visit a uint32_t value.
  * Like visit_type_int(), except clamps the value to uint32_t range.
  */
-void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
+bool visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
                        Error **errp);
 
 /*
@@ -528,34 +540,34 @@ void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
  * Like visit_type_int(), except clamps the value to uint64_t range,
  * that is, ensures it is unsigned.
  */
-void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+bool visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
                        Error **errp);
 
 /*
  * Visit an int8_t value.
  * Like visit_type_int(), except clamps the value to int8_t range.
  */
-void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp);
+bool visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp);
 
 /*
  * Visit an int16_t value.
  * Like visit_type_int(), except clamps the value to int16_t range.
  */
-void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
+bool visit_type_int16(Visitor *v, const char *name, int16_t *obj,
                       Error **errp);
 
 /*
  * Visit an int32_t value.
  * Like visit_type_int(), except clamps the value to int32_t range.
  */
-void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
+bool visit_type_int32(Visitor *v, const char *name, int32_t *obj,
                       Error **errp);
 
 /*
  * Visit an int64_t value.
  * Identical to visit_type_int().
  */
-void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
+bool visit_type_int64(Visitor *v, const char *name, int64_t *obj,
                       Error **errp);
 
 /*
@@ -564,7 +576,7 @@ void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
  * recognize additional syntax, such as suffixes for easily scaling
  * values.
  */
-void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
+bool visit_type_size(Visitor *v, const char *name, uint64_t *obj,
                      Error **errp);
 
 /*
@@ -578,8 +590,10 @@ void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
  *
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
+ *
+ * Return true on succes, false on failure.
  */
-void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
+bool visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
 
 /*
  * Visit a string value.
@@ -598,9 +612,11 @@ void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp);
  * On failure, set *@obj to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * FIXME: Callers that try to output NULL *obj should not be allowed.
  */
-void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
+bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
 
 /*
  * Visit a number (i.e. double) value.
@@ -614,8 +630,10 @@ void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp);
  *
  * On failure, store an error through @errp.  Can happen only when @v
  * is an input visitor.
+ *
+ * Return true on succes, false on failure.
  */
-void visit_type_number(Visitor *v, const char *name, double *obj,
+bool visit_type_number(Visitor *v, const char *name, double *obj,
                        Error **errp);
 
 /*
@@ -631,11 +649,13 @@ void visit_type_number(Visitor *v, const char *name, double *obj,
  * On failure, set *@obj to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
  *
+ * Return true on succes, false on failure.
+ *
  * Note that some kinds of input can't express arbitrary QObject.
  * E.g. the visitor returned by qobject_input_visitor_new_keyval()
  * can't create numbers or booleans, only strings.
  */
-void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
+bool visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
 
 /*
  * Visit a JSON null value.
@@ -648,8 +668,10 @@ void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp);
  *
  * On failure, set *@obj to NULL and store an error through @errp.
  * Can happen only when @v is an input visitor.
+ *
+ * Return true on succes, false on failure.
  */
-void visit_type_null(Visitor *v, const char *name, QNull **obj,
+bool visit_type_null(Visitor *v, const char *name, QNull **obj,
                      Error **errp);
 
 #endif
diff --git a/audio/audio_legacy.c b/audio/audio_legacy.c
index ebd7d9fa0d..ffdbd0bcce 100644
--- a/audio/audio_legacy.c
+++ b/audio/audio_legacy.c
@@ -421,11 +421,12 @@ typedef struct {
     GList *path;
 } LegacyPrintVisitor;
 
-static void lv_start_struct(Visitor *v, const char *name, void **obj,
+static bool lv_start_struct(Visitor *v, const char *name, void **obj,
                             size_t size, Error **errp)
 {
     LegacyPrintVisitor *lv = (LegacyPrintVisitor *) v;
     lv->path = g_list_append(lv->path, g_strdup(name));
+    return true;
 }
 
 static void lv_end_struct(Visitor *v, void **obj)
@@ -453,27 +454,30 @@ static void lv_print_key(Visitor *v, const char *name)
     printf("%s=", name);
 }
 
-static void lv_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool lv_type_int64(Visitor *v, const char *name, int64_t *obj,
                           Error **errp)
 {
     lv_print_key(v, name);
     printf("%" PRIi64, *obj);
+    return true;
 }
 
-static void lv_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+static bool lv_type_uint64(Visitor *v, const char *name, uint64_t *obj,
                            Error **errp)
 {
     lv_print_key(v, name);
     printf("%" PRIu64, *obj);
+    return true;
 }
 
-static void lv_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
+static bool lv_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 {
     lv_print_key(v, name);
     printf("%s", *obj ? "on" : "off");
+    return true;
 }
 
-static void lv_type_str(Visitor *v, const char *name, char **obj, Error **errp)
+static bool lv_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 {
     const char *str = *obj;
     lv_print_key(v, name);
@@ -484,6 +488,7 @@ static void lv_type_str(Visitor *v, const char *name, char **obj, Error **errp)
         }
         putchar(*str++);
     }
+    return true;
 }
 
 static void lv_complete(Visitor *v, void *opaque)
diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
index 5fe0276c1c..6d8f4b6928 100644
--- a/qapi/opts-visitor.c
+++ b/qapi/opts-visitor.c
@@ -133,7 +133,7 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const QemuOpt *opt)
 }
 
 
-static void
+static bool
 opts_start_struct(Visitor *v, const char *name, void **obj,
                   size_t size, Error **errp)
 {
@@ -144,7 +144,7 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
         *obj = g_malloc0(size);
     }
     if (ov->depth++ > 0) {
-        return;
+        return true;
     }
 
     ov->unprocessed_opts = g_hash_table_new_full(&g_str_hash, &g_str_equal,
@@ -163,10 +163,11 @@ opts_start_struct(Visitor *v, const char *name, void **obj,
         ov->fake_id_opt->str = g_strdup(ov->opts_root->id);
         opts_visitor_insert(ov->unprocessed_opts, ov->fake_id_opt);
     }
+    return true;
 }
 
 
-static void
+static bool
 opts_check_struct(Visitor *v, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -174,7 +175,7 @@ opts_check_struct(Visitor *v, Error **errp)
     GQueue *any;
 
     if (ov->depth > 1) {
-        return;
+        return true;
     }
 
     /* we should have processed all (distinct) QemuOpt instances */
@@ -184,7 +185,9 @@ opts_check_struct(Visitor *v, Error **errp)
 
         first = g_queue_peek_head(any);
         error_setg(errp, QERR_INVALID_PARAMETER, first->name);
+        return false;
     }
+    return true;
 }
 
 
@@ -221,7 +224,7 @@ lookup_distinct(const OptsVisitor *ov, const char *name, Error **errp)
 }
 
 
-static void
+static bool
 opts_start_list(Visitor *v, const char *name, GenericList **list, size_t size,
                 Error **errp)
 {
@@ -238,6 +241,7 @@ opts_start_list(Visitor *v, const char *name, GenericList **list, size_t size,
     } else {
         *list = NULL;
     }
+    return true;
 }
 
 
@@ -285,13 +289,14 @@ opts_next_list(Visitor *v, GenericList *tail, size_t size)
 }
 
 
-static void
+static bool
 opts_check_list(Visitor *v, Error **errp)
 {
     /*
      * Unvisited list elements will be reported later when checking
      * whether unvisited struct members remain.
      */
+    return true;
 }
 
 
@@ -341,7 +346,7 @@ processed(OptsVisitor *ov, const char *name)
 }
 
 
-static void
+static bool
 opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -350,7 +355,7 @@ opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
     opt = lookup_scalar(ov, name, errp);
     if (!opt) {
         *obj = NULL;
-        return;
+        return false;
     }
     *obj = g_strdup(opt->str ? opt->str : "");
     /* Note that we consume a string even if this is called as part of
@@ -359,11 +364,12 @@ opts_type_str(Visitor *v, const char *name, char **obj, Error **errp)
      * consumed only matters to visit_end_struct() as the final error
      * check if there were no other failures during the visit.  */
     processed(ov, name);
+    return true;
 }
 
 
 /* mimics qemu-option.c::parse_option_bool() */
-static void
+static bool
 opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -371,7 +377,7 @@ opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 
     opt = lookup_scalar(ov, name, errp);
     if (!opt) {
-        return;
+        return false;
     }
 
     if (opt->str) {
@@ -386,17 +392,18 @@ opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
         } else {
             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
                        "on|yes|y|off|no|n");
-            return;
+            return false;
         }
     } else {
         *obj = true;
     }
 
     processed(ov, name);
+    return true;
 }
 
 
-static void
+static bool
 opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -407,12 +414,12 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
 
     if (ov->list_mode == LM_SIGNED_INTERVAL) {
         *obj = ov->range_next.s;
-        return;
+        return true;
     }
 
     opt = lookup_scalar(ov, name, errp);
     if (!opt) {
-        return;
+        return false;
     }
     str = opt->str ? opt->str : "";
 
@@ -425,7 +432,7 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
         if (*endptr == '\0') {
             *obj = val;
             processed(ov, name);
-            return;
+            return true;
         }
         if (*endptr == '-' && ov->list_mode == LM_IN_PROGRESS) {
             long long val2;
@@ -442,17 +449,18 @@ opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp)
 
                 /* as if entering on the top */
                 *obj = ov->range_next.s;
-                return;
+                return true;
             }
         }
     }
     error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
                (ov->list_mode == LM_NONE) ? "an int64 value" :
                                             "an int64 value or range");
+    return false;
 }
 
 
-static void
+static bool
 opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -463,12 +471,12 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 
     if (ov->list_mode == LM_UNSIGNED_INTERVAL) {
         *obj = ov->range_next.u;
-        return;
+        return true;
     }
 
     opt = lookup_scalar(ov, name, errp);
     if (!opt) {
-        return;
+        return false;
     }
     str = opt->str;
 
@@ -479,7 +487,7 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
         if (*endptr == '\0') {
             *obj = val;
             processed(ov, name);
-            return;
+            return true;
         }
         if (*endptr == '-' && ov->list_mode == LM_IN_PROGRESS) {
             unsigned long long val2;
@@ -494,17 +502,18 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 
                 /* as if entering on the top */
                 *obj = ov->range_next.u;
-                return;
+                return true;
             }
         }
     }
     error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
                (ov->list_mode == LM_NONE) ? "a uint64 value" :
                                             "a uint64 value or range");
+    return false;
 }
 
 
-static void
+static bool
 opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 {
     OptsVisitor *ov = to_ov(v);
@@ -513,17 +522,18 @@ opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp)
 
     opt = lookup_scalar(ov, name, errp);
     if (!opt) {
-        return;
+        return false;
     }
 
     err = qemu_strtosz(opt->str ? opt->str : "", NULL, obj);
     if (err < 0) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name,
                    "a size value");
-        return;
+        return false;
     }
 
     processed(ov, name);
+    return true;
 }
 
 
diff --git a/qapi/qapi-clone-visitor.c b/qapi/qapi-clone-visitor.c
index daab6819b4..0f7e118087 100644
--- a/qapi/qapi-clone-visitor.c
+++ b/qapi/qapi-clone-visitor.c
@@ -24,7 +24,7 @@ static QapiCloneVisitor *to_qcv(Visitor *v)
     return container_of(v, QapiCloneVisitor, visitor);
 }
 
-static void qapi_clone_start_struct(Visitor *v, const char *name, void **obj,
+static bool qapi_clone_start_struct(Visitor *v, const char *name, void **obj,
                                     size_t size, Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
@@ -34,11 +34,12 @@ static void qapi_clone_start_struct(Visitor *v, const char *name, void **obj,
         /* Only possible when visiting an alternate's object
          * branch. Nothing further to do here, since the earlier
          * visit_start_alternate() already copied memory. */
-        return;
+        return true;
     }
 
     *obj = g_memdup(*obj, size);
     qcv->depth++;
+    return true;
 }
 
 static void qapi_clone_end(Visitor *v, void **obj)
@@ -51,11 +52,12 @@ static void qapi_clone_end(Visitor *v, void **obj)
     }
 }
 
-static void qapi_clone_start_list(Visitor *v, const char *name,
+static bool qapi_clone_start_list(Visitor *v, const char *name,
                                   GenericList **listp, size_t size,
                                   Error **errp)
 {
     qapi_clone_start_struct(v, name, (void **)listp, size, errp);
+    return true;
 }
 
 static GenericList *qapi_clone_next_list(Visitor *v, GenericList *tail,
@@ -69,41 +71,45 @@ static GenericList *qapi_clone_next_list(Visitor *v, GenericList *tail,
     return tail->next;
 }
 
-static void qapi_clone_start_alternate(Visitor *v, const char *name,
+static bool qapi_clone_start_alternate(Visitor *v, const char *name,
                                        GenericAlternate **obj, size_t size,
                                        Error **errp)
 {
     qapi_clone_start_struct(v, name, (void **)obj, size, errp);
+    return true;
 }
 
-static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
                                    Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
     assert(qcv->depth);
     /* Value was already cloned by g_memdup() */
+    return true;
 }
 
-static void qapi_clone_type_uint64(Visitor *v, const char *name,
+static bool qapi_clone_type_uint64(Visitor *v, const char *name,
                                     uint64_t *obj, Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
     assert(qcv->depth);
     /* Value was already cloned by g_memdup() */
+    return true;
 }
 
-static void qapi_clone_type_bool(Visitor *v, const char *name, bool *obj,
+static bool qapi_clone_type_bool(Visitor *v, const char *name, bool *obj,
                                   Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
     assert(qcv->depth);
     /* Value was already cloned by g_memdup() */
+    return true;
 }
 
-static void qapi_clone_type_str(Visitor *v, const char *name, char **obj,
+static bool qapi_clone_type_str(Visitor *v, const char *name, char **obj,
                                  Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
@@ -117,24 +123,27 @@ static void qapi_clone_type_str(Visitor *v, const char *name, char **obj,
      * string is intended.
      */
     *obj = g_strdup(*obj ?: "");
+    return true;
 }
 
-static void qapi_clone_type_number(Visitor *v, const char *name, double *obj,
+static bool qapi_clone_type_number(Visitor *v, const char *name, double *obj,
                                     Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
     assert(qcv->depth);
     /* Value was already cloned by g_memdup() */
+    return true;
 }
 
-static void qapi_clone_type_null(Visitor *v, const char *name, QNull **obj,
+static bool qapi_clone_type_null(Visitor *v, const char *name, QNull **obj,
                                  Error **errp)
 {
     QapiCloneVisitor *qcv = to_qcv(v);
 
     assert(qcv->depth);
     *obj = qnull();
+    return true;
 }
 
 static void qapi_clone_free(Visitor *v)
@@ -167,7 +176,7 @@ static Visitor *qapi_clone_visitor_new(void)
     return &v->visitor;
 }
 
-void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
+void *qapi_clone(const void *src, bool (*visit_type)(Visitor *, const char *,
                                                      void **, Error **))
 {
     Visitor *v;
@@ -184,7 +193,7 @@ void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char *,
 }
 
 void qapi_clone_members(void *dst, const void *src, size_t sz,
-                        void (*visit_type_members)(Visitor *, void *,
+                        bool (*visit_type_members)(Visitor *, void *,
                                                    Error **))
 {
     Visitor *v;
diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
index 2239fc6417..ef283f2966 100644
--- a/qapi/qapi-dealloc-visitor.c
+++ b/qapi/qapi-dealloc-visitor.c
@@ -22,9 +22,10 @@ struct QapiDeallocVisitor
     Visitor visitor;
 };
 
-static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj,
+static bool qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj,
                                       size_t unused, Error **errp)
 {
+    return true;
 }
 
 static void qapi_dealloc_end_struct(Visitor *v, void **obj)
@@ -41,10 +42,11 @@ static void qapi_dealloc_end_alternate(Visitor *v, void **obj)
     }
 }
 
-static void qapi_dealloc_start_list(Visitor *v, const char *name,
+static bool qapi_dealloc_start_list(Visitor *v, const char *name,
                                     GenericList **list, size_t size,
                                     Error **errp)
 {
+    return true;
 }
 
 static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList *tail,
@@ -59,48 +61,55 @@ static void qapi_dealloc_end_list(Visitor *v, void **obj)
 {
 }
 
-static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj,
+static bool qapi_dealloc_type_str(Visitor *v, const char *name, char **obj,
                                   Error **errp)
 {
     if (obj) {
         g_free(*obj);
     }
+    return true;
 }
 
-static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj,
                                     Error **errp)
 {
+    return true;
 }
 
-static void qapi_dealloc_type_uint64(Visitor *v, const char *name,
+static bool qapi_dealloc_type_uint64(Visitor *v, const char *name,
                                      uint64_t *obj, Error **errp)
 {
+    return true;
 }
 
-static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj,
+static bool qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj,
                                    Error **errp)
 {
+    return true;
 }
 
-static void qapi_dealloc_type_number(Visitor *v, const char *name, double *obj,
+static bool qapi_dealloc_type_number(Visitor *v, const char *name, double *obj,
                                      Error **errp)
 {
+    return true;
 }
 
-static void qapi_dealloc_type_anything(Visitor *v, const char *name,
+static bool qapi_dealloc_type_anything(Visitor *v, const char *name,
                                        QObject **obj, Error **errp)
 {
     if (obj) {
         qobject_unref(*obj);
     }
+    return true;
 }
 
-static void qapi_dealloc_type_null(Visitor *v, const char *name,
+static bool qapi_dealloc_type_null(Visitor *v, const char *name,
                                    QNull **obj, Error **errp)
 {
     if (obj) {
         qobject_unref(*obj);
     }
+    return true;
 }
 
 static void qapi_dealloc_free(Visitor *v)
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index 74aa9c04bd..5a9c47aabf 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -36,7 +36,7 @@ void visit_free(Visitor *v)
     }
 }
 
-void visit_start_struct(Visitor *v, const char *name, void **obj,
+bool visit_start_struct(Visitor *v, const char *name, void **obj,
                         size_t size, Error **errp)
 {
     Error *err = NULL;
@@ -51,14 +51,13 @@ void visit_start_struct(Visitor *v, const char *name, void **obj,
         assert(!err != !*obj);
     }
     error_propagate(errp, err);
+    return !err;
 }
 
-void visit_check_struct(Visitor *v, Error **errp)
+bool visit_check_struct(Visitor *v, Error **errp)
 {
     trace_visit_check_struct(v);
-    if (v->check_struct) {
-        v->check_struct(v, errp);
-    }
+    return v->check_struct ? v->check_struct(v, errp) : true;
 }
 
 void visit_end_struct(Visitor *v, void **obj)
@@ -67,7 +66,7 @@ void visit_end_struct(Visitor *v, void **obj)
     v->end_struct(v, obj);
 }
 
-void visit_start_list(Visitor *v, const char *name, GenericList **list,
+bool visit_start_list(Visitor *v, const char *name, GenericList **list,
                       size_t size, Error **errp)
 {
     Error *err = NULL;
@@ -79,6 +78,7 @@ void visit_start_list(Visitor *v, const char *name, GenericList **list,
         assert(!(err && *list));
     }
     error_propagate(errp, err);
+    return !err;
 }
 
 GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size)
@@ -88,12 +88,10 @@ GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size)
     return v->next_list(v, tail, size);
 }
 
-void visit_check_list(Visitor *v, Error **errp)
+bool visit_check_list(Visitor *v, Error **errp)
 {
     trace_visit_check_list(v);
-    if (v->check_list) {
-        v->check_list(v, errp);
-    }
+    return v->check_list ? v->check_list(v, errp) : true;
 }
 
 void visit_end_list(Visitor *v, void **obj)
@@ -102,7 +100,7 @@ void visit_end_list(Visitor *v, void **obj)
     v->end_list(v, obj);
 }
 
-void visit_start_alternate(Visitor *v, const char *name,
+bool visit_start_alternate(Visitor *v, const char *name,
                            GenericAlternate **obj, size_t size,
                            Error **errp)
 {
@@ -118,6 +116,7 @@ void visit_start_alternate(Visitor *v, const char *name,
         assert(v->start_alternate && !err != !*obj);
     }
     error_propagate(errp, err);
+    return !err;
 }
 
 void visit_end_alternate(Visitor *v, void **obj)
@@ -147,155 +146,168 @@ bool visit_is_dealloc(Visitor *v)
     return v->type == VISITOR_DEALLOC;
 }
 
-void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp)
+bool visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp)
 {
     assert(obj);
     trace_visit_type_int(v, name, obj);
-    v->type_int64(v, name, obj, errp);
+    return v->type_int64(v, name, obj, errp);
 }
 
-static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
+static bool visit_type_uintN(Visitor *v, uint64_t *obj, const char *name,
                              uint64_t max, const char *type, Error **errp)
 {
-    Error *err = NULL;
     uint64_t value = *obj;
 
     assert(v->type == VISITOR_INPUT || value <= max);
 
-    v->type_uint64(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
-    } else if (value > max) {
+    if (!v->type_uint64(v, name, &value, errp)) {
+        return false;
+    }
+    if (value > max) {
         assert(v->type == VISITOR_INPUT);
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    name ? name : "null", type);
-    } else {
-        *obj = value;
+        return false;
     }
+    *obj = value;
+    return true;
 }
 
-void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
+bool visit_type_uint8(Visitor *v, const char *name, uint8_t *obj,
                       Error **errp)
 {
     uint64_t value;
+    bool ok;
 
     trace_visit_type_uint8(v, name, obj);
     value = *obj;
-    visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp);
+    ok = visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
+bool visit_type_uint16(Visitor *v, const char *name, uint16_t *obj,
                        Error **errp)
 {
     uint64_t value;
+    bool ok;
 
     trace_visit_type_uint16(v, name, obj);
     value = *obj;
-    visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp);
+    ok = visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
+bool visit_type_uint32(Visitor *v, const char *name, uint32_t *obj,
                        Error **errp)
 {
     uint64_t value;
+    bool ok;
 
     trace_visit_type_uint32(v, name, obj);
     value = *obj;
-    visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp);
+    ok = visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+bool visit_type_uint64(Visitor *v, const char *name, uint64_t *obj,
                        Error **errp)
 {
     assert(obj);
     trace_visit_type_uint64(v, name, obj);
-    v->type_uint64(v, name, obj, errp);
+    return v->type_uint64(v, name, obj, errp);
 }
 
-static void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
+static bool visit_type_intN(Visitor *v, int64_t *obj, const char *name,
                             int64_t min, int64_t max, const char *type,
                             Error **errp)
 {
-    Error *err = NULL;
     int64_t value = *obj;
 
     assert(v->type == VISITOR_INPUT || (value >= min && value <= max));
 
-    v->type_int64(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
-    } else if (value < min || value > max) {
+    if (!v->type_int64(v, name, &value, errp)) {
+        return false;
+    }
+    if (value < min || value > max) {
         assert(v->type == VISITOR_INPUT);
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    name ? name : "null", type);
-    } else {
-        *obj = value;
+        return false;
     }
+    *obj = value;
+    return true;
 }
 
-void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp)
+bool visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp)
 {
     int64_t value;
+    bool ok;
 
     trace_visit_type_int8(v, name, obj);
     value = *obj;
-    visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", errp);
+    ok = visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_int16(Visitor *v, const char *name, int16_t *obj,
+bool visit_type_int16(Visitor *v, const char *name, int16_t *obj,
                       Error **errp)
 {
     int64_t value;
+    bool ok;
 
     trace_visit_type_int16(v, name, obj);
     value = *obj;
-    visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t", errp);
+    ok = visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t",
+                         errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_int32(Visitor *v, const char *name, int32_t *obj,
+bool visit_type_int32(Visitor *v, const char *name, int32_t *obj,
                       Error **errp)
 {
     int64_t value;
+    bool ok;
 
     trace_visit_type_int32(v, name, obj);
     value = *obj;
-    visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t", errp);
+    ok = visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t",
+                        errp);
     *obj = value;
+    return ok;
 }
 
-void visit_type_int64(Visitor *v, const char *name, int64_t *obj,
+bool visit_type_int64(Visitor *v, const char *name, int64_t *obj,
                       Error **errp)
 {
     assert(obj);
     trace_visit_type_int64(v, name, obj);
-    v->type_int64(v, name, obj, errp);
+    return v->type_int64(v, name, obj, errp);
 }
 
-void visit_type_size(Visitor *v, const char *name, uint64_t *obj,
+bool visit_type_size(Visitor *v, const char *name, uint64_t *obj,
                      Error **errp)
 {
     assert(obj);
     trace_visit_type_size(v, name, obj);
     if (v->type_size) {
-        v->type_size(v, name, obj, errp);
-    } else {
-        v->type_uint64(v, name, obj, errp);
+        return v->type_size(v, name, obj, errp);
     }
+    return v->type_uint64(v, name, obj, errp);
 }
 
-void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
+bool visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 {
     assert(obj);
     trace_visit_type_bool(v, name, obj);
-    v->type_bool(v, name, obj, errp);
+    return v->type_bool(v, name, obj, errp);
 }
 
-void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
+bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 {
     Error *err = NULL;
 
@@ -310,89 +322,88 @@ void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
         assert(!err != !*obj);
     }
     error_propagate(errp, err);
+    return !err;
 }
 
-void visit_type_number(Visitor *v, const char *name, double *obj,
+bool visit_type_number(Visitor *v, const char *name, double *obj,
                        Error **errp)
 {
     assert(obj);
     trace_visit_type_number(v, name, obj);
-    v->type_number(v, name, obj, errp);
+    return v->type_number(v, name, obj, errp);
 }
 
-void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp)
+bool visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp)
 {
-    Error *err = NULL;
+    bool ok;
 
     assert(obj);
     assert(v->type != VISITOR_OUTPUT || *obj);
     trace_visit_type_any(v, name, obj);
-    v->type_any(v, name, obj, &err);
+    ok = v->type_any(v, name, obj, errp);
     if (v->type == VISITOR_INPUT) {
-        assert(!err != !*obj);
+        assert(ok != !*obj);
     }
-    error_propagate(errp, err);
+    return ok;
 }
 
-void visit_type_null(Visitor *v, const char *name, QNull **obj,
+bool visit_type_null(Visitor *v, const char *name, QNull **obj,
                      Error **errp)
 {
     trace_visit_type_null(v, name, obj);
-    v->type_null(v, name, obj, errp);
+    return v->type_null(v, name, obj, errp);
 }
 
-static void output_type_enum(Visitor *v, const char *name, int *obj,
+static bool output_type_enum(Visitor *v, const char *name, int *obj,
                              const QEnumLookup *lookup, Error **errp)
 {
     int value = *obj;
     char *enum_str;
 
     enum_str = (char *)qapi_enum_lookup(lookup, value);
-    visit_type_str(v, name, &enum_str, errp);
+    return visit_type_str(v, name, &enum_str, errp);
 }
 
-static void input_type_enum(Visitor *v, const char *name, int *obj,
+static bool input_type_enum(Visitor *v, const char *name, int *obj,
                             const QEnumLookup *lookup, Error **errp)
 {
-    Error *local_err = NULL;
     int64_t value;
     char *enum_str;
 
-    visit_type_str(v, name, &enum_str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
-        return;
+    if (!visit_type_str(v, name, &enum_str, errp)) {
+        return false;
     }
 
     value = qapi_enum_parse(lookup, enum_str, -1, NULL);
     if (value < 0) {
         error_setg(errp, QERR_INVALID_PARAMETER, enum_str);
         g_free(enum_str);
-        return;
+        return false;
     }
 
     g_free(enum_str);
     *obj = value;
+    return true;
 }
 
-void visit_type_enum(Visitor *v, const char *name, int *obj,
+bool visit_type_enum(Visitor *v, const char *name, int *obj,
                      const QEnumLookup *lookup, Error **errp)
 {
     assert(obj && lookup);
     trace_visit_type_enum(v, name, obj);
     switch (v->type) {
     case VISITOR_INPUT:
-        input_type_enum(v, name, obj, lookup, errp);
-        break;
+        return input_type_enum(v, name, obj, lookup, errp);
     case VISITOR_OUTPUT:
-        output_type_enum(v, name, obj, lookup, errp);
-        break;
+        return output_type_enum(v, name, obj, lookup, errp);
     case VISITOR_CLONE:
         /* nothing further to do, scalar value was already copied by
          * g_memdup() during visit_start_*() */
-        break;
+        return true;
     case VISITOR_DEALLOC:
         /* nothing to deallocate for a scalar */
-        break;
+        return true;
+    default:
+        abort();
     }
 }
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 5ce3ec2e5f..f918a05e5f 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -237,7 +237,7 @@ static const QListEntry *qobject_input_push(QObjectInputVisitor *qiv,
 }
 
 
-static void qobject_input_check_struct(Visitor *v, Error **errp)
+static bool qobject_input_check_struct(Visitor *v, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     StackObject *tos = QSLIST_FIRST(&qiv->stack);
@@ -250,7 +250,9 @@ static void qobject_input_check_struct(Visitor *v, Error **errp)
     if (g_hash_table_iter_next(&iter, (void **)&key, NULL)) {
         error_setg(errp, "Parameter '%s' is unexpected",
                    full_name(qiv, key));
+        return false;
     }
+    return true;
 }
 
 static void qobject_input_stack_object_free(StackObject *tos)
@@ -272,7 +274,7 @@ static void qobject_input_pop(Visitor *v, void **obj)
     qobject_input_stack_object_free(tos);
 }
 
-static void qobject_input_start_struct(Visitor *v, const char *name, void **obj,
+static bool qobject_input_start_struct(Visitor *v, const char *name, void **obj,
                                        size_t size, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -282,12 +284,12 @@ static void qobject_input_start_struct(Visitor *v, const char *name, void **obj,
         *obj = NULL;
     }
     if (!qobj) {
-        return;
+        return false;
     }
     if (qobject_type(qobj) != QTYPE_QDICT) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "object");
-        return;
+        return false;
     }
 
     qobject_input_push(qiv, name, qobj, obj);
@@ -295,6 +297,7 @@ static void qobject_input_start_struct(Visitor *v, const char *name, void **obj,
     if (obj) {
         *obj = g_malloc0(size);
     }
+    return true;
 }
 
 static void qobject_input_end_struct(Visitor *v, void **obj)
@@ -307,7 +310,7 @@ static void qobject_input_end_struct(Visitor *v, void **obj)
 }
 
 
-static void qobject_input_start_list(Visitor *v, const char *name,
+static bool qobject_input_start_list(Visitor *v, const char *name,
                                      GenericList **list, size_t size,
                                      Error **errp)
 {
@@ -319,18 +322,19 @@ static void qobject_input_start_list(Visitor *v, const char *name,
         *list = NULL;
     }
     if (!qobj) {
-        return;
+        return false;
     }
     if (qobject_type(qobj) != QTYPE_QLIST) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "array");
-        return;
+        return false;
     }
 
     entry = qobject_input_push(qiv, name, qobj, list);
     if (entry && list) {
         *list = g_malloc0(size);
     }
+    return true;
 }
 
 static GenericList *qobject_input_next_list(Visitor *v, GenericList *tail,
@@ -348,7 +352,7 @@ static GenericList *qobject_input_next_list(Visitor *v, GenericList *tail,
     return tail->next;
 }
 
-static void qobject_input_check_list(Visitor *v, Error **errp)
+static bool qobject_input_check_list(Visitor *v, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     StackObject *tos = QSLIST_FIRST(&qiv->stack);
@@ -358,7 +362,9 @@ static void qobject_input_check_list(Visitor *v, Error **errp)
     if (tos->entry) {
         error_setg(errp, "Only %u list elements expected in %s",
                    tos->index + 1, full_name_nth(qiv, NULL, 1));
+        return false;
     }
+    return true;
 }
 
 static void qobject_input_end_list(Visitor *v, void **obj)
@@ -370,7 +376,7 @@ static void qobject_input_end_list(Visitor *v, void **obj)
     qobject_input_pop(v, obj);
 }
 
-static void qobject_input_start_alternate(Visitor *v, const char *name,
+static bool qobject_input_start_alternate(Visitor *v, const char *name,
                                           GenericAlternate **obj, size_t size,
                                           Error **errp)
 {
@@ -379,13 +385,14 @@ static void qobject_input_start_alternate(Visitor *v, const char *name,
 
     if (!qobj) {
         *obj = NULL;
-        return;
+        return false;
     }
     *obj = g_malloc0(size);
     (*obj)->type = qobject_type(qobj);
+    return true;
 }
 
-static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
                                      Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -393,33 +400,37 @@ static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
     QNum *qnum;
 
     if (!qobj) {
-        return;
+        return false;
     }
     qnum = qobject_to(QNum, qobj);
     if (!qnum || !qnum_get_try_int(qnum, obj)) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "integer");
+        return false;
     }
+    return true;
 }
 
-static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_int64_keyval(Visitor *v, const char *name,
                                             int64_t *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
 
     if (!str) {
-        return;
+        return false;
     }
 
     if (qemu_strtoi64(str, NULL, 0, obj) < 0) {
         /* TODO report -ERANGE more nicely */
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    full_name(qiv, name), "integer");
+        return false;
     }
+    return true;
 }
 
-static void qobject_input_type_uint64(Visitor *v, const char *name,
+static bool qobject_input_type_uint64(Visitor *v, const char *name,
                                       uint64_t *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -428,7 +439,7 @@ static void qobject_input_type_uint64(Visitor *v, const char *name,
     int64_t val;
 
     if (!qobj) {
-        return;
+        return false;
     }
     qnum = qobject_to(QNum, qobj);
     if (!qnum) {
@@ -436,38 +447,41 @@ static void qobject_input_type_uint64(Visitor *v, const char *name,
     }
 
     if (qnum_get_try_uint(qnum, obj)) {
-        return;
+        return true;
     }
 
     /* Need to accept negative values for backward compatibility */
     if (qnum_get_try_int(qnum, &val)) {
         *obj = val;
-        return;
+        return true;
     }
 
 err:
     error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                full_name(qiv, name), "uint64");
+    return false;
 }
 
-static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_uint64_keyval(Visitor *v, const char *name,
                                              uint64_t *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
 
     if (!str) {
-        return;
+        return false;
     }
 
     if (qemu_strtou64(str, NULL, 0, obj) < 0) {
         /* TODO report -ERANGE more nicely */
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    full_name(qiv, name), "integer");
+        return false;
     }
+    return true;
 }
 
-static void qobject_input_type_bool(Visitor *v, const char *name, bool *obj,
+static bool qobject_input_type_bool(Visitor *v, const char *name, bool *obj,
                                     Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -475,26 +489,27 @@ static void qobject_input_type_bool(Visitor *v, const char *name, bool *obj,
     QBool *qbool;
 
     if (!qobj) {
-        return;
+        return false;
     }
     qbool = qobject_to(QBool, qobj);
     if (!qbool) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "boolean");
-        return;
+        return false;
     }
 
     *obj = qbool_get_bool(qbool);
+    return true;
 }
 
-static void qobject_input_type_bool_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_bool_keyval(Visitor *v, const char *name,
                                            bool *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
 
     if (!str) {
-        return;
+        return false;
     }
 
     if (!strcmp(str, "on")) {
@@ -504,10 +519,12 @@ static void qobject_input_type_bool_keyval(Visitor *v, const char *name,
     } else {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    full_name(qiv, name), "'on' or 'off'");
+        return false;
     }
+    return true;
 }
 
-static void qobject_input_type_str(Visitor *v, const char *name, char **obj,
+static bool qobject_input_type_str(Visitor *v, const char *name, char **obj,
                                    Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -516,28 +533,30 @@ static void qobject_input_type_str(Visitor *v, const char *name, char **obj,
 
     *obj = NULL;
     if (!qobj) {
-        return;
+        return false;
     }
     qstr = qobject_to(QString, qobj);
     if (!qstr) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "string");
-        return;
+        return false;
     }
 
     *obj = g_strdup(qstring_get_str(qstr));
+    return true;
 }
 
-static void qobject_input_type_str_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_str_keyval(Visitor *v, const char *name,
                                           char **obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
 
     *obj = g_strdup(str);
+    return !!str;
 }
 
-static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
+static bool qobject_input_type_number(Visitor *v, const char *name, double *obj,
                                       Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -545,19 +564,20 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
     QNum *qnum;
 
     if (!qobj) {
-        return;
+        return false;
     }
     qnum = qobject_to(QNum, qobj);
     if (!qnum) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "number");
-        return;
+        return false;
     }
 
     *obj = qnum_get_double(qnum);
+    return true;
 }
 
-static void qobject_input_type_number_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_number_keyval(Visitor *v, const char *name,
                                              double *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -565,20 +585,21 @@ static void qobject_input_type_number_keyval(Visitor *v, const char *name,
     double val;
 
     if (!str) {
-        return;
+        return false;
     }
 
     if (qemu_strtod_finite(str, NULL, &val)) {
         /* TODO report -ERANGE more nicely */
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "number");
-        return;
+        return false;
     }
 
     *obj = val;
+    return true;
 }
 
-static void qobject_input_type_any(Visitor *v, const char *name, QObject **obj,
+static bool qobject_input_type_any(Visitor *v, const char *name, QObject **obj,
                                    Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -586,13 +607,14 @@ static void qobject_input_type_any(Visitor *v, const char *name, QObject **obj,
 
     *obj = NULL;
     if (!qobj) {
-        return;
+        return false;
     }
 
     *obj = qobject_ref(qobj);
+    return true;
 }
 
-static void qobject_input_type_null(Visitor *v, const char *name,
+static bool qobject_input_type_null(Visitor *v, const char *name,
                                     QNull **obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
@@ -600,32 +622,35 @@ static void qobject_input_type_null(Visitor *v, const char *name,
 
     *obj = NULL;
     if (!qobj) {
-        return;
+        return false;
     }
 
     if (qobject_type(qobj) != QTYPE_QNULL) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                    full_name(qiv, name), "null");
-        return;
+        return false;
     }
     *obj = qnull();
+    return true;
 }
 
-static void qobject_input_type_size_keyval(Visitor *v, const char *name,
+static bool qobject_input_type_size_keyval(Visitor *v, const char *name,
                                            uint64_t *obj, Error **errp)
 {
     QObjectInputVisitor *qiv = to_qiv(v);
     const char *str = qobject_input_get_keyval(qiv, name, errp);
 
     if (!str) {
-        return;
+        return false;
     }
 
     if (qemu_strtosz(str, NULL, obj) < 0) {
         /* TODO report -ERANGE more nicely */
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                    full_name(qiv, name), "size");
+        return false;
     }
+    return true;
 }
 
 static void qobject_input_optional(Visitor *v, const char *name, bool *present)
diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
index 26d7be5ec9..ba6f6ac8a7 100644
--- a/qapi/qobject-output-visitor.c
+++ b/qapi/qobject-output-visitor.c
@@ -103,7 +103,7 @@ static void qobject_output_add_obj(QObjectOutputVisitor *qov, const char *name,
     }
 }
 
-static void qobject_output_start_struct(Visitor *v, const char *name,
+static bool qobject_output_start_struct(Visitor *v, const char *name,
                                         void **obj, size_t unused, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
@@ -111,6 +111,7 @@ static void qobject_output_start_struct(Visitor *v, const char *name,
 
     qobject_output_add(qov, name, dict);
     qobject_output_push(qov, dict, obj);
+    return true;
 }
 
 static void qobject_output_end_struct(Visitor *v, void **obj)
@@ -120,7 +121,7 @@ static void qobject_output_end_struct(Visitor *v, void **obj)
     assert(qobject_type(value) == QTYPE_QDICT);
 }
 
-static void qobject_output_start_list(Visitor *v, const char *name,
+static bool qobject_output_start_list(Visitor *v, const char *name,
                                       GenericList **listp, size_t size,
                                       Error **errp)
 {
@@ -129,6 +130,7 @@ static void qobject_output_start_list(Visitor *v, const char *name,
 
     qobject_output_add(qov, name, list);
     qobject_output_push(qov, list, listp);
+    return true;
 }
 
 static GenericList *qobject_output_next_list(Visitor *v, GenericList *tail,
@@ -144,28 +146,31 @@ static void qobject_output_end_list(Visitor *v, void **obj)
     assert(qobject_type(value) == QTYPE_QLIST);
 }
 
-static void qobject_output_type_int64(Visitor *v, const char *name,
+static bool qobject_output_type_int64(Visitor *v, const char *name,
                                       int64_t *obj, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qnum_from_int(*obj));
+    return true;
 }
 
-static void qobject_output_type_uint64(Visitor *v, const char *name,
+static bool qobject_output_type_uint64(Visitor *v, const char *name,
                                        uint64_t *obj, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qnum_from_uint(*obj));
+    return true;
 }
 
-static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
+static bool qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
                                      Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qbool_from_bool(*obj));
+    return true;
 }
 
-static void qobject_output_type_str(Visitor *v, const char *name, char **obj,
+static bool qobject_output_type_str(Visitor *v, const char *name, char **obj,
                                     Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
@@ -174,28 +179,32 @@ static void qobject_output_type_str(Visitor *v, const char *name, char **obj,
     } else {
         qobject_output_add(qov, name, qstring_from_str(""));
     }
+    return true;
 }
 
-static void qobject_output_type_number(Visitor *v, const char *name,
+static bool qobject_output_type_number(Visitor *v, const char *name,
                                        double *obj, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qnum_from_double(*obj));
+    return true;
 }
 
-static void qobject_output_type_any(Visitor *v, const char *name,
+static bool qobject_output_type_any(Visitor *v, const char *name,
                                     QObject **obj, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
 
     qobject_output_add_obj(qov, name, qobject_ref(*obj));
+    return true;
 }
 
-static void qobject_output_type_null(Visitor *v, const char *name,
+static bool qobject_output_type_null(Visitor *v, const char *name,
                                      QNull **obj, Error **errp)
 {
     QObjectOutputVisitor *qov = to_qov(v);
     qobject_output_add(qov, name, qnull());
+    return true;
 }
 
 /* Finish building, and return the root object.
diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index de483fe847..6e53396ea3 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -60,7 +60,7 @@ static StringInputVisitor *to_siv(Visitor *v)
     return container_of(v, StringInputVisitor, visitor);
 }
 
-static void start_list(Visitor *v, const char *name, GenericList **list,
+static bool start_list(Visitor *v, const char *name, GenericList **list,
                        size_t size, Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -80,6 +80,7 @@ static void start_list(Visitor *v, const char *name, GenericList **list,
         }
         siv->lm = LM_UNPARSED;
     }
+    return true;
 }
 
 static GenericList *next_list(Visitor *v, GenericList *tail, size_t size)
@@ -102,7 +103,7 @@ static GenericList *next_list(Visitor *v, GenericList *tail, size_t size)
     return tail->next;
 }
 
-static void check_list(Visitor *v, Error **errp)
+static bool check_list(Visitor *v, Error **errp)
 {
     const StringInputVisitor *siv = to_siv(v);
 
@@ -111,9 +112,9 @@ static void check_list(Visitor *v, Error **errp)
     case LM_UINT64_RANGE:
     case LM_UNPARSED:
         error_setg(errp, "Fewer list elements expected");
-        return;
+        return false;
     case LM_END:
-        return;
+        return true;
     default:
         abort();
     }
@@ -178,7 +179,7 @@ static int try_parse_int64_list_entry(StringInputVisitor *siv, int64_t *obj)
     return 0;
 }
 
-static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool parse_type_int64(Visitor *v, const char *name, int64_t *obj,
                              Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -188,17 +189,17 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
     case LM_NONE:
         /* just parse a simple int64, bail out if not completely consumed */
         if (qemu_strtoi64(siv->string, NULL, 0, &val)) {
-                error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
-                           name ? name : "null", "int64");
-            return;
+            error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+                       name ? name : "null", "int64");
+            return false;
         }
         *obj = val;
-        return;
+        return true;
     case LM_UNPARSED:
         if (try_parse_int64_list_entry(siv, obj)) {
             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
                        "list of int64 values or ranges");
-            return;
+            return false;
         }
         assert(siv->lm == LM_INT64_RANGE);
         /* fall through */
@@ -211,10 +212,10 @@ static void parse_type_int64(Visitor *v, const char *name, int64_t *obj,
             /* end of range, check if there is more to parse */
             siv->lm = siv->unparsed_string[0] ? LM_UNPARSED : LM_END;
         }
-        return;
+        return true;
     case LM_END:
         error_setg(errp, "Fewer list elements expected");
-        return;
+        return false;
     default:
         abort();
     }
@@ -268,7 +269,7 @@ static int try_parse_uint64_list_entry(StringInputVisitor *siv, uint64_t *obj)
     return 0;
 }
 
-static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+static bool parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
                               Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -280,15 +281,15 @@ static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
         if (qemu_strtou64(siv->string, NULL, 0, &val)) {
             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
                        "uint64");
-            return;
+            return false;
         }
         *obj = val;
-        return;
+        return true;
     case LM_UNPARSED:
         if (try_parse_uint64_list_entry(siv, obj)) {
             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
                        "list of uint64 values or ranges");
-            return;
+            return false;
         }
         assert(siv->lm == LM_UINT64_RANGE);
         /* fall through */
@@ -301,16 +302,16 @@ static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj,
             /* end of range, check if there is more to parse */
             siv->lm = siv->unparsed_string[0] ? LM_UNPARSED : LM_END;
         }
-        return;
+        return true;
     case LM_END:
         error_setg(errp, "Fewer list elements expected");
-        return;
+        return false;
     default:
         abort();
     }
 }
 
-static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
+static bool parse_type_size(Visitor *v, const char *name, uint64_t *obj,
                             Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -318,13 +319,14 @@ static void parse_type_size(Visitor *v, const char *name, uint64_t *obj,
 
     assert(siv->lm == LM_NONE);
     if (!parse_option_size(name, siv->string, &val, errp)) {
-        return;
+        return false;
     }
 
     *obj = val;
+    return true;
 }
 
-static void parse_type_bool(Visitor *v, const char *name, bool *obj,
+static bool parse_type_bool(Visitor *v, const char *name, bool *obj,
                             Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -334,29 +336,31 @@ static void parse_type_bool(Visitor *v, const char *name, bool *obj,
         !strcasecmp(siv->string, "yes") ||
         !strcasecmp(siv->string, "true")) {
         *obj = true;
-        return;
+        return true;
     }
     if (!strcasecmp(siv->string, "off") ||
         !strcasecmp(siv->string, "no") ||
         !strcasecmp(siv->string, "false")) {
         *obj = false;
-        return;
+        return true;
     }
 
     error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                "boolean");
+    return false;
 }
 
-static void parse_type_str(Visitor *v, const char *name, char **obj,
+static bool parse_type_str(Visitor *v, const char *name, char **obj,
                            Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
 
     assert(siv->lm == LM_NONE);
     *obj = g_strdup(siv->string);
+    return true;
 }
 
-static void parse_type_number(Visitor *v, const char *name, double *obj,
+static bool parse_type_number(Visitor *v, const char *name, double *obj,
                               Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -366,13 +370,14 @@ static void parse_type_number(Visitor *v, const char *name, double *obj,
     if (qemu_strtod_finite(siv->string, NULL, &val)) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                    "number");
-        return;
+        return false;
     }
 
     *obj = val;
+    return true;
 }
 
-static void parse_type_null(Visitor *v, const char *name, QNull **obj,
+static bool parse_type_null(Visitor *v, const char *name, QNull **obj,
                             Error **errp)
 {
     StringInputVisitor *siv = to_siv(v);
@@ -383,10 +388,11 @@ static void parse_type_null(Visitor *v, const char *name, QNull **obj,
     if (siv->string[0]) {
         error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                    "null");
-        return;
+        return false;
     }
 
     *obj = qnull();
+    return true;
 }
 
 static void string_input_free(Visitor *v)
diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c
index 0d93605d77..b74aa4d44c 100644
--- a/qapi/string-output-visitor.c
+++ b/qapi/string-output-visitor.c
@@ -123,7 +123,7 @@ static void format_string(StringOutputVisitor *sov, Range *r, bool next,
     }
 }
 
-static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
+static bool print_type_int64(Visitor *v, const char *name, int64_t *obj,
                              Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
@@ -138,7 +138,7 @@ static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
         sov->range_start.s = *obj;
         sov->range_end.s = *obj;
         sov->list_mode = LM_IN_PROGRESS;
-        return;
+        return true;
 
     case LM_IN_PROGRESS:
         if (sov->range_end.s + 1 == *obj) {
@@ -155,7 +155,7 @@ static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
             sov->range_start.s = *obj;
             sov->range_end.s = *obj;
         }
-        return;
+        return true;
 
     case LM_END:
         if (sov->range_end.s + 1 == *obj) {
@@ -197,17 +197,19 @@ static void print_type_int64(Visitor *v, const char *name, int64_t *obj,
         }
         g_string_append(sov->string, ")");
     }
+
+    return true;
 }
 
-static void print_type_uint64(Visitor *v, const char *name, uint64_t *obj,
+static bool print_type_uint64(Visitor *v, const char *name, uint64_t *obj,
                              Error **errp)
 {
     /* FIXME: print_type_int64 mishandles values over INT64_MAX */
     int64_t i = *obj;
-    print_type_int64(v, name, &i, errp);
+    return print_type_int64(v, name, &i, errp);
 }
 
-static void print_type_size(Visitor *v, const char *name, uint64_t *obj,
+static bool print_type_size(Visitor *v, const char *name, uint64_t *obj,
                             Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
@@ -217,7 +219,7 @@ static void print_type_size(Visitor *v, const char *name, uint64_t *obj,
     if (!sov->human) {
         out = g_strdup_printf("%"PRIu64, *obj);
         string_output_set(sov, out);
-        return;
+        return true;
     }
 
     val = *obj;
@@ -226,16 +228,18 @@ static void print_type_size(Visitor *v, const char *name, uint64_t *obj,
     string_output_set(sov, out);
 
     g_free(psize);
+    return true;
 }
 
-static void print_type_bool(Visitor *v, const char *name, bool *obj,
+static bool print_type_bool(Visitor *v, const char *name, bool *obj,
                             Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
     string_output_set(sov, g_strdup(*obj ? "true" : "false"));
+    return true;
 }
 
-static void print_type_str(Visitor *v, const char *name, char **obj,
+static bool print_type_str(Visitor *v, const char *name, char **obj,
                            Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
@@ -247,16 +251,18 @@ static void print_type_str(Visitor *v, const char *name, char **obj,
         out = g_strdup(*obj ? *obj : "");
     }
     string_output_set(sov, out);
+    return true;
 }
 
-static void print_type_number(Visitor *v, const char *name, double *obj,
+static bool print_type_number(Visitor *v, const char *name, double *obj,
                               Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
     string_output_set(sov, g_strdup_printf("%f", *obj));
+    return true;
 }
 
-static void print_type_null(Visitor *v, const char *name, QNull **obj,
+static bool print_type_null(Visitor *v, const char *name, QNull **obj,
                             Error **errp)
 {
     StringOutputVisitor *sov = to_sov(v);
@@ -268,9 +274,10 @@ static void print_type_null(Visitor *v, const char *name, QNull **obj,
         out = g_strdup("");
     }
     string_output_set(sov, out);
+    return true;
 }
 
-static void
+static bool
 start_list(Visitor *v, const char *name, GenericList **list, size_t size,
            Error **errp)
 {
@@ -285,6 +292,7 @@ start_list(Visitor *v, const char *name, GenericList **list, size_t size,
     if (*list && (*list)->next) {
         sov->list_mode = LM_STARTED;
     }
+    return true;
 }
 
 static GenericList *next_list(Visitor *v, GenericList *tail, size_t size)
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index d5d7a1031f..ba0cf0b074 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -23,7 +23,7 @@ def gen_visit_decl(name, scalar=False):
     if not scalar:
         c_type += '*'
     return mcgen('''
-void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Error **errp);
+bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Error **errp);
 ''',
                  c_name=c_name(name), c_type=c_type)
 
@@ -31,7 +31,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Error **
 def gen_visit_members_decl(name):
     return mcgen('''
 
-void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
+bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
 ''',
                  c_name=c_name(name))
 
@@ -39,7 +39,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
 def gen_visit_object_members(name, base, members, variants):
     ret = mcgen('''
 
-void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
+bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
 {
     Error *err = NULL;
 
@@ -48,9 +48,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
 
     if base:
         ret += mcgen('''
-    visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, &err);
-    if (err) {
-        goto out;
+    if (!visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, errp)) {
+        return false;
     }
 ''',
                      c_type=base.c_name())
@@ -64,9 +63,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
                          name=memb.name, c_name=c_name(memb.name))
             push_indent()
         ret += mcgen('''
-    visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, &err);
-    if (err) {
-        goto out;
+    if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
+        return false;
     }
 ''',
                      c_type=memb.type.c_name(), name=memb.name,
@@ -112,15 +110,9 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
     }
 ''')
 
-    # 'goto out' produced for base, for each member, and if variants were
-    # present
-    if base or members or variants:
-        ret += mcgen('''
-
-out:
-''')
     ret += mcgen('''
     error_propagate(errp, err);
+    return !err;
 }
 ''')
     return ret
@@ -129,15 +121,14 @@ out:
 def gen_visit_list(name, element_type):
     return mcgen('''
 
-void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
+bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
     Error *err = NULL;
     %(c_name)s *tail;
     size_t size = sizeof(**obj);
 
-    visit_start_list(v, name, (GenericList **)obj, size, &err);
-    if (err) {
-        goto out;
+    if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) {
+        return false;
     }
 
     for (tail = *obj; tail;
@@ -156,8 +147,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-out:
     error_propagate(errp, err);
+    return !err;
 }
 ''',
                  c_name=c_name(name), c_elt_type=element_type.c_name())
@@ -166,11 +157,12 @@ out:
 def gen_visit_enum(name):
     return mcgen('''
 
-void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error **errp)
+bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error **errp)
 {
     int value = *obj;
-    visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
+    bool ok = visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
     *obj = value;
+    return ok;
 }
 ''',
                  c_name=c_name(name))
@@ -179,14 +171,13 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error
 def gen_visit_alternate(name, variants):
     ret = mcgen('''
 
-void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
+bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
     Error *err = NULL;
 
-    visit_start_alternate(v, name, (GenericAlternate **)obj, sizeof(**obj),
-                          &err);
-    if (err) {
-        goto out;
+    if (!visit_start_alternate(v, name, (GenericAlternate **)obj,
+                               sizeof(**obj), errp)) {
+        return false;
     }
     if (!*obj) {
         /* incomplete */
@@ -245,8 +236,8 @@ out_obj:
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-out:
     error_propagate(errp, err);
+    return !err;
 }
 ''',
                  name=name, c_name=c_name(name))
@@ -257,13 +248,12 @@ out:
 def gen_visit_object(name, base, members, variants):
     return mcgen('''
 
-void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
+bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
     Error *err = NULL;
 
-    visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), &err);
-    if (err) {
-        goto out;
+    if (!visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), errp)) {
+        return false;
     }
     if (!*obj) {
         /* incomplete */
@@ -281,8 +271,8 @@ out_obj:
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-out:
     error_propagate(errp, err);
+    return !err;
 }
 ''',
                  c_name=c_name(name))
-- 
2.26.2



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

* [PATCH 23/46] qapi: Smooth error checking with Coccinelle
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (21 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:50   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 24/46] qapi: Smooth error checking manually Markus Armbruster
                   ` (23 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The previous commit enables conversion of

    visit_foo(..., &err);
    if (err) {
	...
    }

to

    if (!visit_foo(..., errp)) {
	...
    }

for visitor functions that now return true / false on success / error.
Coccinelle script:

    @@
    identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Tidy up line breaks and whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 accel/kvm/kvm-all.c              |  5 +--
 accel/tcg/tcg-all.c              |  5 +--
 backends/cryptodev.c             |  5 +--
 backends/hostmem-file.c          |  5 +--
 backends/hostmem-memfd.c         |  5 +--
 backends/hostmem.c               | 10 ++----
 block/blkdebug.c                 |  5 +--
 block/nbd.c                      |  5 +--
 block/sheepdog.c                 |  5 +--
 block/throttle-groups.c          |  8 ++---
 bootdevice.c                     |  3 +-
 hw/block/xen-block.c             |  5 +--
 hw/core/machine.c                |  5 +--
 hw/core/qdev-properties-system.c | 20 +++--------
 hw/core/qdev-properties.c        | 58 +++++++-------------------------
 hw/cpu/core.c                    | 10 ++----
 hw/gpio/aspeed_gpio.c            |  5 +--
 hw/i386/pc.c                     |  5 +--
 hw/ide/qdev.c                    |  3 +-
 hw/intc/apic_common.c            |  5 +--
 hw/mem/nvdimm.c                  |  8 ++---
 hw/misc/aspeed_sdmc.c            |  5 +--
 hw/misc/pca9552.c                |  5 +--
 hw/misc/tmp105.c                 |  5 +--
 hw/misc/tmp421.c                 |  5 +--
 hw/net/ne2000-isa.c              |  3 +-
 hw/ppc/spapr_caps.c              | 15 ++-------
 hw/ppc/spapr_drc.c               | 13 +++----
 hw/s390x/css.c                   |  5 +--
 hw/tpm/tpm_util.c                |  5 +--
 hw/usb/dev-storage.c             |  3 +-
 hw/vfio/pci-quirks.c             |  5 +--
 hw/virtio/virtio-balloon.c       | 17 +++-------
 iothread.c                       |  5 +--
 monitor/hmp-cmds.c               |  3 +-
 net/colo-compare.c               | 10 ++----
 net/dump.c                       |  5 +--
 net/filter-buffer.c              |  5 +--
 qom/object.c                     | 56 ++++++++----------------------
 qom/object_interfaces.c          |  3 +-
 target/arm/cpu64.c               | 15 ++-------
 target/arm/monitor.c             |  4 +--
 target/i386/cpu.c                | 25 +++-----------
 target/ppc/compat.c              |  5 +--
 target/s390x/cpu_models.c        | 14 ++------
 target/sparc/cpu.c               |  5 +--
 46 files changed, 95 insertions(+), 331 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index f24d7da783..be02b8e07a 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -3106,12 +3106,9 @@ static void kvm_set_kvm_shadow_mem(Object *obj, Visitor *v,
                                    Error **errp)
 {
     KVMState *s = KVM_STATE(obj);
-    Error *error = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
index 3b4fda5640..eace2c113b 100644
--- a/accel/tcg/tcg-all.c
+++ b/accel/tcg/tcg-all.c
@@ -182,12 +182,9 @@ static void tcg_set_tb_size(Object *obj, Visitor *v,
                             Error **errp)
 {
     TCGState *s = TCG_STATE(obj);
-    Error *error = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
 
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index 8645f297e3..17ee76a61e 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -154,12 +154,9 @@ cryptodev_backend_set_queues(Object *obj, Visitor *v, const char *name,
                              void *opaque, Error **errp)
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (!value) {
diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
index 098c8e6e64..5b819020b4 100644
--- a/backends/hostmem-file.c
+++ b/backends/hostmem-file.c
@@ -110,7 +110,6 @@ static void file_memory_backend_set_align(Object *o, Visitor *v,
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(o);
     HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
-    Error *local_err = NULL;
     uint64_t val;
 
     if (host_memory_backend_mr_inited(backend)) {
@@ -119,9 +118,7 @@ static void file_memory_backend_set_align(Object *o, Visitor *v,
         return;
     }
 
-    visit_type_size(v, name, &val, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &val, errp)) {
         return;
     }
     fb->align = val;
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 9582c7f8fc..4c040a7541 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -77,7 +77,6 @@ memfd_backend_set_hugetlbsize(Object *obj, Visitor *v, const char *name,
                               void *opaque, Error **errp)
 {
     HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(obj);
-    Error *local_err = NULL;
     uint64_t value;
 
     if (host_memory_backend_mr_inited(MEMORY_BACKEND(obj))) {
@@ -85,9 +84,7 @@ memfd_backend_set_hugetlbsize(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_size(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
     if (!value) {
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 2a0c92d458..c614f1bdc1 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -54,7 +54,6 @@ host_memory_backend_set_size(Object *obj, Visitor *v, const char *name,
                              void *opaque, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    Error *local_err = NULL;
     uint64_t value;
 
     if (host_memory_backend_mr_inited(backend)) {
@@ -63,9 +62,7 @@ host_memory_backend_set_size(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_size(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
     if (!value) {
@@ -253,12 +250,9 @@ static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
     const char *name, void *opaque, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (value <= 0) {
diff --git a/block/blkdebug.c b/block/blkdebug.c
index fa4b4fefdc..9c08d8a005 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -359,7 +359,6 @@ static int blkdebug_parse_perm_list(uint64_t *dest, QDict *options,
     QObject *crumpled_subqdict = NULL;
     Visitor *v = NULL;
     BlockPermissionList *perm_list = NULL, *element;
-    Error *local_err = NULL;
 
     *dest = 0;
 
@@ -375,9 +374,7 @@ static int blkdebug_parse_perm_list(uint64_t *dest, QDict *options,
     }
 
     v = qobject_input_visitor_new(crumpled_subqdict);
-    visit_type_BlockPermissionList(v, NULL, &perm_list, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_BlockPermissionList(v, NULL, &perm_list, errp)) {
         ret = -EINVAL;
         goto out;
     }
diff --git a/block/nbd.c b/block/nbd.c
index 9789c56476..6876da04a7 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -1726,7 +1726,6 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
     SocketAddress *saddr = NULL;
     QDict *addr = NULL;
     Visitor *iv = NULL;
-    Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &addr, "server.");
     if (!qdict_size(addr)) {
@@ -1739,9 +1738,7 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
         goto done;
     }
 
-    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_SocketAddress(iv, NULL, &saddr, errp)) {
         goto done;
     }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 9cb5ae5fc6..a6a91442c9 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -532,7 +532,6 @@ static SocketAddress *sd_server_config(QDict *options, Error **errp)
     QDict *server = NULL;
     Visitor *iv = NULL;
     SocketAddress *saddr = NULL;
-    Error *local_err = NULL;
 
     qdict_extract_subqdict(options, &server, "server.");
 
@@ -541,9 +540,7 @@ static SocketAddress *sd_server_config(QDict *options, Error **errp)
         goto done;
     }
 
-    visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_SocketAddress(iv, NULL, &saddr, errp)) {
         goto done;
     }
 
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 60a2aad75a..dba2bb6451 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -811,7 +811,6 @@ static void throttle_group_set(Object *obj, Visitor *v, const char * name,
     ThrottleGroup *tg = THROTTLE_GROUP(obj);
     ThrottleConfig *cfg;
     ThrottleParamInfo *info = opaque;
-    Error *local_err = NULL;
     int64_t value;
 
     /* If we have finished initialization, don't accept individual property
@@ -823,9 +822,7 @@ static void throttle_group_set(Object *obj, Visitor *v, const char * name,
         return;
     }
 
-    visit_type_int64(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int64(v, name, &value, errp)) {
         return;
     }
     if (value < 0) {
@@ -892,8 +889,7 @@ static void throttle_group_set_limits(Object *obj, Visitor *v,
     ThrottleLimits *argp;
     Error *local_err = NULL;
 
-    visit_type_ThrottleLimits(v, name, &argp, &local_err);
-    if (local_err) {
+    if (!visit_type_ThrottleLimits(v, name, &argp, &local_err)) {
         goto ret;
     }
     qemu_mutex_lock(&tg->lock);
diff --git a/bootdevice.c b/bootdevice.c
index 0ff55e2b79..fb09d3c668 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -297,8 +297,7 @@ static void device_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    visit_type_int32(v, name, &boot_index, &local_err);
-    if (local_err) {
+    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
         goto out;
     }
     /* check whether bootindex is present in fw_boot_order list  */
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 10c44dfda2..6ca6f18c7b 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -403,7 +403,6 @@ static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     XenBlockVdev *vdev = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str, *p;
     const char *end;
 
@@ -412,9 +411,7 @@ static void xen_block_set_vdev(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 1d80ab0e1d..109eb3bb24 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -290,12 +290,9 @@ static void machine_set_phandle_start(Object *obj, Visitor *v,
                                       Error **errp)
 {
     MachineState *ms = MACHINE(obj);
-    Error *error = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 38b0c9f09b..f69e2858d1 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -80,7 +80,6 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
-    Error *local_err = NULL;
     void **ptr = qdev_get_prop_ptr(dev, prop);
     char *str;
     BlockBackend *blk;
@@ -92,9 +91,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -227,7 +224,6 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
                     Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     Property *prop = opaque;
     CharBackend *be = qdev_get_prop_ptr(dev, prop);
     Chardev *s;
@@ -238,9 +234,7 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -307,7 +301,6 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
     NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
     NetClientState **ncs = peers_ptr->ncs;
     NetClientState *peers[MAX_QUEUE_NUM];
-    Error *local_err = NULL;
     int queues, err = 0, i = 0;
     char *str;
 
@@ -316,9 +309,7 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -389,7 +380,6 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
     Property *prop = opaque;
     QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);
     AudioState *state;
-    Error *local_err = NULL;
     int err = 0;
     char *str;
 
@@ -398,9 +388,7 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 71f8aca7c6..fa88a8885c 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -116,7 +116,6 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -124,9 +123,7 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
     bit_prop_set(dev, prop, value);
@@ -180,7 +177,6 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
 {
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -188,9 +184,7 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
     bit64_prop_set(dev, prop, value);
@@ -477,7 +471,6 @@ static void set_string(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     char **ptr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str;
 
     if (dev->realized) {
@@ -485,9 +478,7 @@ static void set_string(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
     g_free(*ptr);
@@ -530,7 +521,6 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     MACAddr *mac = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     int i, pos;
     char *str, *p;
 
@@ -539,9 +529,7 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -673,8 +661,7 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
+    if (!visit_type_str(v, name, &str, &local_err)) {
         error_free(local_err);
         local_err = NULL;
         visit_type_int32(v, name, &value, &local_err);
@@ -748,16 +735,13 @@ static void set_size32(Object *obj, Visitor *v, const char *name, void *opaque,
     Property *prop = opaque;
     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
     uint64_t value;
-    Error *local_err = NULL;
 
     if (dev->realized) {
         qdev_prop_set_after_realize(dev, name, errp);
         return;
     }
 
-    visit_type_size(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
 
@@ -798,16 +782,13 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
     uint64_t value;
-    Error *local_err = NULL;
 
     if (dev->realized) {
         qdev_prop_set_after_realize(dev, name, errp);
         return;
     }
 
-    visit_type_size(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
     /* value of 0 means "unset" */
@@ -875,7 +856,6 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str, *p;
     char *e;
     unsigned long val;
@@ -887,9 +867,7 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -979,7 +957,6 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str;
 
     if (dev->realized) {
@@ -987,9 +964,7 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
@@ -1055,7 +1030,6 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
     void **arrayptr = (void *)dev + prop->arrayoffset;
-    Error *local_err = NULL;
     void *eltptr;
     const char *arrayname;
     int i;
@@ -1069,9 +1043,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
                    name);
         return;
     }
-    visit_type_uint32(v, name, alenptr, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, alenptr, errp)) {
         return;
     }
     if (!*alenptr) {
@@ -1394,16 +1366,13 @@ static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
     int speed;
-    Error *local_err = NULL;
 
     if (dev->realized) {
         qdev_prop_set_after_realize(dev, name, errp);
         return;
     }
 
-    visit_type_enum(v, prop->name, &speed, prop->info->enum_table, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_enum(v, prop->name, &speed, prop->info->enum_table, errp)) {
         return;
     }
 
@@ -1482,16 +1451,13 @@ static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
     int width;
-    Error *local_err = NULL;
 
     if (dev->realized) {
         qdev_prop_set_after_realize(dev, name, errp);
         return;
     }
 
-    visit_type_enum(v, prop->name, &width, prop->info->enum_table, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_enum(v, prop->name, &width, prop->info->enum_table, errp)) {
         return;
     }
 
diff --git a/hw/cpu/core.c b/hw/cpu/core.c
index a92ac597ca..3a659291ea 100644
--- a/hw/cpu/core.c
+++ b/hw/cpu/core.c
@@ -28,12 +28,9 @@ static void core_prop_set_core_id(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
     CPUCore *core = CPU_CORE(obj);
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
@@ -58,12 +55,9 @@ static void core_prop_set_nr_threads(Object *obj, Visitor *v, const char *name,
                                      void *opaque, Error **errp)
 {
     CPUCore *core = CPU_CORE(obj);
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
index dfa9db3d33..985a259e05 100644
--- a/hw/gpio/aspeed_gpio.c
+++ b/hw/gpio/aspeed_gpio.c
@@ -755,16 +755,13 @@ static void aspeed_gpio_get_pin(Object *obj, Visitor *v, const char *name,
 static void aspeed_gpio_set_pin(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    Error *local_err = NULL;
     bool level;
     int pin = 0xfff;
     char group[4];
     AspeedGPIOState *s = ASPEED_GPIO(obj);
     int set_idx, group_idx = 0;
 
-    visit_type_bool(v, name, &level, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &level, errp)) {
         return;
     }
     if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) != 2) {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 70d832536b..50e431346e 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1864,12 +1864,9 @@ static void pc_machine_set_max_ram_below_4g(Object *obj, Visitor *v,
                                             Error **errp)
 {
     PCMachineState *pcms = PC_MACHINE(obj);
-    Error *error = NULL;
     uint64_t value;
 
-    visit_type_size(v, name, &value, &error);
-    if (error) {
-        error_propagate(errp, error);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
     if (value > 4 * GiB) {
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index f68fbee93d..358f10a92e 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -245,8 +245,7 @@ static void ide_dev_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    visit_type_int32(v, name, &boot_index, &local_err);
-    if (local_err) {
+    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
         goto out;
     }
     /* check whether bootindex is present in fw_boot_order list  */
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 7da2862b3d..dc070343c0 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -420,7 +420,6 @@ static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
 {
     APICCommonState *s = APIC_COMMON(obj);
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
     if (dev->realized) {
@@ -428,9 +427,7 @@ static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
 
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 93f7af1c58..e6fdf6ccc3 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -45,7 +45,6 @@ static void nvdimm_set_label_size(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
     NVDIMMDevice *nvdimm = NVDIMM(obj);
-    Error *local_err = NULL;
     uint64_t value;
 
     if (nvdimm->nvdimm_mr) {
@@ -53,9 +52,7 @@ static void nvdimm_set_label_size(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_size(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &value, errp)) {
         return;
     }
     if (value < MIN_NAMESPACE_LABEL_SIZE) {
@@ -88,8 +85,7 @@ static void nvdimm_set_uuid(Object *obj, Visitor *v, const char *name,
     Error *local_err = NULL;
     char *value;
 
-    visit_type_str(v, name, &value, &local_err);
-    if (local_err) {
+    if (!visit_type_str(v, name, &value, &local_err)) {
         goto out;
     }
 
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
index 6fefb05695..0737d8de81 100644
--- a/hw/misc/aspeed_sdmc.c
+++ b/hw/misc/aspeed_sdmc.c
@@ -223,13 +223,10 @@ static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
     int i;
     char *sz;
     int64_t value;
-    Error *local_err = NULL;
     AspeedSDMCState *s = ASPEED_SDMC(obj);
     AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c
index cac729e35a..3e82c2838f 100644
--- a/hw/misc/pca9552.c
+++ b/hw/misc/pca9552.c
@@ -213,14 +213,11 @@ static void pca9552_set_led(Object *obj, Visitor *v, const char *name,
                             void *opaque, Error **errp)
 {
     PCA9552State *s = PCA9552(obj);
-    Error *local_err = NULL;
     int led, rc, reg, val;
     uint8_t state;
     char *state_str;
 
-    visit_type_str(v, name, &state_str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &state_str, errp)) {
         return;
     }
     rc = sscanf(name, "led%2d", &led);
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
index 58dbebca90..b47120492a 100644
--- a/hw/misc/tmp105.c
+++ b/hw/misc/tmp105.c
@@ -72,12 +72,9 @@ static void tmp105_set_temperature(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
     TMP105State *s = TMP105(obj);
-    Error *local_err = NULL;
     int64_t temp;
 
-    visit_type_int(v, name, &temp, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &temp, errp)) {
         return;
     }
     if (temp >= 128000 || temp < -128000) {
diff --git a/hw/misc/tmp421.c b/hw/misc/tmp421.c
index 74864cd93d..49abe2d246 100644
--- a/hw/misc/tmp421.c
+++ b/hw/misc/tmp421.c
@@ -141,15 +141,12 @@ static void tmp421_set_temperature(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
     TMP421State *s = TMP421(obj);
-    Error *local_err = NULL;
     int64_t temp;
     bool ext_range = (s->config[0] & TMP421_CONFIG_RANGE);
     int offset = ext_range * 64 * 256;
     int tempid;
 
-    visit_type_int(v, name, &temp, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &temp, errp)) {
         return;
     }
 
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index fdf8faa0d9..765bcd1f0b 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -113,8 +113,7 @@ static void isa_ne2000_set_bootindex(Object *obj, Visitor *v,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    visit_type_int32(v, name, &boot_index, &local_err);
-    if (local_err) {
+    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
         goto out;
     }
     /* check whether bootindex is present in fw_boot_order list  */
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index efdc0dbbcf..416c85bfb1 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -86,11 +86,8 @@ static void spapr_cap_set_bool(Object *obj, Visitor *v, const char *name,
     SpaprCapabilityInfo *cap = opaque;
     SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     bool value;
-    Error *local_err = NULL;
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
 
@@ -123,13 +120,10 @@ static void spapr_cap_set_string(Object *obj, Visitor *v, const char *name,
 {
     SpaprCapabilityInfo *cap = opaque;
     SpaprMachineState *spapr = SPAPR_MACHINE(obj);
-    Error *local_err = NULL;
     uint8_t i;
     char *val;
 
-    visit_type_str(v, name, &val, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &val, errp)) {
         return;
     }
 
@@ -169,11 +163,8 @@ static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *name,
     SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     uint64_t pagesize;
     uint8_t val;
-    Error *local_err = NULL;
 
-    visit_type_size(v, name, &pagesize, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_size(v, name, &pagesize, errp)) {
         return;
     }
 
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 951bcdf2c0..c8e8ba2ee8 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -327,9 +327,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
         case FDT_BEGIN_NODE:
             fdt_depth++;
             name = fdt_get_name(fdt, fdt_offset, &name_len);
-            visit_start_struct(v, name, NULL, 0, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!visit_start_struct(v, name, NULL, 0, errp)) {
                 return;
             }
             break;
@@ -348,15 +346,12 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
             int i;
             prop = fdt_get_property_by_offset(fdt, fdt_offset, &prop_len);
             name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
-            visit_start_list(v, name, NULL, 0, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!visit_start_list(v, name, NULL, 0, errp)) {
                 return;
             }
             for (i = 0; i < prop_len; i++) {
-                visit_type_uint8(v, NULL, (uint8_t *)&prop->data[i], &err);
-                if (err) {
-                    error_propagate(errp, err);
+                if (!visit_type_uint8(v, NULL, (uint8_t *)&prop->data[i],
+                                      errp)) {
                     return;
                 }
             }
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index d1e365e3e6..519dc91316 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -2377,7 +2377,6 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     CssDevId *dev_id = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
     char *str;
     int num, n1, n2;
     unsigned int cssid, ssid, devid;
@@ -2387,9 +2386,7 @@ static void set_css_devid(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
diff --git a/hw/tpm/tpm_util.c b/hw/tpm/tpm_util.c
index c0a0f3d71f..ca3ea20bdb 100644
--- a/hw/tpm/tpm_util.c
+++ b/hw/tpm/tpm_util.c
@@ -48,7 +48,6 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
                     Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
-    Error *local_err = NULL;
     Property *prop = opaque;
     TPMBackend *s, **be = qdev_get_prop_ptr(dev, prop);
     char *str;
@@ -58,9 +57,7 @@ static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
         return;
     }
 
-    visit_type_str(v, name, &str, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &str, errp)) {
         return;
     }
 
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index f5977eb72e..1c3bd2578c 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -736,8 +736,7 @@ static void usb_msd_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    visit_type_int32(v, name, &boot_index, &local_err);
-    if (local_err) {
+    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
         goto out;
     }
     /* check whether bootindex is present in fw_boot_order list  */
diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
index d304c81148..3a14b7c303 100644
--- a/hw/vfio/pci-quirks.c
+++ b/hw/vfio/pci-quirks.c
@@ -1502,16 +1502,13 @@ static void set_nv_gpudirect_clique_id(Object *obj, Visitor *v,
     DeviceState *dev = DEVICE(obj);
     Property *prop = opaque;
     uint8_t value, *ptr = qdev_get_prop_ptr(dev, prop);
-    Error *local_err = NULL;
 
     if (dev->realized) {
         qdev_prop_set_after_realize(dev, name, errp);
         return;
     }
 
-    visit_type_uint8(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint8(v, name, &value, errp)) {
         return;
     }
 
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 10507b2a43..8eb652a348 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -233,22 +233,18 @@ static void balloon_stats_get_all(Object *obj, Visitor *v, const char *name,
     VirtIOBalloon *s = opaque;
     int i;
 
-    visit_start_struct(v, name, NULL, 0, &err);
-    if (err) {
+    if (!visit_start_struct(v, name, NULL, 0, &err)) {
         goto out;
     }
-    visit_type_int(v, "last-update", &s->stats_last_update, &err);
-    if (err) {
+    if (!visit_type_int(v, "last-update", &s->stats_last_update, &err)) {
         goto out_end;
     }
 
-    visit_start_struct(v, "stats", NULL, 0, &err);
-    if (err) {
+    if (!visit_start_struct(v, "stats", NULL, 0, &err)) {
         goto out_end;
     }
     for (i = 0; i < VIRTIO_BALLOON_S_NR; i++) {
-        visit_type_uint64(v, balloon_stat_names[i], &s->stats[i], &err);
-        if (err) {
+        if (!visit_type_uint64(v, balloon_stat_names[i], &s->stats[i], &err)) {
             goto out_nested;
         }
     }
@@ -278,12 +274,9 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
                                             Error **errp)
 {
     VirtIOBalloon *s = opaque;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
diff --git a/iothread.c b/iothread.c
index b465e5c25b..0598a6d20d 100644
--- a/iothread.c
+++ b/iothread.c
@@ -239,12 +239,9 @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
     IOThread *iothread = IOTHREAD(obj);
     PollParamInfo *info = opaque;
     int64_t *field = (void *)iothread + info->offset;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int64(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int64(v, name, &value, errp)) {
         return;
     }
 
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index d7810cb564..9588c2d81f 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1355,8 +1355,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
         break;
     case MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE:
         p->has_xbzrle_cache_size = true;
-        visit_type_size(v, param, &cache_size, &err);
-        if (err) {
+        if (!visit_type_size(v, param, &cache_size, &err)) {
             break;
         }
         if (cache_size > INT64_MAX || (size_t)cache_size != cache_size) {
diff --git a/net/colo-compare.c b/net/colo-compare.c
index b18b096a6e..398b7546ff 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -1093,12 +1093,9 @@ static void compare_set_timeout(Object *obj, Visitor *v,
                                 Error **errp)
 {
     CompareState *s = COLO_COMPARE(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (!value) {
@@ -1124,12 +1121,9 @@ static void compare_set_expired_scan_cycle(Object *obj, Visitor *v,
                                            Error **errp)
 {
     CompareState *s = COLO_COMPARE(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (!value) {
diff --git a/net/dump.c b/net/dump.c
index e8c4071d59..11a737a4bc 100644
--- a/net/dump.c
+++ b/net/dump.c
@@ -192,12 +192,9 @@ static void filter_dump_set_maxlen(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
     NetFilterDumpState *nfds = FILTER_DUMP(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (value == 0) {
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index c3892911b8..dfa211794b 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -170,12 +170,9 @@ static void filter_buffer_set_interval(Object *obj, Visitor *v,
                                        Error **errp)
 {
     FilterBufferState *s = FILTER_BUFFER(obj);
-    Error *local_err = NULL;
     uint32_t value;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
     if (!value) {
diff --git a/qom/object.c b/qom/object.c
index 6ece96bc2b..780a700542 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2078,11 +2078,8 @@ static void property_set_str(Object *obj, Visitor *v, const char *name,
 {
     StringProperty *prop = opaque;
     char *value;
-    Error *local_err = NULL;
 
-    visit_type_str(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &value, errp)) {
         return;
     }
 
@@ -2159,11 +2156,8 @@ static void property_set_bool(Object *obj, Visitor *v, const char *name,
 {
     BoolProperty *prop = opaque;
     bool value;
-    Error *local_err = NULL;
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
 
@@ -2232,11 +2226,8 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,
 {
     EnumProperty *prop = opaque;
     int value;
-    Error *err = NULL;
 
-    visit_type_enum(v, name, &value, prop->lookup, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_enum(v, name, &value, prop->lookup, errp)) {
         return;
     }
     prop->set(obj, value, errp);
@@ -2305,32 +2296,25 @@ static void property_get_tm(Object *obj, Visitor *v, const char *name,
         goto out;
     }
 
-    visit_start_struct(v, name, NULL, 0, &err);
-    if (err) {
+    if (!visit_start_struct(v, name, NULL, 0, &err)) {
         goto out;
     }
-    visit_type_int32(v, "tm_year", &value.tm_year, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_year", &value.tm_year, &err)) {
         goto out_end;
     }
-    visit_type_int32(v, "tm_mon", &value.tm_mon, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_mon", &value.tm_mon, &err)) {
         goto out_end;
     }
-    visit_type_int32(v, "tm_mday", &value.tm_mday, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_mday", &value.tm_mday, &err)) {
         goto out_end;
     }
-    visit_type_int32(v, "tm_hour", &value.tm_hour, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_hour", &value.tm_hour, &err)) {
         goto out_end;
     }
-    visit_type_int32(v, "tm_min", &value.tm_min, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_min", &value.tm_min, &err)) {
         goto out_end;
     }
-    visit_type_int32(v, "tm_sec", &value.tm_sec, &err);
-    if (err) {
+    if (!visit_type_int32(v, "tm_sec", &value.tm_sec, &err)) {
         goto out_end;
     }
     visit_check_struct(v, &err);
@@ -2392,11 +2376,8 @@ static void property_set_uint8_ptr(Object *obj, Visitor *v, const char *name,
 {
     uint8_t *field = opaque;
     uint8_t value;
-    Error *local_err = NULL;
 
-    visit_type_uint8(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint8(v, name, &value, errp)) {
         return;
     }
 
@@ -2415,11 +2396,8 @@ static void property_set_uint16_ptr(Object *obj, Visitor *v, const char *name,
 {
     uint16_t *field = opaque;
     uint16_t value;
-    Error *local_err = NULL;
 
-    visit_type_uint16(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint16(v, name, &value, errp)) {
         return;
     }
 
@@ -2438,11 +2416,8 @@ static void property_set_uint32_ptr(Object *obj, Visitor *v, const char *name,
 {
     uint32_t *field = opaque;
     uint32_t value;
-    Error *local_err = NULL;
 
-    visit_type_uint32(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint32(v, name, &value, errp)) {
         return;
     }
 
@@ -2461,11 +2436,8 @@ static void property_set_uint64_ptr(Object *obj, Visitor *v, const char *name,
 {
     uint64_t *field = opaque;
     uint64_t value;
-    Error *local_err = NULL;
 
-    visit_type_uint64(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_uint64(v, name, &value, errp)) {
         return;
     }
 
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 7e26f86fa6..3085ae0b31 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -63,8 +63,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
 
     assert(qdict);
     obj = object_new(type);
-    visit_start_struct(v, NULL, NULL, 0, &local_err);
-    if (local_err) {
+    if (!visit_start_struct(v, NULL, NULL, 0, &local_err)) {
         goto out;
     }
     for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 778cecc2e6..fcb3eedabb 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -464,12 +464,9 @@ static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
     ARMCPU *cpu = ARM_CPU(obj);
-    Error *err = NULL;
     uint32_t max_vq;
 
-    visit_type_uint32(v, name, &max_vq, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_uint32(v, name, &max_vq, errp)) {
         return;
     }
 
@@ -510,12 +507,9 @@ static void cpu_arm_set_sve_vq(Object *obj, Visitor *v, const char *name,
 {
     ARMCPU *cpu = ARM_CPU(obj);
     uint32_t vq = atoi(&name[3]) / 128;
-    Error *err = NULL;
     bool value;
 
-    visit_type_bool(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
 
@@ -546,13 +540,10 @@ static void cpu_arm_set_sve(Object *obj, Visitor *v, const char *name,
                             void *opaque, Error **errp)
 {
     ARMCPU *cpu = ARM_CPU(obj);
-    Error *err = NULL;
     bool value;
     uint64_t t;
 
-    visit_type_bool(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
 
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
index ea6598c412..fdab052acd 100644
--- a/target/arm/monitor.c
+++ b/target/arm/monitor.c
@@ -174,11 +174,9 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
         Error *err = NULL;
 
         visitor = qobject_input_visitor_new(model->props);
-        visit_start_struct(visitor, NULL, NULL, 0, &err);
-        if (err) {
+        if (!visit_start_struct(visitor, NULL, NULL, 0, errp)) {
             visit_free(visitor);
             object_unref(obj);
-            error_propagate(errp, err);
             return NULL;
         }
 
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index b1b311baa2..ef5cf587b6 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -4408,12 +4408,9 @@ static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xff + 0xf;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -4451,12 +4448,9 @@ static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xff;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -4489,12 +4483,9 @@ static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
     CPUX86State *env = &cpu->env;
     const int64_t min = 0;
     const int64_t max = 0xf;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -4594,12 +4585,9 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
     X86CPU *cpu = X86_CPU(obj);
     const int64_t min = 0;
     const int64_t max = INT64_MAX;
-    Error *local_err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
     if (value < min || value > max) {
@@ -6799,7 +6787,6 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
     DeviceState *dev = DEVICE(obj);
     X86CPU *cpu = X86_CPU(obj);
     BitProperty *fp = opaque;
-    Error *local_err = NULL;
     bool value;
 
     if (dev->realized) {
@@ -6807,9 +6794,7 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
 
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
index fda0dfe8f8..08aede88dc 100644
--- a/target/ppc/compat.c
+++ b/target/ppc/compat.c
@@ -260,13 +260,10 @@ static void ppc_compat_prop_get(Object *obj, Visitor *v, const char *name,
 static void ppc_compat_prop_set(Object *obj, Visitor *v, const char *name,
                                 void *opaque, Error **errp)
 {
-    Error *local_err = NULL;
     char *value;
     uint32_t compat_pvr;
 
-    visit_type_str(v, name, &value, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!visit_type_str(v, name, &value, errp)) {
         return;
     }
 
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 2fa609bffe..aadd92247f 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -510,9 +510,7 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
 
     if (qdict) {
         visitor = qobject_input_visitor_new(info->props);
-        visit_start_struct(visitor, NULL, NULL, 0, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!visit_start_struct(visitor, NULL, NULL, 0, errp)) {
             visit_free(visitor);
             object_unref(obj);
             return;
@@ -1001,7 +999,6 @@ static void get_feature(Object *obj, Visitor *v, const char *name,
 static void set_feature(Object *obj, Visitor *v, const char *name,
                         void *opaque, Error **errp)
 {
-    Error *err = NULL;
     S390Feat feat = (S390Feat) opaque;
     DeviceState *dev = DEVICE(obj);
     S390CPU *cpu = S390_CPU(obj);
@@ -1017,9 +1014,7 @@ static void set_feature(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
     if (value) {
@@ -1059,7 +1054,6 @@ static void get_feature_group(Object *obj, Visitor *v, const char *name,
 static void set_feature_group(Object *obj, Visitor *v, const char *name,
                               void *opaque, Error **errp)
 {
-    Error *err = NULL;
     S390FeatGroup group = (S390FeatGroup) opaque;
     const S390FeatGroupDef *def = s390_feat_group_def(group);
     DeviceState *dev = DEVICE(obj);
@@ -1076,9 +1070,7 @@ static void set_feature_group(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_bool(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_bool(v, name, &value, errp)) {
         return;
     }
     if (value) {
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index 3f05aba9d6..cf21efd85f 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -801,12 +801,9 @@ static void sparc_set_nwindows(Object *obj, Visitor *v, const char *name,
     const int64_t min = MIN_NWINDOWS;
     const int64_t max = MAX_NWINDOWS;
     SPARCCPU *cpu = SPARC_CPU(obj);
-    Error *err = NULL;
     int64_t value;
 
-    visit_type_int(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_int(v, name, &value, errp)) {
         return;
     }
 
-- 
2.26.2



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

* [PATCH 24/46] qapi: Smooth error checking manually
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (22 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 23/46] qapi: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:53   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 25/46] qapi: Smooth visitor error checking in generated code Markus Armbruster
                   ` (22 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When foo(..., &err) is followed by error_propagate(errp, err), we can
often just as well do foo(..., errp).  The previous commit did that
for simple cases with Coccinelle.  Do it for a few more manually.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 accel/kvm/kvm-all.c       | 50 ++++++++++++++++++---------------------
 block/throttle-groups.c   |  5 ++--
 bootdevice.c              |  4 ++--
 hw/core/qdev-properties.c | 12 +++++-----
 hw/ide/qdev.c             |  4 ++--
 hw/mem/nvdimm.c           |  9 +++----
 hw/net/ne2000-isa.c       |  4 ++--
 hw/usb/dev-storage.c      |  4 ++--
 net/net.c                 |  8 ++-----
 qom/object.c              | 30 +++++++++++------------
 10 files changed, 59 insertions(+), 71 deletions(-)

diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index be02b8e07a..0b921cd24c 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -3119,37 +3119,33 @@ static void kvm_set_kernel_irqchip(Object *obj, Visitor *v,
                                    const char *name, void *opaque,
                                    Error **errp)
 {
-    Error *err = NULL;
     KVMState *s = KVM_STATE(obj);
     OnOffSplit mode;
 
-    visit_type_OnOffSplit(v, name, &mode, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!visit_type_OnOffSplit(v, name, &mode, errp)) {
         return;
-    } else {
-        switch (mode) {
-        case ON_OFF_SPLIT_ON:
-            s->kernel_irqchip_allowed = true;
-            s->kernel_irqchip_required = true;
-            s->kernel_irqchip_split = ON_OFF_AUTO_OFF;
-            break;
-        case ON_OFF_SPLIT_OFF:
-            s->kernel_irqchip_allowed = false;
-            s->kernel_irqchip_required = false;
-            s->kernel_irqchip_split = ON_OFF_AUTO_OFF;
-            break;
-        case ON_OFF_SPLIT_SPLIT:
-            s->kernel_irqchip_allowed = true;
-            s->kernel_irqchip_required = true;
-            s->kernel_irqchip_split = ON_OFF_AUTO_ON;
-            break;
-        default:
-            /* The value was checked in visit_type_OnOffSplit() above. If
-             * we get here, then something is wrong in QEMU.
-             */
-            abort();
-        }
+    }
+    switch (mode) {
+    case ON_OFF_SPLIT_ON:
+        s->kernel_irqchip_allowed = true;
+        s->kernel_irqchip_required = true;
+        s->kernel_irqchip_split = ON_OFF_AUTO_OFF;
+        break;
+    case ON_OFF_SPLIT_OFF:
+        s->kernel_irqchip_allowed = false;
+        s->kernel_irqchip_required = false;
+        s->kernel_irqchip_split = ON_OFF_AUTO_OFF;
+        break;
+    case ON_OFF_SPLIT_SPLIT:
+        s->kernel_irqchip_allowed = true;
+        s->kernel_irqchip_required = true;
+        s->kernel_irqchip_split = ON_OFF_AUTO_ON;
+        break;
+    default:
+        /* The value was checked in visit_type_OnOffSplit() above. If
+         * we get here, then something is wrong in QEMU.
+         */
+        abort();
     }
 }
 
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index dba2bb6451..03a53c89ea 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -889,8 +889,8 @@ static void throttle_group_set_limits(Object *obj, Visitor *v,
     ThrottleLimits *argp;
     Error *local_err = NULL;
 
-    if (!visit_type_ThrottleLimits(v, name, &argp, &local_err)) {
-        goto ret;
+    if (!visit_type_ThrottleLimits(v, name, &argp, errp)) {
+        return;
     }
     qemu_mutex_lock(&tg->lock);
     throttle_get_config(&tg->ts, &cfg);
@@ -902,7 +902,6 @@ static void throttle_group_set_limits(Object *obj, Visitor *v,
 
 unlock:
     qemu_mutex_unlock(&tg->lock);
-ret:
     qapi_free_ThrottleLimits(argp);
     error_propagate(errp, local_err);
     return;
diff --git a/bootdevice.c b/bootdevice.c
index fb09d3c668..769f40c77d 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -297,8 +297,8 @@ static void device_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
-        goto out;
+    if (!visit_type_int32(v, name, &boot_index, errp)) {
+        return;
     }
     /* check whether bootindex is present in fw_boot_order list  */
     check_boot_index(boot_index, &local_err);
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index fa88a8885c..11e7d27ccc 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -664,15 +664,15 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
     if (!visit_type_str(v, name, &str, &local_err)) {
         error_free(local_err);
         local_err = NULL;
-        visit_type_int32(v, name, &value, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
-        } else if (value < -1 || value > 255) {
+        if (!visit_type_int32(v, name, &value, errp)) {
+            return;
+        }
+        if (value < -1 || value > 255) {
             error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
                        name ? name : "null", "pci_devfn");
-        } else {
-            *ptr = value;
+            return;
         }
+        *ptr = value;
         return;
     }
 
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 358f10a92e..ba8b0d7f02 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -245,8 +245,8 @@ static void ide_dev_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
-        goto out;
+    if (!visit_type_int32(v, name, &boot_index, errp)) {
+        return;
     }
     /* check whether bootindex is present in fw_boot_order list  */
     check_boot_index(boot_index, &local_err);
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index e6fdf6ccc3..d0d6e553cf 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -82,21 +82,18 @@ static void nvdimm_set_uuid(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
     NVDIMMDevice *nvdimm = NVDIMM(obj);
-    Error *local_err = NULL;
     char *value;
 
-    if (!visit_type_str(v, name, &value, &local_err)) {
-        goto out;
+    if (!visit_type_str(v, name, &value, errp)) {
+        return;
     }
 
     if (qemu_uuid_parse(value, &nvdimm->uuid) != 0) {
         error_setg(errp, "Property '%s.%s' has invalid value",
                    object_get_typename(obj), name);
     }
-    g_free(value);
 
-out:
-    error_propagate(errp, local_err);
+    g_free(value);
 }
 
 
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 765bcd1f0b..0594abd93a 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -113,8 +113,8 @@ static void isa_ne2000_set_bootindex(Object *obj, Visitor *v,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
-        goto out;
+    if (!visit_type_int32(v, name, &boot_index, errp)) {
+        return;
     }
     /* check whether bootindex is present in fw_boot_order list  */
     check_boot_index(boot_index, &local_err);
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 1c3bd2578c..721665191e 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -736,8 +736,8 @@ static void usb_msd_set_bootindex(Object *obj, Visitor *v, const char *name,
     int32_t boot_index;
     Error *local_err = NULL;
 
-    if (!visit_type_int32(v, name, &boot_index, &local_err)) {
-        goto out;
+    if (!visit_type_int32(v, name, &boot_index, errp)) {
+        return;
     }
     /* check whether bootindex is present in fw_boot_order list  */
     check_boot_index(boot_index, &local_err);
diff --git a/net/net.c b/net/net.c
index d1130296e1..e1f45d3b36 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1052,7 +1052,6 @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
 {
     gchar **substrings = NULL;
     Netdev *object = NULL;
-    Error *err = NULL;
     int ret = -1;
     Visitor *v = opts_visitor_new(opts);
 
@@ -1100,16 +1099,13 @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
         qemu_opts_set_id(opts, g_strdup_printf("__org.qemu.net%i", idx++));
     }
 
-    visit_type_Netdev(v, NULL, &object, &err);
-
-    if (!err) {
-        ret = net_client_init1(object, is_netdev, &err);
+    if (visit_type_Netdev(v, NULL, &object, errp)) {
+        ret = net_client_init1(object, is_netdev, errp);
     }
 
     qapi_free_Netdev(object);
 
 out:
-    error_propagate(errp, err);
     g_strfreev(substrings);
     visit_free(v);
     return ret;
diff --git a/qom/object.c b/qom/object.c
index 780a700542..b8aac074c2 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1766,9 +1766,11 @@ static void object_set_link_property(Object *obj, Visitor *v,
     Object *new_target = NULL;
     char *path = NULL;
 
-    visit_type_str(v, name, &path, &local_err);
+    if (!visit_type_str(v, name, &path, errp)) {
+        return;
+    }
 
-    if (!local_err && strcmp(path, "") != 0) {
+    if (strcmp(path, "") != 0) {
         new_target = object_resolve_link(obj, name, path, &local_err);
     }
 
@@ -2293,36 +2295,34 @@ static void property_get_tm(Object *obj, Visitor *v, const char *name,
 
     prop->get(obj, &value, &err);
     if (err) {
-        goto out;
+        error_propagate(errp, err);
+        return;
     }
 
-    if (!visit_start_struct(v, name, NULL, 0, &err)) {
-        goto out;
+    if (!visit_start_struct(v, name, NULL, 0, errp)) {
+        return;
     }
-    if (!visit_type_int32(v, "tm_year", &value.tm_year, &err)) {
+    if (!visit_type_int32(v, "tm_year", &value.tm_year, errp)) {
         goto out_end;
     }
-    if (!visit_type_int32(v, "tm_mon", &value.tm_mon, &err)) {
+    if (!visit_type_int32(v, "tm_mon", &value.tm_mon, errp)) {
         goto out_end;
     }
-    if (!visit_type_int32(v, "tm_mday", &value.tm_mday, &err)) {
+    if (!visit_type_int32(v, "tm_mday", &value.tm_mday, errp)) {
         goto out_end;
     }
-    if (!visit_type_int32(v, "tm_hour", &value.tm_hour, &err)) {
+    if (!visit_type_int32(v, "tm_hour", &value.tm_hour, errp)) {
         goto out_end;
     }
-    if (!visit_type_int32(v, "tm_min", &value.tm_min, &err)) {
+    if (!visit_type_int32(v, "tm_min", &value.tm_min, errp)) {
         goto out_end;
     }
-    if (!visit_type_int32(v, "tm_sec", &value.tm_sec, &err)) {
+    if (!visit_type_int32(v, "tm_sec", &value.tm_sec, errp)) {
         goto out_end;
     }
-    visit_check_struct(v, &err);
+    visit_check_struct(v, errp);
 out_end:
     visit_end_struct(v, NULL);
-out:
-    error_propagate(errp, err);
-
 }
 
 static void property_release_tm(Object *obj, const char *name,
-- 
2.26.2



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

* [PATCH 25/46] qapi: Smooth visitor error checking in generated code
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (23 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 24/46] qapi: Smooth error checking manually Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 20:58   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 26/46] qapi: Smooth another visitor error checking pattern Markus Armbruster
                   ` (21 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Use visitor functions' return values to check for failure.  Eliminate
error_propagate() that are now unnecessary.  Delete @err that are now
unused.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 docs/devel/qapi-code-gen.txt | 60 ++++++++++++++----------------------
 scripts/qapi/commands.py     | 22 ++++++-------
 scripts/qapi/visit.py        | 57 ++++++++++++++--------------------
 3 files changed, 55 insertions(+), 84 deletions(-)

diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
index 9bfc57063c..69eede6c28 100644
--- a/docs/devel/qapi-code-gen.txt
+++ b/docs/devel/qapi-code-gen.txt
@@ -1420,8 +1420,6 @@ Example:
 
     bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
     {
-        Error *err = NULL;
-
         if (!visit_type_int(v, "integer", &obj->integer, errp)) {
             return false;
         }
@@ -1430,13 +1428,12 @@ Example:
                 return false;
             }
         }
-        error_propagate(errp, err);
-        return !err;
+        return true;
     }
 
     bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
     {
-        Error *err = NULL;
+        bool ok = false;
 
         if (!visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), errp)) {
             return false;
@@ -1446,24 +1443,22 @@ Example:
             assert(visit_is_dealloc(v));
             goto out_obj;
         }
-        visit_type_UserDefOne_members(v, *obj, &err);
-        if (err) {
+        if (!visit_type_UserDefOne_members(v, *obj, errp)) {
             goto out_obj;
         }
-        visit_check_struct(v, &err);
+        ok = visit_check_struct(v, errp);
     out_obj:
         visit_end_struct(v, (void **)obj);
-        if (err && visit_is_input(v)) {
+        if (!ok && visit_is_input(v)) {
             qapi_free_UserDefOne(*obj);
             *obj = NULL;
         }
-        error_propagate(errp, err);
-        return !err;
+        return ok;
     }
 
     bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
     {
-        Error *err = NULL;
+        bool ok = false;
         UserDefOneList *tail;
         size_t size = sizeof(**obj);
 
@@ -1473,33 +1468,27 @@ Example:
 
         for (tail = *obj; tail;
              tail = (UserDefOneList *)visit_next_list(v, (GenericList *)tail, size)) {
-            visit_type_UserDefOne(v, NULL, &tail->value, &err);
-            if (err) {
-                break;
+            if (!visit_type_UserDefOne(v, NULL, &tail->value, errp)) {
+                goto out_obj;
             }
         }
 
-        if (!err) {
-            visit_check_list(v, &err);
-        }
+        ok = visit_check_list(v, errp);
+    out_obj:
         visit_end_list(v, (void **)obj);
-        if (err && visit_is_input(v)) {
+        if (!ok && visit_is_input(v)) {
             qapi_free_UserDefOneList(*obj);
             *obj = NULL;
         }
-        error_propagate(errp, err);
-        return !err;
+        return ok;
     }
 
     bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
     {
-        Error *err = NULL;
-
         if (!visit_type_UserDefOneList(v, "arg1", &obj->arg1, errp)) {
             return false;
         }
-        error_propagate(errp, err);
-        return !err;
+        return true;
     }
 
 [Uninteresting stuff omitted...]
@@ -1554,15 +1543,12 @@ Example:
 
     static void qmp_marshal_output_UserDefOne(UserDefOne *ret_in, QObject **ret_out, Error **errp)
     {
-        Error *err = NULL;
         Visitor *v;
 
         v = qobject_output_visitor_new(ret_out);
-        visit_type_UserDefOne(v, "unused", &ret_in, &err);
-        if (!err) {
+        if (visit_type_UserDefOne(v, "unused", &ret_in, errp)) {
             visit_complete(v, ret_out);
         }
-        error_propagate(errp, err);
         visit_free(v);
         v = qapi_dealloc_visitor_new();
         visit_type_UserDefOne(v, "unused", &ret_in, NULL);
@@ -1572,33 +1558,32 @@ Example:
     void qmp_marshal_my_command(QDict *args, QObject **ret, Error **errp)
     {
         Error *err = NULL;
+        bool ok = false;
         Visitor *v;
         UserDefOne *retval;
         q_obj_my_command_arg arg = {0};
 
         v = qobject_input_visitor_new(QOBJECT(args));
-        visit_start_struct(v, NULL, NULL, 0, &err);
-        if (err) {
+        if (!visit_start_struct(v, NULL, NULL, 0, errp)) {
             goto out;
         }
-        visit_type_q_obj_my_command_arg_members(v, &arg, &err);
-        if (!err) {
-            visit_check_struct(v, &err);
+        if (visit_type_q_obj_my_command_arg_members(v, &arg, errp)) {
+            ok = visit_check_struct(v, errp);
         }
         visit_end_struct(v, NULL);
-        if (err) {
+        if (!ok) {
             goto out;
         }
 
         retval = qmp_my_command(arg.arg1, &err);
+        error_propagate(errp, err);
         if (err) {
             goto out;
         }
 
-        qmp_marshal_output_UserDefOne(retval, ret, &err);
+        qmp_marshal_output_UserDefOne(retval, ret, errp);
 
     out:
-        error_propagate(errp, err);
         visit_free(v);
         v = qapi_dealloc_visitor_new();
         visit_start_struct(v, NULL, NULL, 0, NULL);
@@ -1606,6 +1591,7 @@ Example:
         visit_end_struct(v, NULL);
         visit_free(v);
     }
+
 [Uninteresting stuff omitted...]
     $ cat qapi-generated/example-qapi-init-commands.h
 [Uninteresting stuff omitted...]
diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py
index 6809b0fb6e..3cf9e1110b 100644
--- a/scripts/qapi/commands.py
+++ b/scripts/qapi/commands.py
@@ -47,6 +47,7 @@ def gen_call(name, arg_type, boxed, ret_type):
     ret = mcgen('''
 
     %(lhs)sqmp_%(c_name)s(%(args)s&err);
+    error_propagate(errp, err);
 ''',
                 c_name=c_name(name), args=argstr, lhs=lhs)
     if ret_type:
@@ -55,7 +56,7 @@ def gen_call(name, arg_type, boxed, ret_type):
         goto out;
     }
 
-    qmp_marshal_output_%(c_name)s(retval, ret, &err);
+    qmp_marshal_output_%(c_name)s(retval, ret, errp);
 ''',
                      c_name=ret_type.c_name())
     return ret
@@ -66,15 +67,12 @@ def gen_marshal_output(ret_type):
 
 static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out, Error **errp)
 {
-    Error *err = NULL;
     Visitor *v;
 
     v = qobject_output_visitor_new(ret_out);
-    visit_type_%(c_name)s(v, "unused", &ret_in, &err);
-    if (!err) {
+    if (visit_type_%(c_name)s(v, "unused", &ret_in, errp)) {
         visit_complete(v, ret_out);
     }
-    error_propagate(errp, err);
     visit_free(v);
     v = qapi_dealloc_visitor_new();
     visit_type_%(c_name)s(v, "unused", &ret_in, NULL);
@@ -104,6 +102,7 @@ def gen_marshal(name, arg_type, boxed, ret_type):
 %(proto)s
 {
     Error *err = NULL;
+    bool ok = false;
     Visitor *v;
 ''',
                 proto=build_marshal_proto(name))
@@ -123,28 +122,26 @@ def gen_marshal(name, arg_type, boxed, ret_type):
     ret += mcgen('''
 
     v = qobject_input_visitor_new(QOBJECT(args));
-    visit_start_struct(v, NULL, NULL, 0, &err);
-    if (err) {
+    if (!visit_start_struct(v, NULL, NULL, 0, errp)) {
         goto out;
     }
 ''')
 
     if have_args:
         ret += mcgen('''
-    visit_type_%(c_arg_type)s_members(v, &arg, &err);
-    if (!err) {
-        visit_check_struct(v, &err);
+    if (visit_type_%(c_arg_type)s_members(v, &arg, errp)) {
+        ok = visit_check_struct(v, errp);
     }
 ''',
                      c_arg_type=arg_type.c_name())
     else:
         ret += mcgen('''
-    visit_check_struct(v, &err);
+    ok = visit_check_struct(v, errp);
 ''')
 
     ret += mcgen('''
     visit_end_struct(v, NULL);
-    if (err) {
+    if (!ok) {
         goto out;
     }
 ''')
@@ -154,7 +151,6 @@ def gen_marshal(name, arg_type, boxed, ret_type):
     ret += mcgen('''
 
 out:
-    error_propagate(errp, err);
     visit_free(v);
 ''')
 
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index ba0cf0b074..3fb2f30510 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -41,8 +41,6 @@ def gen_visit_object_members(name, base, members, variants):
 
 bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
 {
-    Error *err = NULL;
-
 ''',
                 c_name=c_name(name))
 
@@ -97,8 +95,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
             else:
                 ret += mcgen('''
     case %(case)s:
-        visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, &err);
-        break;
+        return visit_type_%(c_type)s_members(v, &obj->u.%(c_name)s, errp);
 ''',
                              case=case_str,
                              c_type=var.type.c_name(), c_name=c_name(var.name))
@@ -111,8 +108,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
 ''')
 
     ret += mcgen('''
-    error_propagate(errp, err);
-    return !err;
+    return true;
 }
 ''')
     return ret
@@ -123,7 +119,7 @@ def gen_visit_list(name, element_type):
 
 bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
-    Error *err = NULL;
+    bool ok = false;
     %(c_name)s *tail;
     size_t size = sizeof(**obj);
 
@@ -133,22 +129,19 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
 
     for (tail = *obj; tail;
          tail = (%(c_name)s *)visit_next_list(v, (GenericList *)tail, size)) {
-        visit_type_%(c_elt_type)s(v, NULL, &tail->value, &err);
-        if (err) {
-            break;
+        if (!visit_type_%(c_elt_type)s(v, NULL, &tail->value, errp)) {
+            goto out_obj;
         }
     }
 
-    if (!err) {
-        visit_check_list(v, &err);
-    }
+    ok = visit_check_list(v, errp);
+out_obj:
     visit_end_list(v, (void **)obj);
-    if (err && visit_is_input(v)) {
+    if (!ok && visit_is_input(v)) {
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 ''',
                  c_name=c_name(name), c_elt_type=element_type.c_name())
@@ -173,7 +166,7 @@ def gen_visit_alternate(name, variants):
 
 bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
-    Error *err = NULL;
+    bool ok = false;
 
     if (!visit_start_alternate(v, name, (GenericAlternate **)obj,
                                sizeof(**obj), errp)) {
@@ -182,6 +175,7 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
     if (!*obj) {
         /* incomplete */
         assert(visit_is_dealloc(v));
+        ok = true;
         goto out_obj;
     }
     switch ((*obj)->type) {
@@ -196,13 +190,11 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
                      case=var.type.alternate_qtype())
         if isinstance(var.type, QAPISchemaObjectType):
             ret += mcgen('''
-        visit_start_struct(v, name, NULL, 0, &err);
-        if (err) {
+        if (!visit_start_struct(v, name, NULL, 0, errp)) {
             break;
         }
-        visit_type_%(c_type)s_members(v, &(*obj)->u.%(c_name)s, &err);
-        if (!err) {
-            visit_check_struct(v, &err);
+        if (visit_type_%(c_type)s_members(v, &(*obj)->u.%(c_name)s, errp)) {
+            ok = visit_check_struct(v, errp);
         }
         visit_end_struct(v, NULL);
 ''',
@@ -210,7 +202,7 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
                          c_name=c_name(var.name))
         else:
             ret += mcgen('''
-        visit_type_%(c_type)s(v, name, &(*obj)->u.%(c_name)s, &err);
+        ok = visit_type_%(c_type)s(v, name, &(*obj)->u.%(c_name)s, errp);
 ''',
                          c_type=var.type.c_name(),
                          c_name=c_name(var.name))
@@ -224,7 +216,7 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
         abort();
     default:
         assert(visit_is_input(v));
-        error_setg(&err, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
+        error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                    "%(name)s");
         /* Avoid passing invalid *obj to qapi_free_%(c_name)s() */
         g_free(*obj);
@@ -232,12 +224,11 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
     }
 out_obj:
     visit_end_alternate(v, (void **)obj);
-    if (err && visit_is_input(v)) {
+    if (!ok && visit_is_input(v)) {
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 ''',
                  name=name, c_name=c_name(name))
@@ -250,7 +241,7 @@ def gen_visit_object(name, base, members, variants):
 
 bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
 {
-    Error *err = NULL;
+    bool ok = false;
 
     if (!visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), errp)) {
         return false;
@@ -260,19 +251,17 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
         assert(visit_is_dealloc(v));
         goto out_obj;
     }
-    visit_type_%(c_name)s_members(v, *obj, &err);
-    if (err) {
+    if (!visit_type_%(c_name)s_members(v, *obj, errp)) {
         goto out_obj;
     }
-    visit_check_struct(v, &err);
+    ok = visit_check_struct(v, errp);
 out_obj:
     visit_end_struct(v, (void **)obj);
-    if (err && visit_is_input(v)) {
+    if (!ok && visit_is_input(v)) {
         qapi_free_%(c_name)s(*obj);
         *obj = NULL;
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 ''',
                  c_name=c_name(name))
-- 
2.26.2



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

* [PATCH 26/46] qapi: Smooth another visitor error checking pattern
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (24 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 25/46] qapi: Smooth visitor error checking in generated code Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:02   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 27/46] qapi: Purge error_propagate() from QAPI core Markus Armbruster
                   ` (20 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Convert

    visit_type_FOO(v, ..., &ptr, &err);
    ...
    if (err) {
	...
    }

to

    visit_type_FOO(v, ..., &ptr, errp);
    ...
    if (!ptr) {
	...
    }

for functions that set @ptr to non-null / null on success / error.

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/nfs.c          |  7 ++-----
 block/parallels.c    |  7 ++-----
 block/qcow.c         |  7 ++-----
 block/qcow2.c        |  7 ++-----
 block/qed.c          |  7 ++-----
 block/rbd.c          |  7 ++-----
 block/sheepdog.c     |  6 ++----
 block/ssh.c          |  7 ++-----
 block/vdi.c          |  7 ++-----
 block/vhdx.c         |  7 ++-----
 block/vpc.c          |  7 ++-----
 hw/acpi/core.c       |  4 ++--
 hw/block/xen-block.c |  6 ++----
 hw/core/numa.c       |  7 +++----
 monitor/monitor.c    | 21 +++++++--------------
 15 files changed, 36 insertions(+), 78 deletions(-)

diff --git a/block/nfs.c b/block/nfs.c
index b1718d125a..61a249a9fc 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -563,18 +563,15 @@ static BlockdevOptionsNfs *nfs_options_qdict_to_qapi(QDict *options,
     BlockdevOptionsNfs *opts = NULL;
     Visitor *v;
     const QDictEntry *e;
-    Error *local_err = NULL;
 
     v = qobject_input_visitor_new_flat_confused(options, errp);
     if (!v) {
         return NULL;
     }
 
-    visit_type_BlockdevOptionsNfs(v, NULL, &opts, &local_err);
+    visit_type_BlockdevOptionsNfs(v, NULL, &opts, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!opts) {
         return NULL;
     }
 
diff --git a/block/parallels.c b/block/parallels.c
index 0397f3894f..9e85ab995e 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -625,7 +625,6 @@ static int coroutine_fn parallels_co_create_opts(BlockDriver *drv,
                                                  Error **errp)
 {
     BlockdevCreateOptions *create_options = NULL;
-    Error *local_err = NULL;
     BlockDriverState *bs = NULL;
     QDict *qdict;
     Visitor *v;
@@ -668,11 +667,9 @@ static int coroutine_fn parallels_co_create_opts(BlockDriver *drv,
         goto done;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto done;
     }
diff --git a/block/qcow.c b/block/qcow.c
index eefa3b63da..1e134f3445 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -941,7 +941,6 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver *drv,
     QDict *qdict;
     Visitor *v;
     const char *val;
-    Error *local_err = NULL;
     int ret;
 
     static const QDictRenames opt_renames[] = {
@@ -993,11 +992,9 @@ static int coroutine_fn qcow_co_create_opts(BlockDriver *drv,
         goto fail;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/qcow2.c b/block/qcow2.c
index a9137a535b..9ed2396c88 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -3683,7 +3683,6 @@ static int coroutine_fn qcow2_co_create_opts(BlockDriver *drv,
     Visitor *v;
     BlockDriverState *bs = NULL;
     BlockDriverState *data_bs = NULL;
-    Error *local_err = NULL;
     const char *val;
     int ret;
 
@@ -3779,11 +3778,9 @@ static int coroutine_fn qcow2_co_create_opts(BlockDriver *drv,
         goto finish;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto finish;
     }
diff --git a/block/qed.c b/block/qed.c
index e369fd360a..7fa7f880f6 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -729,7 +729,6 @@ static int coroutine_fn bdrv_qed_co_create_opts(BlockDriver *drv,
     QDict *qdict;
     Visitor *v;
     BlockDriverState *bs = NULL;
-    Error *local_err = NULL;
     int ret;
 
     static const QDictRenames opt_renames[] = {
@@ -771,11 +770,9 @@ static int coroutine_fn bdrv_qed_co_create_opts(BlockDriver *drv,
         goto fail;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/rbd.c b/block/rbd.c
index 617553b022..688074c64b 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -681,7 +681,6 @@ static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts,
                                     Error **errp)
 {
     Visitor *v;
-    Error *local_err = NULL;
 
     /* Convert the remaining options into a QAPI object */
     v = qobject_input_visitor_new_flat_confused(options, errp);
@@ -689,11 +688,9 @@ static int qemu_rbd_convert_options(QDict *options, BlockdevOptionsRbd **opts,
         return -EINVAL;
     }
 
-    visit_type_BlockdevOptionsRbd(v, NULL, opts, &local_err);
+    visit_type_BlockdevOptionsRbd(v, NULL, opts, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!opts) {
         return -EINVAL;
     }
 
diff --git a/block/sheepdog.c b/block/sheepdog.c
index a6a91442c9..6c487c8322 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2193,11 +2193,9 @@ static int coroutine_fn sd_co_create_opts(BlockDriver *drv,
         goto fail;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/ssh.c b/block/ssh.c
index f00b89684a..ebe3d8b631 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -616,7 +616,6 @@ static BlockdevOptionsSsh *ssh_parse_options(QDict *options, Error **errp)
 {
     BlockdevOptionsSsh *result = NULL;
     QemuOpts *opts = NULL;
-    Error *local_err = NULL;
     const QDictEntry *e;
     Visitor *v;
 
@@ -636,11 +635,9 @@ static BlockdevOptionsSsh *ssh_parse_options(QDict *options, Error **errp)
         goto fail;
     }
 
-    visit_type_BlockdevOptionsSsh(v, NULL, &result, &local_err);
+    visit_type_BlockdevOptionsSsh(v, NULL, &result, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!result) {
         goto fail;
     }
 
diff --git a/block/vdi.c b/block/vdi.c
index 5fca67f52d..3a3df45f84 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -905,7 +905,6 @@ static int coroutine_fn vdi_co_create_opts(BlockDriver *drv,
     uint64_t block_size = DEFAULT_CLUSTER_SIZE;
     bool is_static = false;
     Visitor *v;
-    Error *local_err = NULL;
     int ret;
 
     /* Parse options and convert legacy syntax.
@@ -956,11 +955,9 @@ static int coroutine_fn vdi_co_create_opts(BlockDriver *drv,
         ret = -EINVAL;
         goto done;
     }
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto done;
     }
diff --git a/block/vhdx.c b/block/vhdx.c
index b9ef4ff074..1f9fca837d 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -2066,7 +2066,6 @@ static int coroutine_fn vhdx_co_create_opts(BlockDriver *drv,
     QDict *qdict;
     Visitor *v;
     BlockDriverState *bs = NULL;
-    Error *local_err = NULL;
     int ret;
 
     static const QDictRenames opt_renames[] = {
@@ -2107,11 +2106,9 @@ static int coroutine_fn vhdx_co_create_opts(BlockDriver *drv,
         goto fail;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/block/vpc.c b/block/vpc.c
index 6d8a43aed9..259d0ad2fe 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -1095,7 +1095,6 @@ static int coroutine_fn vpc_co_create_opts(BlockDriver *drv,
     QDict *qdict;
     Visitor *v;
     BlockDriverState *bs = NULL;
-    Error *local_err = NULL;
     int ret;
 
     static const QDictRenames opt_renames[] = {
@@ -1134,11 +1133,9 @@ static int coroutine_fn vpc_co_create_opts(BlockDriver *drv,
         goto fail;
     }
 
-    visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
+    visit_type_BlockdevCreateOptions(v, NULL, &create_options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!create_options) {
         ret = -EINVAL;
         goto fail;
     }
diff --git a/hw/acpi/core.c b/hw/acpi/core.c
index 45cbed49ab..91ae66b806 100644
--- a/hw/acpi/core.c
+++ b/hw/acpi/core.c
@@ -249,11 +249,11 @@ void acpi_table_add(const QemuOpts *opts, Error **errp)
         Visitor *v;
 
         v = opts_visitor_new(opts);
-        visit_type_AcpiTableOptions(v, NULL, &hdrs, &err);
+        visit_type_AcpiTableOptions(v, NULL, &hdrs, errp);
         visit_free(v);
     }
 
-    if (err) {
+    if (!hdrs) {
         goto out;
     }
     if (hdrs->has_file == hdrs->has_data) {
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 6ca6f18c7b..d45758937a 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -682,11 +682,9 @@ static char *xen_block_blockdev_add(const char *id, QDict *qdict,
     trace_xen_block_blockdev_add(node_name);
 
     v = qobject_input_visitor_new(QOBJECT(qdict));
-    visit_type_BlockdevOptions(v, NULL, &options, &local_err);
+    visit_type_BlockdevOptions(v, NULL, &options, errp);
     visit_free(v);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!options) {
         goto fail;
     }
 
diff --git a/hw/core/numa.c b/hw/core/numa.c
index aa8c6be210..118803a0e8 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -509,10 +509,10 @@ static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
     Error *err = NULL;
     Visitor *v = opts_visitor_new(opts);
 
-    visit_type_NumaOptions(v, NULL, &object, &err);
+    visit_type_NumaOptions(v, NULL, &object, errp);
     visit_free(v);
-    if (err) {
-        goto end;
+    if (!object) {
+        return -1;
     }
 
     /* Fix up legacy suffix-less format */
@@ -523,7 +523,6 @@ static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
 
     set_numa_options(ms, object, &err);
 
-end:
     qapi_free_NumaOptions(object);
     if (err) {
         error_propagate(errp, err);
diff --git a/monitor/monitor.c b/monitor/monitor.c
index 125494410a..47167ac2a3 100644
--- a/monitor/monitor.c
+++ b/monitor/monitor.c
@@ -656,25 +656,18 @@ int monitor_init_opts(QemuOpts *opts, Error **errp)
 {
     Visitor *v;
     MonitorOptions *options;
-    Error *local_err = NULL;
+    int ret;
 
     v = opts_visitor_new(opts);
-    visit_type_MonitorOptions(v, NULL, &options, &local_err);
+    visit_type_MonitorOptions(v, NULL, &options, errp);
     visit_free(v);
-
-    if (local_err) {
-        goto out;
-    }
-
-    monitor_init(options, true, &local_err);
-    qapi_free_MonitorOptions(options);
-
-out:
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!options) {
         return -1;
     }
-    return 0;
+
+    ret = monitor_init(options, true, errp);
+    qapi_free_MonitorOptions(options);
+    return ret;
 }
 
 QemuOptsList qemu_mon_opts = {
-- 
2.26.2



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

* [PATCH 27/46] qapi: Purge error_propagate() from QAPI core
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (25 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 26/46] qapi: Smooth another visitor error checking pattern Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:03   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit Markus Armbruster
                   ` (19 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qapi/qapi-visit-core.c | 40 +++++++++++++++++++---------------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index 5a9c47aabf..7e5f40e7f0 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -39,19 +39,18 @@ void visit_free(Visitor *v)
 bool visit_start_struct(Visitor *v, const char *name, void **obj,
                         size_t size, Error **errp)
 {
-    Error *err = NULL;
+    bool ok;
 
     trace_visit_start_struct(v, name, obj, size);
     if (obj) {
         assert(size);
         assert(!(v->type & VISITOR_OUTPUT) || *obj);
     }
-    v->start_struct(v, name, obj, size, &err);
+    ok = v->start_struct(v, name, obj, size, errp);
     if (obj && (v->type & VISITOR_INPUT)) {
-        assert(!err != !*obj);
+        assert(ok != !*obj);
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 
 bool visit_check_struct(Visitor *v, Error **errp)
@@ -69,16 +68,15 @@ void visit_end_struct(Visitor *v, void **obj)
 bool visit_start_list(Visitor *v, const char *name, GenericList **list,
                       size_t size, Error **errp)
 {
-    Error *err = NULL;
+    bool ok;
 
     assert(!list || size >= sizeof(GenericList));
     trace_visit_start_list(v, name, list, size);
-    v->start_list(v, name, list, size, &err);
+    ok = v->start_list(v, name, list, size, errp);
     if (list && (v->type & VISITOR_INPUT)) {
-        assert(!(err && *list));
+        assert(ok || !*list);
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 
 GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size)
@@ -104,19 +102,20 @@ bool visit_start_alternate(Visitor *v, const char *name,
                            GenericAlternate **obj, size_t size,
                            Error **errp)
 {
-    Error *err = NULL;
+    bool ok;
 
     assert(obj && size >= sizeof(GenericAlternate));
     assert(!(v->type & VISITOR_OUTPUT) || *obj);
     trace_visit_start_alternate(v, name, obj, size);
-    if (v->start_alternate) {
-        v->start_alternate(v, name, obj, size, &err);
+    if (!v->start_alternate) {
+        assert(!(v->type & VISITOR_INPUT));
+        return true;
     }
+    ok = v->start_alternate(v, name, obj, size, errp);
     if (v->type & VISITOR_INPUT) {
-        assert(v->start_alternate && !err != !*obj);
+        assert(ok != !*obj);
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 
 void visit_end_alternate(Visitor *v, void **obj)
@@ -309,7 +308,7 @@ bool visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp)
 
 bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
 {
-    Error *err = NULL;
+    bool ok;
 
     assert(obj);
     /* TODO: Fix callers to not pass NULL when they mean "", so that we
@@ -317,12 +316,11 @@ bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp)
     assert(!(v->type & VISITOR_OUTPUT) || *obj);
      */
     trace_visit_type_str(v, name, obj);
-    v->type_str(v, name, obj, &err);
+    ok = v->type_str(v, name, obj, errp);
     if (v->type & VISITOR_INPUT) {
-        assert(!err != !*obj);
+        assert(ok != !*obj);
     }
-    error_propagate(errp, err);
-    return !err;
+    return ok;
 }
 
 bool visit_type_number(Visitor *v, const char *name, double *obj,
-- 
2.26.2



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

* [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (26 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 27/46] qapi: Purge error_propagate() from QAPI core Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:03   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
                   ` (18 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 block/parallels.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 9e85ab995e..3c22dfdc9d 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -839,6 +839,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
                                        &local_err);
     g_free(buf);
     if (local_err != NULL) {
+        error_propagate(errp, local_err);
         goto fail_options;
     }
 
@@ -868,15 +869,11 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
 
 fail_format:
     error_setg(errp, "Image not in Parallels format");
+fail_options:
     ret = -EINVAL;
 fail:
     qemu_vfree(s->header);
     return ret;
-
-fail_options:
-    error_propagate(errp, local_err);
-    ret = -EINVAL;
-    goto fail;
 }
 
 
-- 
2.26.2



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

* [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (27 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:04   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter Markus Armbruster
                   ` (17 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The commit before previous enables another round of the transformation
from recent commit "error: Avoid unnecessary error_propagate() after
error_setg()".

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/acpi/core.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/hw/acpi/core.c b/hw/acpi/core.c
index 91ae66b806..f6d9ec4f13 100644
--- a/hw/acpi/core.c
+++ b/hw/acpi/core.c
@@ -239,7 +239,6 @@ static void acpi_table_install(const char unsigned *blob, size_t bloblen,
 void acpi_table_add(const QemuOpts *opts, Error **errp)
 {
     AcpiTableOptions *hdrs = NULL;
-    Error *err = NULL;
     char **pathnames = NULL;
     char **cur;
     size_t bloblen = 0;
@@ -257,13 +256,13 @@ void acpi_table_add(const QemuOpts *opts, Error **errp)
         goto out;
     }
     if (hdrs->has_file == hdrs->has_data) {
-        error_setg(&err, "'-acpitable' requires one of 'data' or 'file'");
+        error_setg(errp, "'-acpitable' requires one of 'data' or 'file'");
         goto out;
     }
 
     pathnames = g_strsplit(hdrs->has_file ? hdrs->file : hdrs->data, ":", 0);
     if (pathnames == NULL || pathnames[0] == NULL) {
-        error_setg(&err, "'-acpitable' requires at least one pathname");
+        error_setg(errp, "'-acpitable' requires at least one pathname");
         goto out;
     }
 
@@ -272,7 +271,7 @@ void acpi_table_add(const QemuOpts *opts, Error **errp)
         int fd = open(*cur, O_RDONLY | O_BINARY);
 
         if (fd < 0) {
-            error_setg(&err, "can't open file %s: %s", *cur, strerror(errno));
+            error_setg(errp, "can't open file %s: %s", *cur, strerror(errno));
             goto out;
         }
 
@@ -288,8 +287,8 @@ void acpi_table_add(const QemuOpts *opts, Error **errp)
                 memcpy(blob + bloblen, data, r);
                 bloblen += r;
             } else if (errno != EINTR) {
-                error_setg(&err, "can't read file %s: %s",
-                           *cur, strerror(errno));
+                error_setg(errp, "can't read file %s: %s", *cur,
+                           strerror(errno));
                 close(fd);
                 goto out;
             }
@@ -298,14 +297,12 @@ void acpi_table_add(const QemuOpts *opts, Error **errp)
         close(fd);
     }
 
-    acpi_table_install(blob, bloblen, hdrs->has_file, hdrs, &err);
+    acpi_table_install(blob, bloblen, hdrs->has_file, hdrs, errp);
 
 out:
     g_free(blob);
     g_strfreev(pathnames);
     qapi_free_AcpiTableOptions(hdrs);
-
-    error_propagate(errp, err);
 }
 
 unsigned acpi_table_len(void *current)
-- 
2.26.2



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

* [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (28 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 19:31   ` Matthew Rosato
  2020-06-25  7:03   ` Cornelia Huck
  2020-06-24 16:43 ` [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples Markus Armbruster
                   ` (16 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Cornelia Huck, pbonzini, Matthew Rosato

s390_pci_set_fid() sets zpci->fid_defined to true even when
visit_type_uint32() failed.  Reproducer: "-device zpci,fid=junk".
Harmless in practice, because qdev_device_add() then fails, throwing
away @zpci.  Fix it anyway.

Cc: Matthew Rosato <mjrosato@linux.ibm.com>
Cc: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/s390x/s390-pci-bus.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index be8535304e..2e0eab1c69 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -1265,7 +1265,9 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    visit_type_uint32(v, name, ptr, errp);
+    if (!visit_type_uint32(v, name, ptr, errp)) {
+        return;
+    }
     zpci->fid_defined = true;
 }
 
-- 
2.26.2



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

* [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (29 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:05   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type() Markus Armbruster
                   ` (15 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qom/object.h | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 94a61ccc3f..b70edd8cd9 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -671,8 +671,7 @@ Object *object_new(const char *typename);
  *                               NULL);
  *
  *   if (!obj) {
- *     g_printerr("Cannot create memory backend: %s\n",
- *                error_get_pretty(err));
+ *     error_reportf_err(err, "Cannot create memory backend: ");
  *   }
  *   </programlisting>
  * </example>
@@ -739,8 +738,7 @@ void object_apply_compat_props(Object *obj);
  *                          NULL);
  *
  *   if (!obj) {
- *     g_printerr("Cannot set properties: %s\n",
- *                error_get_pretty(err));
+ *     error_reportf_err(err, "Cannot set properties: ");
  *   }
  *   </programlisting>
  * </example>
-- 
2.26.2



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

* [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type()
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (30 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:06   ` Eric Blake
  2020-06-25  6:33   ` Philippe Mathieu-Daudé
  2020-06-24 16:43 ` [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure Markus Armbruster
                   ` (14 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Commit 2f262e06f0 lifted qdev_get_type() from qdev to object without
renaming it accordingly.  Do that now.

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

diff --git a/qom/object.c b/qom/object.c
index b8aac074c2..f6e9f0e413 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2359,7 +2359,7 @@ object_class_property_add_tm(ObjectClass *klass, const char *name,
                                      NULL, NULL, prop);
 }
 
-static char *qdev_get_type(Object *obj, Error **errp)
+static char *object_get_type(Object *obj, Error **errp)
 {
     return g_strdup(object_get_typename(obj));
 }
@@ -2702,7 +2702,7 @@ void object_class_property_set_description(ObjectClass *klass,
 
 static void object_class_init(ObjectClass *klass, void *data)
 {
-    object_class_property_add_str(klass, "type", qdev_get_type,
+    object_class_property_add_str(klass, "type", object_get_type,
                                   NULL);
 }
 
-- 
2.26.2



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

* [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (31 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type() Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:07   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 34/46] qom: Don't handle impossible " Markus Armbruster
                   ` (13 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Pass &error_abort instead of NULL where the returned value is
dereferenced or asserted to be non-null.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/core/platform-bus.c     | 5 +++--
 hw/ppc/spapr_drc.c         | 3 ++-
 hw/ppc/spapr_hcall.c       | 3 ++-
 hw/ppc/spapr_pci_nvlink2.c | 8 +++++---
 ui/vnc.c                   | 2 +-
 5 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index d494e5cec1..b700ff45fe 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -22,6 +22,7 @@
 #include "qemu/osdep.h"
 #include "hw/platform-bus.h"
 #include "hw/qdev-properties.h"
+#include "qapi/error.h"
 #include "qemu/error-report.h"
 #include "qemu/module.h"
 
@@ -63,8 +64,8 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
         return -1;
     }
 
-    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container", NULL);
-
+    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container",
+                                         &error_abort);
     assert(parent_mr);
     if (parent_mr != pbus_mr_obj) {
         /* MMIO region is not mapped on platform bus */
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index c8e8ba2ee8..43d12bc33a 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -867,7 +867,8 @@ int spapr_dt_drc(void *fdt, int offset, Object *owner, uint32_t drc_type_mask)
             continue;
         }
 
-        obj = object_property_get_link(root_container, prop->name, NULL);
+        obj = object_property_get_link(root_container, prop->name,
+                                       &error_abort);
         drc = SPAPR_DR_CONNECTOR(obj);
         drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 0f54988f2e..c1d01228c6 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1655,7 +1655,8 @@ static void spapr_handle_transient_dev_before_cas(SpaprMachineState *spapr)
             continue;
         }
         drc = SPAPR_DR_CONNECTOR(object_property_get_link(drc_container,
-                                                          prop->name, NULL));
+                                                          prop->name,
+                                                          &error_abort));
 
         if (spapr_drc_transient(drc)) {
             spapr_drc_reset(drc);
diff --git a/hw/ppc/spapr_pci_nvlink2.c b/hw/ppc/spapr_pci_nvlink2.c
index 8332d5694e..e4e09a93e6 100644
--- a/hw/ppc/spapr_pci_nvlink2.c
+++ b/hw/ppc/spapr_pci_nvlink2.c
@@ -141,9 +141,10 @@ static void spapr_phb_pci_collect_nvgpu(PCIBus *bus, PCIDevice *pdev,
     if (tgt) {
         Error *local_err = NULL;
         SpaprPhbPciNvGpuConfig *nvgpus = opaque;
-        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]", NULL);
+        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]",
+                                                  &error_abort);
         Object *mr_npu = object_property_get_link(po, "nvlink2-atsd-mr[0]",
-                                                  NULL);
+                                                  &error_abort);
 
         g_assert(mr_gpu || mr_npu);
         if (mr_gpu) {
@@ -358,7 +359,8 @@ void spapr_phb_nvgpu_ram_populate_dt(SpaprPhbState *sphb, void *fdt)
     for (i = 0; i < sphb->nvgpus->num; ++i) {
         SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
         Object *nv_mrobj = object_property_get_link(OBJECT(nvslot->gpdev),
-                                                    "nvlink2-mr[0]", NULL);
+                                                    "nvlink2-mr[0]",
+                                                    &error_abort);
         uint32_t associativity[] = {
             cpu_to_be32(0x4),
             SPAPR_GPU_NUMA_ID,
diff --git a/ui/vnc.c b/ui/vnc.c
index 527ad25124..f006aa1afd 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -568,7 +568,7 @@ VncInfo2List *qmp_query_vnc_servers(Error **errp)
                        &info->vencrypt, &info->has_vencrypt);
         if (vd->dcl.con) {
             dev = DEVICE(object_property_get_link(OBJECT(vd->dcl.con),
-                                                  "device", NULL));
+                                                  "device", &error_abort));
             info->has_display = true;
             info->display = g_strdup(dev->id);
         }
-- 
2.26.2



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

* [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (32 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:13   ` Eric Blake
  2020-06-25  6:36   ` Philippe Mathieu-Daudé
  2020-06-24 16:43 ` [PATCH 35/46] qom: Use return values to check for error where that's simpler Markus Armbruster
                   ` (12 subsequent siblings)
  46 siblings, 2 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Don't handle object_property_get_link() failure that can't happen
unless the programmer screwed up, pass &error_abort.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/arm/bcm2835_peripherals.c |  7 +------
 hw/arm/bcm2836.c             |  7 +------
 hw/display/bcm2835_fb.c      |  8 +-------
 hw/dma/bcm2835_dma.c         |  9 +--------
 hw/gpio/bcm2835_gpio.c       | 15 ++-------------
 hw/intc/nios2_iic.c          |  8 +-------
 hw/misc/bcm2835_mbox.c       |  9 +--------
 hw/misc/bcm2835_property.c   | 17 ++---------------
 hw/usb/hcd-dwc2.c            |  9 +--------
 9 files changed, 11 insertions(+), 78 deletions(-)

diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 8313410ffe..3c40bda91e 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -134,12 +134,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
     uint64_t ram_size, vcram_size;
     int n;
 
-    obj = object_property_get_link(OBJECT(dev), "ram", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required ram link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
+    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
 
     ram = MEMORY_REGION(obj);
     ram_size = memory_region_size(ram);
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 51d156f0c5..35281df8c3 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -77,12 +77,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
 
     /* common peripherals from bcm2835 */
 
-    obj = object_property_get_link(OBJECT(dev), "ram", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required ram link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
+    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
 
     object_property_add_const_link(OBJECT(&s->peripherals), "ram", obj);
 
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
index c6263808a2..c4bfed2740 100644
--- a/hw/display/bcm2835_fb.c
+++ b/hw/display/bcm2835_fb.c
@@ -401,7 +401,6 @@ static void bcm2835_fb_reset(DeviceState *dev)
 static void bcm2835_fb_realize(DeviceState *dev, Error **errp)
 {
     BCM2835FBState *s = BCM2835_FB(dev);
-    Error *err = NULL;
     Object *obj;
 
     if (s->vcram_base == 0) {
@@ -409,12 +408,7 @@ static void bcm2835_fb_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    obj = object_property_get_link(OBJECT(dev), "dma-mr", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required dma-mr link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
+    obj = object_property_get_link(OBJECT(dev), "dma-mr", &error_abort);
 
     /* Fill in the parts of initial_config that are not set by QOM properties */
     s->initial_config.xres_virtual = s->initial_config.xres;
diff --git a/hw/dma/bcm2835_dma.c b/hw/dma/bcm2835_dma.c
index 4cd9dab745..eb0002a2b9 100644
--- a/hw/dma/bcm2835_dma.c
+++ b/hw/dma/bcm2835_dma.c
@@ -376,16 +376,9 @@ static void bcm2835_dma_reset(DeviceState *dev)
 static void bcm2835_dma_realize(DeviceState *dev, Error **errp)
 {
     BCM2835DMAState *s = BCM2835_DMA(dev);
-    Error *err = NULL;
     Object *obj;
 
-    obj = object_property_get_link(OBJECT(dev), "dma-mr", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required dma-mr link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
-
+    obj = object_property_get_link(OBJECT(dev), "dma-mr", &error_abort);
     s->dma_mr = MEMORY_REGION(obj);
     address_space_init(&s->dma_as, s->dma_mr, TYPE_BCM2835_DMA "-memory");
 
diff --git a/hw/gpio/bcm2835_gpio.c b/hw/gpio/bcm2835_gpio.c
index 91ce3d10cc..abdddbc67c 100644
--- a/hw/gpio/bcm2835_gpio.c
+++ b/hw/gpio/bcm2835_gpio.c
@@ -312,22 +312,11 @@ static void bcm2835_gpio_realize(DeviceState *dev, Error **errp)
 {
     BCM2835GpioState *s = BCM2835_GPIO(dev);
     Object *obj;
-    Error *err = NULL;
 
-    obj = object_property_get_link(OBJECT(dev), "sdbus-sdhci", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required sdhci link not found: %s",
-                __func__, error_get_pretty(err));
-        return;
-    }
+    obj = object_property_get_link(OBJECT(dev), "sdbus-sdhci", &error_abort);
     s->sdbus_sdhci = SD_BUS(obj);
 
-    obj = object_property_get_link(OBJECT(dev), "sdbus-sdhost", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required sdhost link not found: %s",
-                __func__, error_get_pretty(err));
-        return;
-    }
+    obj = object_property_get_link(OBJECT(dev), "sdbus-sdhost", &error_abort);
     s->sdbus_sdhost = SD_BUS(obj);
 }
 
diff --git a/hw/intc/nios2_iic.c b/hw/intc/nios2_iic.c
index 3a5d86c2a4..1a5df8c89a 100644
--- a/hw/intc/nios2_iic.c
+++ b/hw/intc/nios2_iic.c
@@ -66,14 +66,8 @@ static void altera_iic_init(Object *obj)
 static void altera_iic_realize(DeviceState *dev, Error **errp)
 {
     struct AlteraIIC *pv = ALTERA_IIC(dev);
-    Error *err = NULL;
 
-    pv->cpu = object_property_get_link(OBJECT(dev), "cpu", &err);
-    if (!pv->cpu) {
-        error_setg(errp, "altera,iic: CPU link not found: %s",
-                   error_get_pretty(err));
-        return;
-    }
+    pv->cpu = object_property_get_link(OBJECT(dev), "cpu", &error_abort);
 }
 
 static void altera_iic_class_init(ObjectClass *klass, void *data)
diff --git a/hw/misc/bcm2835_mbox.c b/hw/misc/bcm2835_mbox.c
index 2afa06a746..9f73cbd5e4 100644
--- a/hw/misc/bcm2835_mbox.c
+++ b/hw/misc/bcm2835_mbox.c
@@ -308,15 +308,8 @@ static void bcm2835_mbox_realize(DeviceState *dev, Error **errp)
 {
     BCM2835MboxState *s = BCM2835_MBOX(dev);
     Object *obj;
-    Error *err = NULL;
-
-    obj = object_property_get_link(OBJECT(dev), "mbox-mr", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required mbox-mr link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
 
+    obj = object_property_get_link(OBJECT(dev), "mbox-mr", &error_abort);
     s->mbox_mr = MEMORY_REGION(obj);
     address_space_init(&s->mbox_as, s->mbox_mr, TYPE_BCM2835_MBOX "-memory");
     bcm2835_mbox_reset(dev);
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
index 3e228ca0ae..73941bdae9 100644
--- a/hw/misc/bcm2835_property.c
+++ b/hw/misc/bcm2835_property.c
@@ -392,24 +392,11 @@ static void bcm2835_property_realize(DeviceState *dev, Error **errp)
 {
     BCM2835PropertyState *s = BCM2835_PROPERTY(dev);
     Object *obj;
-    Error *err = NULL;
-
-    obj = object_property_get_link(OBJECT(dev), "fb", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required fb link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
 
+    obj = object_property_get_link(OBJECT(dev), "fb", &error_abort);
     s->fbdev = BCM2835_FB(obj);
 
-    obj = object_property_get_link(OBJECT(dev), "dma-mr", &err);
-    if (obj == NULL) {
-        error_setg(errp, "%s: required dma-mr link not found: %s",
-                   __func__, error_get_pretty(err));
-        return;
-    }
-
+    obj = object_property_get_link(OBJECT(dev), "dma-mr", &error_abort);
     s->dma_mr = MEMORY_REGION(obj);
     address_space_init(&s->dma_as, s->dma_mr, TYPE_BCM2835_PROPERTY "-memory");
 
diff --git a/hw/usb/hcd-dwc2.c b/hw/usb/hcd-dwc2.c
index 72cbd051f3..56f91f6bee 100644
--- a/hw/usb/hcd-dwc2.c
+++ b/hw/usb/hcd-dwc2.c
@@ -1274,15 +1274,8 @@ static void dwc2_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     DWC2State *s = DWC2_USB(dev);
     Object *obj;
-    Error *err = NULL;
 
-    obj = object_property_get_link(OBJECT(dev), "dma-mr", &err);
-    if (err) {
-        error_setg(errp, "dwc2: required dma-mr link not found: %s",
-                   error_get_pretty(err));
-        return;
-    }
-    assert(obj != NULL);
+    obj = object_property_get_link(OBJECT(dev), "dma-mr", &error_abort);
 
     s->dma_mr = MEMORY_REGION(obj);
     address_space_init(&s->dma_as, s->dma_mr, "dwc2");
-- 
2.26.2



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

* [PATCH 35/46] qom: Use return values to check for error where that's simpler
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (33 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 34/46] qom: Don't handle impossible " Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:24   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 36/46] qom: Put name parameter before value / visitor parameter Markus Armbruster
                   ` (11 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When using the Error object to check for error, we need to receive it
into a local variable, then propagate() it to @errp.

Using the return value permits allows receiving it straight to @errp.

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

diff --git a/qom/object.c b/qom/object.c
index f6e9f0e413..326a8de91e 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -549,8 +549,7 @@ void object_initialize_child_with_propsv(Object *parentobj,
     object_initialize(childobj, size, type);
     obj = OBJECT(childobj);
 
-    object_set_propv(obj, &local_err, vargs);
-    if (local_err) {
+    if (object_set_propv(obj, errp, vargs) < 0) {
         goto out;
     }
 
@@ -743,7 +742,7 @@ Object *object_new_with_propv(const char *typename,
     }
     obj = object_new_with_type(klass->type);
 
-    if (object_set_propv(obj, &local_err, vargs) < 0) {
+    if (object_set_propv(obj, errp, vargs) < 0) {
         goto error;
     }
 
@@ -1771,12 +1770,11 @@ static void object_set_link_property(Object *obj, Visitor *v,
     }
 
     if (strcmp(path, "") != 0) {
-        new_target = object_resolve_link(obj, name, path, &local_err);
+        new_target = object_resolve_link(obj, name, path, errp);
     }
 
     g_free(path);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!new_target) {
         return;
     }
 
-- 
2.26.2



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

* [PATCH 36/46] qom: Put name parameter before value / visitor parameter
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (34 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 35/46] qom: Use return values to check for error where that's simpler Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:27   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 37/46] qom: Make functions taking Error ** return bool, not void Markus Armbruster
                   ` (10 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The object_property_set_FOO() setters take property name and value in
an unusual order:

    void object_property_set_FOO(Object *obj, FOO_TYPE value,
                                 const char *name, Error **errp)

Having to pass value before name feels grating.  Swap them.

Same for object_property_set(), object_property_get(), and
object_property_parse().

Convert callers with this Coccinelle script:

    @@
    identifier fun = {object_property_get, object_property_parse, object_property_set_str, object_property_set_link, object_property_set_bool, object_property_set_int, object_property_set_uint, object_property_set, object_property_set_qobject};
    expression obj, v, name, errp;
    @@
    -    fun(obj, v, name, errp)
    +    fun(obj, name, v, errp)

Chokes on hw/arm/musicpal.c's lcd_refresh() with the unhelpful error
message "no position information".  Convert that one manually.

Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
ARMSSE being used both as typedef and function-like macro there.
Convert manually.

Fails to convert hw/rx/rx-gdbsim.c, because Coccinelle gets confused
by RXCPU being used both as typedef and function-like macro there.
Convert manually.  Convert that one manually.  The other files using
RXCPU that way don't need conversion.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/audio/pcspk.h                 |   2 +-
 include/qom/object.h                     |  45 ++++-----
 include/qom/qom-qobject.h                |   7 +-
 backends/cryptodev.c                     |   2 +-
 backends/rng.c                           |   2 +-
 bootdevice.c                             |   2 +-
 crypto/secret.c                          |   2 +-
 crypto/secret_keyring.c                  |   2 +-
 crypto/tlscredsanon.c                    |   2 +-
 crypto/tlscredspsk.c                     |   2 +-
 crypto/tlscredsx509.c                    |   2 +-
 hw/acpi/cpu_hotplug.c                    |   4 +-
 hw/acpi/ich9.c                           |   2 +-
 hw/acpi/piix4.c                          |   2 +-
 hw/arm/allwinner-a10.c                   |   6 +-
 hw/arm/armsse.c                          |  76 +++++++--------
 hw/arm/armv7m.c                          |  24 +++--
 hw/arm/aspeed.c                          |  24 ++---
 hw/arm/aspeed_ast2600.c                  |  54 +++++------
 hw/arm/aspeed_soc.c                      |  23 +++--
 hw/arm/bcm2835_peripherals.c             |  12 +--
 hw/arm/bcm2836.c                         |   9 +-
 hw/arm/cubieboard.c                      |   6 +-
 hw/arm/digic.c                           |   2 +-
 hw/arm/exynos4210.c                      |  13 +--
 hw/arm/fsl-imx25.c                       |  14 ++-
 hw/arm/fsl-imx31.c                       |   2 +-
 hw/arm/fsl-imx6.c                        |  37 ++++---
 hw/arm/fsl-imx6ul.c                      |  24 +++--
 hw/arm/fsl-imx7.c                        |  31 +++---
 hw/arm/highbank.c                        |  12 +--
 hw/arm/integratorcp.c                    |   2 +-
 hw/arm/microbit.c                        |   4 +-
 hw/arm/mps2-tz.c                         |  31 +++---
 hw/arm/mps2.c                            |  10 +-
 hw/arm/msf2-soc.c                        |   8 +-
 hw/arm/musca.c                           |  18 ++--
 hw/arm/musicpal.c                        |   4 +-
 hw/arm/nrf51_soc.c                       |   6 +-
 hw/arm/orangepi.c                        |  13 ++-
 hw/arm/raspi.c                           |   2 +-
 hw/arm/realview.c                        |   6 +-
 hw/arm/sbsa-ref.c                        |  16 +--
 hw/arm/stellaris.c                       |   4 +-
 hw/arm/stm32f205_soc.c                   |   8 +-
 hw/arm/stm32f405_soc.c                   |   8 +-
 hw/arm/versatilepb.c                     |   4 +-
 hw/arm/vexpress.c                        |   8 +-
 hw/arm/virt.c                            |  35 +++----
 hw/arm/xilinx_zynq.c                     |   6 +-
 hw/arm/xlnx-versal-virt.c                |   8 +-
 hw/arm/xlnx-versal.c                     |  30 +++---
 hw/arm/xlnx-zcu102.c                     |   8 +-
 hw/arm/xlnx-zynqmp.c                     |  46 ++++-----
 hw/block/xen-block.c                     |   9 +-
 hw/core/bus.c                            |   8 +-
 hw/core/numa.c                           |   4 +-
 hw/core/qdev-properties-system.c         |  10 +-
 hw/core/qdev-properties.c                |  20 ++--
 hw/core/qdev.c                           |   8 +-
 hw/display/virtio-gpu-pci.c              |   5 +-
 hw/display/virtio-vga.c                  |   5 +-
 hw/dma/sparc32_dma.c                     |   6 +-
 hw/dma/xilinx_axidma.c                   |   4 +-
 hw/i386/pc.c                             |   8 +-
 hw/i386/pc_piix.c                        |   4 +-
 hw/i386/pc_q35.c                         |  28 +++---
 hw/i386/x86.c                            |   2 +-
 hw/ide/qdev.c                            |   2 +-
 hw/intc/pnv_xive.c                       |   9 +-
 hw/intc/spapr_xive.c                     |   9 +-
 hw/intc/xics.c                           |   4 +-
 hw/intc/xive.c                           |   4 +-
 hw/m68k/q800.c                           |   4 +-
 hw/mem/pc-dimm.c                         |   4 +-
 hw/microblaze/petalogix_ml605_mmu.c      |  24 ++---
 hw/microblaze/petalogix_s3adsp1800_mmu.c |   2 +-
 hw/microblaze/xlnx-zynqmp-pmu.c          |  30 +++---
 hw/mips/boston.c                         |   4 +-
 hw/mips/cps.c                            |  24 ++---
 hw/mips/jazz.c                           |   4 +-
 hw/mips/malta.c                          |   4 +-
 hw/misc/iotkit-sysctl.c                  |   2 +-
 hw/misc/macio/macio.c                    |   6 +-
 hw/net/ne2000-isa.c                      |   2 +-
 hw/net/xilinx_axienet.c                  |   4 +-
 hw/pci-host/pnv_phb3.c                   |  20 ++--
 hw/pci-host/pnv_phb4.c                   |   4 +-
 hw/pci-host/pnv_phb4_pec.c               |   4 +-
 hw/pci-host/prep.c                       |   4 +-
 hw/ppc/mac_newworld.c                    |  10 +-
 hw/ppc/mac_oldworld.c                    |   4 +-
 hw/ppc/pnv.c                             | 118 +++++++++++------------
 hw/ppc/pnv_psi.c                         |   9 +-
 hw/ppc/spapr.c                           |   4 +-
 hw/ppc/spapr_irq.c                       |   6 +-
 hw/ppc/spapr_pci.c                       |   2 +-
 hw/riscv/opentitan.c                     |   4 +-
 hw/riscv/sifive_e.c                      |   4 +-
 hw/riscv/sifive_u.c                      |   6 +-
 hw/riscv/spike.c                         |   4 +-
 hw/riscv/virt.c                          |   4 +-
 hw/rx/rx-gdbsim.c                        |  12 +--
 hw/s390x/ipl.c                           |   4 +-
 hw/s390x/s390-pci-bus.c                  |   2 +-
 hw/s390x/s390-skeys.c                    |   2 +-
 hw/s390x/s390-stattrib.c                 |   2 +-
 hw/s390x/s390-virtio-ccw.c               |   6 +-
 hw/s390x/virtio-ccw-crypto.c             |   5 +-
 hw/s390x/virtio-ccw-rng.c                |   3 +-
 hw/scsi/scsi-bus.c                       |   4 +-
 hw/sd/aspeed_sdhci.c                     |   6 +-
 hw/sd/ssi-sd.c                           |   2 +-
 hw/sparc/sun4m.c                         |   2 +-
 hw/sparc64/sun4u.c                       |   2 +-
 hw/usb/dev-storage.c                     |   4 +-
 hw/virtio/virtio-crypto-pci.c            |   5 +-
 hw/virtio/virtio-iommu-pci.c             |   4 +-
 hw/virtio/virtio-pmem-pci.c              |   2 +-
 hw/virtio/virtio-rng-pci.c               |   3 +-
 hw/virtio/virtio-rng.c                   |   4 +-
 linux-user/syscall.c                     |   2 +-
 net/filter.c                             |   2 +-
 net/net.c                                |   2 +-
 qdev-monitor.c                           |   2 +-
 qom/object.c                             |  53 +++++-----
 qom/object_interfaces.c                  |   2 +-
 qom/qom-hmp-cmds.c                       |   2 +-
 qom/qom-qmp-cmds.c                       |   2 +-
 qom/qom-qobject.c                        |   9 +-
 softmmu/vl.c                             |  12 +--
 target/arm/monitor.c                     |   2 +-
 target/i386/cpu.c                        |  57 ++++++-----
 target/ppc/translate_init.inc.c          |   2 +-
 target/s390x/cpu_models.c                |   2 +-
 ui/console.c                             |   4 +-
 136 files changed, 702 insertions(+), 729 deletions(-)

diff --git a/include/hw/audio/pcspk.h b/include/hw/audio/pcspk.h
index 7e7f5f49dc..6386491288 100644
--- a/include/hw/audio/pcspk.h
+++ b/include/hw/audio/pcspk.h
@@ -39,7 +39,7 @@ static inline ISADevice *pcspk_init(ISABus *bus, ISADevice *pit)
     isadev = isa_new(TYPE_PC_SPEAKER);
     dev = DEVICE(isadev);
     qdev_prop_set_uint32(dev, "iobase", 0x61);
-    object_property_set_link(OBJECT(dev), OBJECT(pit), "pit", NULL);
+    object_property_set_link(OBJECT(dev), "pit", OBJECT(pit), NULL);
     isa_realize_and_unref(isadev, bus, &error_fatal);
 
     return isadev;
diff --git a/include/qom/object.h b/include/qom/object.h
index b70edd8cd9..7ef9c8d0cc 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1191,26 +1191,27 @@ void object_unparent(Object *obj);
 /**
  * object_property_get:
  * @obj: the object
+ * @name: the name of the property
  * @v: the visitor that will receive the property value.  This should be an
  *   Output visitor and the data will be written with @name as the name.
- * @name: the name of the property
  * @errp: returns an error if this function fails
  *
  * Reads a property from a object.
  */
-void object_property_get(Object *obj, Visitor *v, const char *name,
+void object_property_get(Object *obj, const char *name, Visitor *v,
                          Error **errp);
 
 /**
  * object_property_set_str:
- * @value: the value to be written to the property
  * @name: the name of the property
+ * @value: the value to be written to the property
  * @errp: returns an error if this function fails
  *
  * Writes a string value to a property.
  */
-void object_property_set_str(Object *obj, const char *value,
-                             const char *name, Error **errp);
+void object_property_set_str(Object *obj,
+                             const char *name, const char *value,
+                             Error **errp);
 
 /**
  * object_property_get_str:
@@ -1227,8 +1228,8 @@ char *object_property_get_str(Object *obj, const char *name,
 
 /**
  * object_property_set_link:
- * @value: the value to be written to the property
  * @name: the name of the property
+ * @value: the value to be written to the property
  * @errp: returns an error if this function fails
  *
  * Writes an object's canonical path to a property.
@@ -1238,8 +1239,8 @@ char *object_property_get_str(Object *obj, const char *name,
  * unreferenced, and a reference is added to the new target object.
  *
  */
-void object_property_set_link(Object *obj, Object *value,
-                              const char *name, Error **errp);
+void object_property_set_link(Object *obj, const char *name, Object *value,
+                              Error **errp);
 
 /**
  * object_property_get_link:
@@ -1256,14 +1257,14 @@ Object *object_property_get_link(Object *obj, const char *name,
 
 /**
  * object_property_set_bool:
- * @value: the value to be written to the property
  * @name: the name of the property
+ * @value: the value to be written to the property
  * @errp: returns an error if this function fails
  *
  * Writes a bool value to a property.
  */
-void object_property_set_bool(Object *obj, bool value,
-                              const char *name, Error **errp);
+void object_property_set_bool(Object *obj, const char *name, bool value,
+                              Error **errp);
 
 /**
  * object_property_get_bool:
@@ -1279,14 +1280,14 @@ bool object_property_get_bool(Object *obj, const char *name,
 
 /**
  * object_property_set_int:
- * @value: the value to be written to the property
  * @name: the name of the property
+ * @value: the value to be written to the property
  * @errp: returns an error if this function fails
  *
  * Writes an integer value to a property.
  */
-void object_property_set_int(Object *obj, int64_t value,
-                             const char *name, Error **errp);
+void object_property_set_int(Object *obj, const char *name, int64_t value,
+                             Error **errp);
 
 /**
  * object_property_get_int:
@@ -1302,14 +1303,14 @@ int64_t object_property_get_int(Object *obj, const char *name,
 
 /**
  * object_property_set_uint:
- * @value: the value to be written to the property
  * @name: the name of the property
+ * @value: the value to be written to the property
  * @errp: returns an error if this function fails
  *
  * Writes an unsigned integer value to a property.
  */
-void object_property_set_uint(Object *obj, uint64_t value,
-                              const char *name, Error **errp);
+void object_property_set_uint(Object *obj, const char *name, uint64_t value,
+                              Error **errp);
 
 /**
  * object_property_get_uint:
@@ -1340,28 +1341,28 @@ int object_property_get_enum(Object *obj, const char *name,
 /**
  * object_property_set:
  * @obj: the object
+ * @name: the name of the property
  * @v: the visitor that will be used to write the property value.  This should
  *   be an Input visitor and the data will be first read with @name as the
  *   name and then written as the property value.
- * @name: the name of the property
  * @errp: returns an error if this function fails
  *
  * Writes a property to a object.
  */
-void object_property_set(Object *obj, Visitor *v, const char *name,
+void object_property_set(Object *obj, const char *name, Visitor *v,
                          Error **errp);
 
 /**
  * object_property_parse:
  * @obj: the object
- * @string: the string that will be used to parse the property value.
  * @name: the name of the property
+ * @string: the string that will be used to parse the property value.
  * @errp: returns an error if this function fails
  *
  * Parses a string and writes the result into a property of an object.
  */
-void object_property_parse(Object *obj, const char *string,
-                           const char *name, Error **errp);
+void object_property_parse(Object *obj, const char *name,
+                           const char *string, Error **errp);
 
 /**
  * object_property_print:
diff --git a/include/qom/qom-qobject.h b/include/qom/qom-qobject.h
index 82136e6e80..ad9a98dd62 100644
--- a/include/qom/qom-qobject.h
+++ b/include/qom/qom-qobject.h
@@ -28,13 +28,14 @@ struct QObject *object_property_get_qobject(Object *obj, const char *name,
 /**
  * object_property_set_qobject:
  * @obj: the object
- * @ret: The value that will be written to the property.
  * @name: the name of the property
+ * @value: The value that will be written to the property.
  * @errp: returns an error if this function fails
  *
  * Writes a property to a object.
  */
-void object_property_set_qobject(Object *obj, struct QObject *qobj,
-                                 const char *name, struct Error **errp);
+void object_property_set_qobject(Object *obj,
+                                 const char *name, struct QObject *value,
+                                 struct Error **errp);
 
 #endif
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index 17ee76a61e..ada4ebe78b 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -211,7 +211,7 @@ static void cryptodev_backend_instance_init(Object *obj)
                           cryptodev_backend_set_queues,
                           NULL, NULL);
     /* Initialize devices' queues property to 1 */
-    object_property_set_int(obj, 1, "queues", NULL);
+    object_property_set_int(obj, "queues", 1, NULL);
 }
 
 static void cryptodev_backend_finalize(Object *obj)
diff --git a/backends/rng.c b/backends/rng.c
index 597f0ec268..484f04e891 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -48,7 +48,7 @@ static bool rng_backend_prop_get_opened(Object *obj, Error **errp)
 
 static void rng_backend_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "opened", errp);
+    object_property_set_bool(OBJECT(uc), "opened", true, errp);
 }
 
 static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
diff --git a/bootdevice.c b/bootdevice.c
index 769f40c77d..8185402a5a 100644
--- a/bootdevice.c
+++ b/bootdevice.c
@@ -341,7 +341,7 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
                         prop);
 
     /* initialize devices' bootindex property to -1 */
-    object_property_set_int(obj, -1, name, NULL);
+    object_property_set_int(obj, name, -1, NULL);
 }
 
 typedef struct FWLCHSEntry FWLCHSEntry;
diff --git a/crypto/secret.c b/crypto/secret.c
index 3447e2f64b..281cb81f0f 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -110,7 +110,7 @@ qcrypto_secret_prop_get_file(Object *obj,
 static void
 qcrypto_secret_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "loaded", errp);
+    object_property_set_bool(OBJECT(uc), "loaded", true, errp);
 }
 
 
diff --git a/crypto/secret_keyring.c b/crypto/secret_keyring.c
index 4f132d6370..8bfc58ebf4 100644
--- a/crypto/secret_keyring.c
+++ b/crypto/secret_keyring.c
@@ -105,7 +105,7 @@ qcrypto_secret_prop_get_key(Object *obj, Visitor *v,
 static void
 qcrypto_secret_keyring_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "loaded", errp);
+    object_property_set_bool(OBJECT(uc), "loaded", true, errp);
 }
 
 
diff --git a/crypto/tlscredsanon.c b/crypto/tlscredsanon.c
index fc078d5b97..30275b6847 100644
--- a/crypto/tlscredsanon.c
+++ b/crypto/tlscredsanon.c
@@ -165,7 +165,7 @@ qcrypto_tls_creds_anon_prop_get_loaded(Object *obj G_GNUC_UNUSED,
 static void
 qcrypto_tls_creds_anon_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "loaded", errp);
+    object_property_set_bool(OBJECT(uc), "loaded", true, errp);
 }
 
 
diff --git a/crypto/tlscredspsk.c b/crypto/tlscredspsk.c
index f01b64d8bc..e26807b899 100644
--- a/crypto/tlscredspsk.c
+++ b/crypto/tlscredspsk.c
@@ -234,7 +234,7 @@ qcrypto_tls_creds_psk_prop_get_loaded(Object *obj G_GNUC_UNUSED,
 static void
 qcrypto_tls_creds_psk_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "loaded", errp);
+    object_property_set_bool(OBJECT(uc), "loaded", true, errp);
 }
 
 
diff --git a/crypto/tlscredsx509.c b/crypto/tlscredsx509.c
index e337d68c4f..dd7267ccdb 100644
--- a/crypto/tlscredsx509.c
+++ b/crypto/tlscredsx509.c
@@ -774,7 +774,7 @@ qcrypto_tls_creds_x509_prop_get_sanity(Object *obj,
 static void
 qcrypto_tls_creds_x509_complete(UserCreatable *uc, Error **errp)
 {
-    object_property_set_bool(OBJECT(uc), true, "loaded", errp);
+    object_property_set_bool(OBJECT(uc), "loaded", true, errp);
 }
 
 
diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c
index 3e687d227a..53654f8638 100644
--- a/hw/acpi/cpu_hotplug.c
+++ b/hw/acpi/cpu_hotplug.c
@@ -41,7 +41,7 @@ static void cpu_status_write(void *opaque, hwaddr addr, uint64_t data,
      */
     if (addr == 0 && data == 0) {
         AcpiCpuHotplug *cpus = opaque;
-        object_property_set_bool(cpus->device, false, "cpu-hotplug-legacy",
+        object_property_set_bool(cpus->device, "cpu-hotplug-legacy", false,
                                  &error_abort);
     }
 }
@@ -63,7 +63,7 @@ static void acpi_set_cpu_present_bit(AcpiCpuHotplug *g, CPUState *cpu)
 
     cpu_id = k->get_arch_id(cpu);
     if ((cpu_id / 8) >= ACPI_GPE_PROC_LEN) {
-        object_property_set_bool(g->device, false, "cpu-hotplug-legacy",
+        object_property_set_bool(g->device, "cpu-hotplug-legacy", false,
                                  &error_abort);
         return;
     }
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 2d204babc6..6a19070cec 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -201,7 +201,7 @@ static int vmstate_cpuhp_pre_load(void *opaque)
 {
     ICH9LPCPMRegs *s = opaque;
     Object *obj = OBJECT(s->gpe_cpu.device);
-    object_property_set_bool(obj, false, "cpu-hotplug-legacy", &error_abort);
+    object_property_set_bool(obj, "cpu-hotplug-legacy", false, &error_abort);
     return 0;
 }
 
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 52bcbd6414..b8c5387c33 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -243,7 +243,7 @@ static bool vmstate_test_use_cpuhp(void *opaque)
 static int vmstate_cpuhp_pre_load(void *opaque)
 {
     Object *obj = OBJECT(opaque);
-    object_property_set_bool(obj, false, "cpu-hotplug-legacy", &error_abort);
+    object_property_set_bool(obj, "cpu-hotplug-legacy", false, &error_abort);
     return 0;
 }
 
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 3e45aa4141..e258463747 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -136,15 +136,15 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
 
             sprintf(bus, "usb-bus.%d", i);
 
-            object_property_set_bool(OBJECT(&s->ehci[i]), true,
-                                     "companion-enable", &error_fatal);
+            object_property_set_bool(OBJECT(&s->ehci[i]), "companion-enable",
+                                     true, &error_fatal);
             sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &error_fatal);
             sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
                             AW_A10_EHCI_BASE + i * 0x8000);
             sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci[i]), 0,
                                qdev_get_gpio_in(dev, 39 + i));
 
-            object_property_set_str(OBJECT(&s->ohci[i]), bus, "masterbus",
+            object_property_set_str(OBJECT(&s->ohci[i]), "masterbus", bus,
                                     &error_fatal);
             sysbus_realize(SYS_BUS_DEVICE(&s->ohci[i]), &error_fatal);
             sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci[i]), 0,
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index b306d95538..8af599cb13 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -535,21 +535,21 @@ static void armsse_realize(DeviceState *dev, Error **errp)
          * later if necessary.
          */
         if (extract32(info->cpuwait_rst, i, 1)) {
-            object_property_set_bool(cpuobj, true, "start-powered-off", &err);
+            object_property_set_bool(cpuobj, "start-powered-off", true, &err);
             if (err) {
                 error_propagate(errp, err);
                 return;
             }
         }
         if (!s->cpu_fpu[i]) {
-            object_property_set_bool(cpuobj, false, "vfp", &err);
+            object_property_set_bool(cpuobj, "vfp", false, &err);
             if (err) {
                 error_propagate(errp, err);
                 return;
             }
         }
         if (!s->cpu_dsp[i]) {
-            object_property_set_bool(cpuobj, false, "dsp", &err);
+            object_property_set_bool(cpuobj, "dsp", false, &err);
             if (err) {
                 error_propagate(errp, err);
                 return;
@@ -563,9 +563,9 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             memory_region_add_subregion_overlap(&s->cpu_container[i], 0,
                                                 &s->container, -1);
         }
-        object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
-                                 "memory", &error_abort);
-        object_property_set_link(cpuobj, OBJECT(s), "idau", &error_abort);
+        object_property_set_link(cpuobj, "memory",
+                                 OBJECT(&s->cpu_container[i]), &error_abort);
+        object_property_set_link(cpuobj, "idau", OBJECT(s), &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(cpuobj), errp)) {
             return;
         }
@@ -603,8 +603,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                 DeviceState *devs = DEVICE(splitter);
                 int cpunum;
 
-                object_property_set_int(splitter, info->num_cpus,
-                                        "num-lines", &err);
+                object_property_set_int(splitter, "num-lines", info->num_cpus,
+                                        &err);
                 if (err) {
                     error_propagate(errp, err);
                     return;
@@ -655,8 +655,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * multiple lines, one for each of the PPCs within the ARMSSE and one
      * that will be an output from the ARMSSE to the system.
      */
-    object_property_set_int(OBJECT(&s->sec_resp_splitter), 3,
-                            "num-lines", &err);
+    object_property_set_int(OBJECT(&s->sec_resp_splitter), "num-lines", 3,
+                            &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -681,8 +681,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             error_propagate(errp, err);
             return;
         }
-        object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
-                                 "downstream", &error_abort);
+        object_property_set_link(OBJECT(&s->mpc[i]), "downstream",
+                                 OBJECT(&s->sram[i]), &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), errp)) {
             return;
         }
@@ -697,9 +697,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* We must OR together lines from the MPC splitters to go to the NVIC */
-    object_property_set_int(OBJECT(&s->mpc_irq_orgate),
-                            IOTS_NUM_EXP_MPC + info->sram_banks,
-                            "num-lines", &err);
+    object_property_set_int(OBJECT(&s->mpc_irq_orgate), "num-lines",
+                            IOTS_NUM_EXP_MPC + info->sram_banks, &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -727,7 +726,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
                        armsse_get_common_irq_in(s, 3));
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->timer0), 0);
-    object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[0]",
+    object_property_set_link(OBJECT(&s->apb_ppc0), "port[0]", OBJECT(mr),
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
@@ -737,7 +736,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
                        armsse_get_common_irq_in(s, 4));
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->timer1), 0);
-    object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[1]",
+    object_property_set_link(OBJECT(&s->apb_ppc0), "port[1]", OBJECT(mr),
                              &error_abort);
 
     qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
@@ -747,7 +746,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
                        armsse_get_common_irq_in(s, 5));
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->dualtimer), 0);
-    object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[2]",
+    object_property_set_link(OBJECT(&s->apb_ppc0), "port[2]", OBJECT(mr),
                              &error_abort);
 
     if (info->has_mhus) {
@@ -770,8 +769,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
             }
             port = g_strdup_printf("port[%d]", i + 3);
             mr = sysbus_mmio_get_region(mhu_sbd, 0);
-            object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr),
-                                     port, &error_abort);
+            object_property_set_link(OBJECT(&s->apb_ppc0), port, OBJECT(mr),
+                                     &error_abort);
             g_free(port);
 
             /*
@@ -831,8 +830,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * ones) are sent individually to the security controller, and also
      * ORed together to give a single combined PPC interrupt to the NVIC.
      */
-    object_property_set_int(OBJECT(&s->ppc_irq_orgate),
-                            NUM_PPCS, "num-lines", &err);
+    object_property_set_int(OBJECT(&s->ppc_irq_orgate), "num-lines", NUM_PPCS,
+                            &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -907,7 +906,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
                        armsse_get_common_irq_in(s, 2));
     mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->s32ktimer), 0);
-    object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]",
+    object_property_set_link(OBJECT(&s->apb_ppc1), "port[0]", OBJECT(mr),
                              &error_abort);
 
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), errp)) {
@@ -933,15 +932,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                           qdev_get_gpio_in_named(dev_apb_ppc1,
                                                  "cfg_sec_resp", 0));
 
-    object_property_set_int(OBJECT(&s->sysinfo), info->sys_version,
-                            "SYS_VERSION", &err);
+    object_property_set_int(OBJECT(&s->sysinfo), "SYS_VERSION",
+                            info->sys_version, &err);
     if (err) {
         error_propagate(errp, err);
         return;
     }
-    object_property_set_int(OBJECT(&s->sysinfo),
-                            armsse_sys_config_value(s, info),
-                            "SYS_CONFIG", &err);
+    object_property_set_int(OBJECT(&s->sysinfo), "SYS_CONFIG",
+                            armsse_sys_config_value(s, info), &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -952,14 +950,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     /* System information registers */
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysinfo), 0, 0x40020000);
     /* System control registers */
-    object_property_set_int(OBJECT(&s->sysctl), info->sys_version,
-                            "SYS_VERSION", &error_abort);
-    object_property_set_int(OBJECT(&s->sysctl), info->cpuwait_rst,
-                            "CPUWAIT_RST", &error_abort);
-    object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
-                            "INITSVTOR0_RST", &error_abort);
-    object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
-                            "INITSVTOR1_RST", &error_abort);
+    object_property_set_int(OBJECT(&s->sysctl), "SYS_VERSION",
+                            info->sys_version, &error_abort);
+    object_property_set_int(OBJECT(&s->sysctl), "CPUWAIT_RST",
+                            info->cpuwait_rst, &error_abort);
+    object_property_set_int(OBJECT(&s->sysctl), "INITSVTOR0_RST",
+                            s->init_svtor, &error_abort);
+    object_property_set_int(OBJECT(&s->sysctl), "INITSVTOR1_RST",
+                            s->init_svtor, &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), errp)) {
         return;
     }
@@ -988,7 +986,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* This OR gate wires together outputs from the secure watchdogs to NMI */
-    object_property_set_int(OBJECT(&s->nmi_orgate), 2, "num-lines", &err);
+    object_property_set_int(OBJECT(&s->nmi_orgate), "num-lines", 2, &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -1028,7 +1026,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < ARRAY_SIZE(s->ppc_irq_splitter); i++) {
         Object *splitter = OBJECT(&s->ppc_irq_splitter[i]);
 
-        object_property_set_int(splitter, 2, "num-lines", &err);
+        object_property_set_int(splitter, "num-lines", 2, &err);
         if (err) {
             error_propagate(errp, err);
             return;
@@ -1073,7 +1071,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         SplitIRQ *splitter = &s->mpc_irq_splitter[i];
         DeviceState *dev_splitter = DEVICE(splitter);
 
-        object_property_set_int(OBJECT(splitter), 2, "num-lines", &err);
+        object_property_set_int(OBJECT(splitter), "num-lines", 2, &err);
         if (err) {
             error_propagate(errp, err);
             return;
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index 5d6bded386..c42baeecbb 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -167,39 +167,37 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    object_property_set_link(OBJECT(s->cpu), OBJECT(&s->container), "memory",
+    object_property_set_link(OBJECT(s->cpu), "memory", OBJECT(&s->container),
                              &error_abort);
     if (object_property_find(OBJECT(s->cpu), "idau", NULL)) {
-        object_property_set_link(OBJECT(s->cpu), s->idau, "idau",
+        object_property_set_link(OBJECT(s->cpu), "idau", s->idau,
                                  &error_abort);
     }
     if (object_property_find(OBJECT(s->cpu), "init-svtor", NULL)) {
-        object_property_set_uint(OBJECT(s->cpu), s->init_svtor,
-                                 "init-svtor", &err);
+        object_property_set_uint(OBJECT(s->cpu), "init-svtor", s->init_svtor,
+                                 &err);
         if (err != NULL) {
             error_propagate(errp, err);
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "start-powered-off", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), s->start_powered_off,
-                                 "start-powered-off", &err);
+        object_property_set_bool(OBJECT(s->cpu), "start-powered-off",
+                                 s->start_powered_off, &err);
         if (err != NULL) {
             error_propagate(errp, err);
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "vfp", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), s->vfp,
-                                 "vfp", &err);
+        object_property_set_bool(OBJECT(s->cpu), "vfp", s->vfp, &err);
         if (err != NULL) {
             error_propagate(errp, err);
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "dsp", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), s->dsp,
-                                 "dsp", &err);
+        object_property_set_bool(OBJECT(s->cpu), "dsp", s->dsp, &err);
         if (err != NULL) {
             error_propagate(errp, err);
             return;
@@ -243,13 +241,13 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
             Object *obj = OBJECT(&s->bitband[i]);
             SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]);
 
-            object_property_set_int(obj, bitband_input_addr[i], "base", &err);
+            object_property_set_int(obj, "base", bitband_input_addr[i], &err);
             if (err != NULL) {
                 error_propagate(errp, err);
                 return;
             }
-            object_property_set_link(obj, OBJECT(s->board_memory),
-                                     "source-memory", &error_abort);
+            object_property_set_link(obj, "source-memory",
+                                     OBJECT(s->board_memory), &error_abort);
             if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 863757e1f0..d60690af75 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -274,7 +274,7 @@ static void aspeed_machine_init(MachineState *machine)
     /*
      * This will error out if isize is not supported by memory controller.
      */
-    object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
+    object_property_set_uint(OBJECT(&bmc->soc), "ram-size", ram_size,
                              &error_fatal);
 
     for (i = 0; i < sc->macs_num; i++) {
@@ -285,22 +285,22 @@ static void aspeed_machine_init(MachineState *machine)
         }
     }
 
-    object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap1, "hw-strap1",
+    object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
                             &error_abort);
-    object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap2, "hw-strap2",
+    object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
                             &error_abort);
-    object_property_set_int(OBJECT(&bmc->soc), amc->num_cs, "num-cs",
+    object_property_set_int(OBJECT(&bmc->soc), "num-cs", amc->num_cs,
                             &error_abort);
-    object_property_set_link(OBJECT(&bmc->soc), OBJECT(&bmc->ram_container),
-                             "dram", &error_abort);
+    object_property_set_link(OBJECT(&bmc->soc), "dram",
+                             OBJECT(&bmc->ram_container), &error_abort);
     if (machine->kernel_filename) {
         /*
          * When booting with a -kernel command line there is no u-boot
          * that runs to unlock the SCU. In this case set the default to
          * be unlocked as the kernel expects
          */
-        object_property_set_int(OBJECT(&bmc->soc), ASPEED_SCU_PROT_KEY,
-                                "hw-prot-key", &error_abort);
+        object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
+                                ASPEED_SCU_PROT_KEY, &error_abort);
     }
     qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
 
@@ -390,10 +390,10 @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
     /* add a TMP423 temperature sensor */
     dev = i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 2),
                            "tmp423", 0x4c);
-    object_property_set_int(OBJECT(dev), 31000, "temperature0", &error_abort);
-    object_property_set_int(OBJECT(dev), 28000, "temperature1", &error_abort);
-    object_property_set_int(OBJECT(dev), 20000, "temperature2", &error_abort);
-    object_property_set_int(OBJECT(dev), 110000, "temperature3", &error_abort);
+    object_property_set_int(OBJECT(dev), "temperature0", 31000, &error_abort);
+    object_property_set_int(OBJECT(dev), "temperature1", 28000, &error_abort);
+    object_property_set_int(OBJECT(dev), "temperature2", 20000, &error_abort);
+    object_property_set_int(OBJECT(dev), "temperature3", 110000, &error_abort);
 }
 
 static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index aa02755d3f..4d25d550c5 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -196,7 +196,7 @@ static void aspeed_soc_ast2600_init(Object *obj)
     object_initialize_child(obj, "sd-controller", &s->sdhci,
                             TYPE_ASPEED_SDHCI);
 
-    object_property_set_int(OBJECT(&s->sdhci), 2, "num-slots", &error_abort);
+    object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
 
     /* Init sd card slot class here so that they're under the correct parent */
     for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
@@ -207,7 +207,7 @@ static void aspeed_soc_ast2600_init(Object *obj)
     object_initialize_child(obj, "emmc-controller", &s->emmc,
                             TYPE_ASPEED_SDHCI);
 
-    object_property_set_int(OBJECT(&s->emmc), 1, "num-slots", &error_abort);
+    object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
 
     object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
                             TYPE_SYSBUS_SDHCI);
@@ -241,17 +241,16 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
     /* CPU */
     for (i = 0; i < sc->num_cpus; i++) {
-        object_property_set_int(OBJECT(&s->cpu[i]), QEMU_PSCI_CONDUIT_SMC,
-                                "psci-conduit", &error_abort);
+        object_property_set_int(OBJECT(&s->cpu[i]), "psci-conduit",
+                                QEMU_PSCI_CONDUIT_SMC, &error_abort);
         if (sc->num_cpus > 1) {
-            object_property_set_int(OBJECT(&s->cpu[i]),
-                                    ASPEED_A7MPCORE_ADDR,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(OBJECT(&s->cpu[i]), "reset-cbar",
+                                    ASPEED_A7MPCORE_ADDR, &error_abort);
         }
-        object_property_set_int(OBJECT(&s->cpu[i]), aspeed_calc_affinity(i),
-                                "mp-affinity", &error_abort);
+        object_property_set_int(OBJECT(&s->cpu[i]), "mp-affinity",
+                                aspeed_calc_affinity(i), &error_abort);
 
-        object_property_set_int(OBJECT(&s->cpu[i]), 1125000000, "cntfrq",
+        object_property_set_int(OBJECT(&s->cpu[i]), "cntfrq", 1125000000,
                                 &error_abort);
 
         /*
@@ -265,11 +264,11 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* A7MPCORE */
-    object_property_set_int(OBJECT(&s->a7mpcore), sc->num_cpus, "num-cpu",
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", sc->num_cpus,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->a7mpcore),
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
                             ASPEED_SOC_AST2600_MAX_IRQ + GIC_INTERNAL,
-                            "num-irq", &error_abort);
+                            &error_abort);
 
     sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, ASPEED_A7MPCORE_ADDR);
@@ -313,8 +312,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_RTC));
 
     /* Timer */
-    object_property_set_link(OBJECT(&s->timerctrl),
-                             OBJECT(&s->scu), "scu", &error_abort);
+    object_property_set_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu),
+                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
@@ -333,7 +332,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* I2C */
-    object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
+    object_property_set_link(OBJECT(&s->i2c), "dram", OBJECT(s->dram_mr),
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
@@ -350,10 +349,10 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 
     /* FMC, The number of CS is set at the board level */
-    object_property_set_link(OBJECT(&s->fmc), OBJECT(s->dram_mr), "dram",
+    object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(s->dram_mr),
                              &error_abort);
-    object_property_set_int(OBJECT(&s->fmc), sc->memmap[ASPEED_SDRAM],
-                            "sdram-base", &err);
+    object_property_set_int(OBJECT(&s->fmc), "sdram-base",
+                            sc->memmap[ASPEED_SDRAM], &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -369,10 +368,9 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
     /* SPI */
     for (i = 0; i < sc->spis_num; i++) {
-        object_property_set_link(OBJECT(&s->spi[i]), OBJECT(s->dram_mr),
-                                 "dram", &error_abort);
-        object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
-                                &error_abort);
+        object_property_set_link(OBJECT(&s->spi[i]), "dram",
+                                 OBJECT(s->dram_mr), &error_abort);
+        object_property_set_int(OBJECT(&s->spi[i]), "num-cs", 1, &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
@@ -403,8 +401,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->wdts_num; i++) {
         AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
 
-        object_property_set_link(OBJECT(&s->wdt[i]),
-                                 OBJECT(&s->scu), "scu", &error_abort);
+        object_property_set_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu),
+                                 &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
@@ -414,7 +412,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
 
     /* Net */
     for (i = 0; i < sc->macs_num; i++) {
-        object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
+        object_property_set_bool(OBJECT(&s->ftgmac100[i]), "aspeed", true,
                                  &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
@@ -424,8 +422,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
         sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
                            aspeed_soc_get_irq(s, ASPEED_ETH1 + i));
 
-        object_property_set_link(OBJECT(&s->mii[i]), OBJECT(&s->ftgmac100[i]),
-                                 "nic", &error_abort);
+        object_property_set_link(OBJECT(&s->mii[i]), "nic",
+                                 OBJECT(&s->ftgmac100[i]), &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
             return;
         }
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 6faffc13cc..8d2cbf3715 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -204,7 +204,7 @@ static void aspeed_soc_init(Object *obj)
 
     object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
 
-    object_property_set_int(OBJECT(&s->sdhci), 2, "num-slots", &error_abort);
+    object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
 
     /* Init sd card slot class here so that they're under the correct parent */
     for (i = 0; i < ASPEED_SDHCI_NUM_SLOTS; ++i) {
@@ -270,8 +270,8 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_RTC));
 
     /* Timer */
-    object_property_set_link(OBJECT(&s->timerctrl),
-                             OBJECT(&s->scu), "scu", &error_abort);
+    object_property_set_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu),
+                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
         return;
     }
@@ -290,7 +290,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 
     /* I2C */
-    object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
+    object_property_set_link(OBJECT(&s->i2c), "dram", OBJECT(s->dram_mr),
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
         return;
@@ -300,10 +300,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
                        aspeed_soc_get_irq(s, ASPEED_I2C));
 
     /* FMC, The number of CS is set at the board level */
-    object_property_set_link(OBJECT(&s->fmc), OBJECT(s->dram_mr), "dram",
+    object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(s->dram_mr),
                              &error_abort);
-    object_property_set_int(OBJECT(&s->fmc), sc->memmap[ASPEED_SDRAM],
-                            "sdram-base", &err);
+    object_property_set_int(OBJECT(&s->fmc), "sdram-base",
+                            sc->memmap[ASPEED_SDRAM], &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -319,8 +319,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* SPI */
     for (i = 0; i < sc->spis_num; i++) {
-        object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
-                                &error_abort);
+        object_property_set_int(OBJECT(&s->spi[i]), "num-cs", 1, &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
             return;
         }
@@ -351,8 +350,8 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < sc->wdts_num; i++) {
         AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
 
-        object_property_set_link(OBJECT(&s->wdt[i]),
-                                 OBJECT(&s->scu), "scu", &error_abort);
+        object_property_set_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu),
+                                 &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
             return;
         }
@@ -362,7 +361,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 
     /* Net */
     for (i = 0; i < sc->macs_num; i++) {
-        object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
+        object_property_set_bool(OBJECT(&s->ftgmac100[i]), "aspeed", true,
                                  &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
             return;
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 3c40bda91e..b2a939a100 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -217,8 +217,8 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    object_property_set_uint(OBJECT(&s->fb), ram_size - vcram_size,
-                             "vcram-base", &err);
+    object_property_set_uint(OBJECT(&s->fb), "vcram-base",
+                             ram_size - vcram_size, &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -262,11 +262,11 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
      * For the exact details please refer to the Arasan documentation:
      *   SD3.0_Host_AHB_eMMC4.4_Usersguide_ver5.9_jan11_10.pdf
      */
-    object_property_set_uint(OBJECT(&s->sdhci), 3, "sd-spec-version",
+    object_property_set_uint(OBJECT(&s->sdhci), "sd-spec-version", 3,
                              &error_abort);
-    object_property_set_uint(OBJECT(&s->sdhci), BCM2835_SDHC_CAPAREG, "capareg",
-                             &error_abort);
-    object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
+    object_property_set_uint(OBJECT(&s->sdhci), "capareg",
+                             BCM2835_SDHC_CAPAREG, &error_abort);
+    object_property_set_bool(OBJECT(&s->sdhci), "pending-insert-quirk", true,
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
         return;
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 35281df8c3..5008037395 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -108,17 +108,16 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
         s->cpu[n].core.mp_affinity = (info->clusterid << 8) | n;
 
         /* set periphbase/CBAR value for CPU-local registers */
-        object_property_set_int(OBJECT(&s->cpu[n].core),
-                                info->peri_base,
-                                "reset-cbar", &err);
+        object_property_set_int(OBJECT(&s->cpu[n].core), "reset-cbar",
+                                info->peri_base, &err);
         if (err) {
             error_propagate(errp, err);
             return;
         }
 
         /* start powered off if not enabled */
-        object_property_set_bool(OBJECT(&s->cpu[n].core), n >= s->enabled_cpus,
-                                 "start-powered-off", &err);
+        object_property_set_bool(OBJECT(&s->cpu[n].core), "start-powered-off",
+                                 n >= s->enabled_cpus, &err);
         if (err) {
             error_propagate(errp, err);
             return;
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index c720e24ced..302919246b 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -62,19 +62,19 @@ static void cubieboard_init(MachineState *machine)
     object_property_add_child(OBJECT(machine), "soc", OBJECT(a10));
     object_unref(OBJECT(a10));
 
-    object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
+    object_property_set_int(OBJECT(&a10->emac), "phy-addr", 1, &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set phy address: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&a10->timer), 32768, "clk0-freq", &err);
+    object_property_set_int(OBJECT(&a10->timer), "clk0-freq", 32768, &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk0 frequency: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&a10->timer), 24000000, "clk1-freq", &err);
+    object_property_set_int(OBJECT(&a10->timer), "clk1-freq", 24000000, &err);
     if (err != NULL) {
         error_reportf_err(err, "Couldn't set clk1 frequency: ");
         exit(1);
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index 9fbb2258c9..d5109ab938 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -56,7 +56,7 @@ static void digic_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd;
     int i;
 
-    object_property_set_bool(OBJECT(&s->cpu), true, "reset-hivecs", &err);
+    object_property_set_bool(OBJECT(&s->cpu), "reset-hivecs", true, &err);
     if (err != NULL) {
         error_propagate(errp, err);
         return;
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
index fa639806ec..081bbff317 100644
--- a/hw/arm/exynos4210.c
+++ b/hw/arm/exynos4210.c
@@ -188,7 +188,7 @@ static DeviceState *pl330_create(uint32_t base, qemu_or_irq *orgate,
     sysbus_realize_and_unref(busdev, &error_fatal);
     sysbus_mmio_map(busdev, 0, base);
 
-    object_property_set_int(OBJECT(orgate), nevents + 1, "num-lines",
+    object_property_set_int(OBJECT(orgate), "num-lines", nevents + 1,
                             &error_abort);
     qdev_realize(DEVICE(orgate), NULL, &error_abort);
 
@@ -215,14 +215,15 @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
          * support EL3 so the CPU EL3 property is disabled before realization.
          */
         if (object_property_find(cpuobj, "has_el3", NULL)) {
-            object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
+            object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
         }
 
         s->cpu[n] = ARM_CPU(cpuobj);
-        object_property_set_int(cpuobj, exynos4210_calc_affinity(n),
-                                "mp-affinity", &error_abort);
-        object_property_set_int(cpuobj, EXYNOS4210_SMP_PRIVATE_BASE_ADDR,
-                                "reset-cbar", &error_abort);
+        object_property_set_int(cpuobj, "mp-affinity",
+                                exynos4210_calc_affinity(n), &error_abort);
+        object_property_set_int(cpuobj, "reset-cbar",
+                                EXYNOS4210_SMP_PRIVATE_BASE_ADDR,
+                                &error_abort);
         qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
     }
 
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index f5418c8c12..b4ddceae45 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -239,14 +239,12 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
             { FSL_IMX25_ESDHC2_ADDR, FSL_IMX25_ESDHC2_IRQ },
         };
 
-        object_property_set_uint(OBJECT(&s->esdhc[i]), 2, "sd-spec-version",
-                                 &error_abort);
-        object_property_set_uint(OBJECT(&s->esdhc[i]), IMX25_ESDHC_CAPABILITIES,
-                                 "capareg",
-                                 &error_abort);
-        object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
-                                 "vendor",
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "sd-spec-version", 2,
                                  &error_abort);
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "capareg",
+                                 IMX25_ESDHC_CAPABILITIES, &error_abort);
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "vendor",
+                                 SDHCI_VENDOR_IMX, &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
@@ -274,7 +272,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
     }
 
     /* Watchdog */
-    object_property_set_bool(OBJECT(&s->wdt), true, "pretimeout-support",
+    object_property_set_bool(OBJECT(&s->wdt), "pretimeout-support", true,
                              &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_abort);
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt), 0, FSL_IMX25_WDT_ADDR);
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
index 8326f5ff81..0983998bb4 100644
--- a/hw/arm/fsl-imx31.c
+++ b/hw/arm/fsl-imx31.c
@@ -172,7 +172,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
             { FSL_IMX31_GPIO3_ADDR, FSL_IMX31_GPIO3_IRQ }
         };
 
-        object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
+        object_property_set_bool(OBJECT(&s->gpio[i]), "has-edge-sel", false,
                                  &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
index 4c2da277ec..0bc9f0b60d 100644
--- a/hw/arm/fsl-imx6.c
+++ b/hw/arm/fsl-imx6.c
@@ -120,14 +120,14 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 
         /* On uniprocessor, the CBAR is set to 0 */
         if (smp_cpus > 1) {
-            object_property_set_int(OBJECT(&s->cpu[i]), FSL_IMX6_A9MPCORE_ADDR,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(OBJECT(&s->cpu[i]), "reset-cbar",
+                                    FSL_IMX6_A9MPCORE_ADDR, &error_abort);
         }
 
         /* All CPU but CPU 0 start in power off mode */
         if (i) {
-            object_property_set_bool(OBJECT(&s->cpu[i]), true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(OBJECT(&s->cpu[i]), "start-powered-off",
+                                     true, &error_abort);
         }
 
         if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
@@ -135,12 +135,11 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         }
     }
 
-    object_property_set_int(OBJECT(&s->a9mpcore), smp_cpus, "num-cpu",
+    object_property_set_int(OBJECT(&s->a9mpcore), "num-cpu", smp_cpus,
                             &error_abort);
 
-    object_property_set_int(OBJECT(&s->a9mpcore),
-                            FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
-                            &error_abort);
+    object_property_set_int(OBJECT(&s->a9mpcore), "num-irq",
+                            FSL_IMX6_MAX_IRQ + GIC_INTERNAL, &error_abort);
 
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
         return;
@@ -287,10 +286,10 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             },
         };
 
-        object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-edge-sel",
-                                 &error_abort);
-        object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
+        object_property_set_bool(OBJECT(&s->gpio[i]), "has-edge-sel", true,
                                  &error_abort);
+        object_property_set_bool(OBJECT(&s->gpio[i]), "has-upper-pin-irq",
+                                 true, &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
             return;
         }
@@ -317,14 +316,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
         };
 
         /* UHS-I SDIO3.0 SDR104 1.8V ADMA */
-        object_property_set_uint(OBJECT(&s->esdhc[i]), 3, "sd-spec-version",
-                                 &error_abort);
-        object_property_set_uint(OBJECT(&s->esdhc[i]), IMX6_ESDHC_CAPABILITIES,
-                                 "capareg",
-                                 &error_abort);
-        object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
-                                 "vendor",
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "sd-spec-version", 3,
                                  &error_abort);
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "capareg",
+                                 IMX6_ESDHC_CAPABILITIES, &error_abort);
+        object_property_set_uint(OBJECT(&s->esdhc[i]), "vendor",
+                                 SDHCI_VENDOR_IMX, &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
             return;
         }
@@ -405,8 +402,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
             FSL_IMX6_WDOG2_IRQ,
         };
 
-        object_property_set_bool(OBJECT(&s->wdt[i]), true, "pretimeout-support",
-                                 &error_abort);
+        object_property_set_bool(OBJECT(&s->wdt[i]), "pretimeout-support",
+                                 true, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &error_abort);
 
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX6_WDOGn_ADDR[i]);
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
index 6446034711..12493c125b 100644
--- a/hw/arm/fsl-imx6ul.c
+++ b/hw/arm/fsl-imx6ul.c
@@ -166,17 +166,16 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    object_property_set_int(OBJECT(&s->cpu), QEMU_PSCI_CONDUIT_SMC,
-                            "psci-conduit", &error_abort);
+    object_property_set_int(OBJECT(&s->cpu), "psci-conduit",
+                            QEMU_PSCI_CONDUIT_SMC, &error_abort);
     qdev_realize(DEVICE(&s->cpu), NULL, &error_abort);
 
     /*
      * A7MPCORE
      */
-    object_property_set_int(OBJECT(&s->a7mpcore), 1, "num-cpu", &error_abort);
-    object_property_set_int(OBJECT(&s->a7mpcore),
-                            FSL_IMX6UL_MAX_IRQ + GIC_INTERNAL,
-                            "num-irq", &error_abort);
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", 1, &error_abort);
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
+                            FSL_IMX6UL_MAX_IRQ + GIC_INTERNAL, &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, FSL_IMX6UL_A7MPCORE_ADDR);
 
@@ -427,9 +426,8 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
             FSL_IMX6UL_ENET2_TIMER_IRQ,
         };
 
-        object_property_set_uint(OBJECT(&s->eth[i]),
-                                 FSL_IMX6UL_ETH_NUM_TX_RINGS,
-                                 "tx-ring-num", &error_abort);
+        object_property_set_uint(OBJECT(&s->eth[i]), "tx-ring-num",
+                                 FSL_IMX6UL_ETH_NUM_TX_RINGS, &error_abort);
         qdev_set_nic_properties(DEVICE(&s->eth[i]), &nd_table[i]);
         sysbus_realize(SYS_BUS_DEVICE(&s->eth[i]), &error_abort);
 
@@ -479,8 +477,8 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
             FSL_IMX6UL_USDHC2_IRQ,
         };
 
-        object_property_set_uint(OBJECT(&s->usdhc[i]), SDHCI_VENDOR_IMX,
-                                        "vendor", &error_abort);
+        object_property_set_uint(OBJECT(&s->usdhc[i]), "vendor",
+                                 SDHCI_VENDOR_IMX, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(&s->usdhc[i]), &error_abort);
 
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
@@ -512,8 +510,8 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
             FSL_IMX6UL_WDOG3_IRQ,
         };
 
-        object_property_set_bool(OBJECT(&s->wdt[i]), true, "pretimeout-support",
-                                 &error_abort);
+        object_property_set_bool(OBJECT(&s->wdt[i]), "pretimeout-support",
+                                 true, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &error_abort);
 
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
index b49d895a41..fad637d328 100644
--- a/hw/arm/fsl-imx7.c
+++ b/hw/arm/fsl-imx7.c
@@ -159,19 +159,19 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < smp_cpus; i++) {
         o = OBJECT(&s->cpu[i]);
 
-        object_property_set_int(o, QEMU_PSCI_CONDUIT_SMC,
-                                "psci-conduit", &error_abort);
+        object_property_set_int(o, "psci-conduit", QEMU_PSCI_CONDUIT_SMC,
+                                &error_abort);
 
         /* On uniprocessor, the CBAR is set to 0 */
         if (smp_cpus > 1) {
-            object_property_set_int(o, FSL_IMX7_A7MPCORE_ADDR,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(o, "reset-cbar", FSL_IMX7_A7MPCORE_ADDR,
+                                    &error_abort);
         }
 
         if (i) {
             /* Secondary CPUs start in PSCI powered-down state */
-            object_property_set_bool(o, true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(o, "start-powered-off", true,
+                                     &error_abort);
         }
 
         qdev_realize(DEVICE(o), NULL, &error_abort);
@@ -180,11 +180,10 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
     /*
      * A7MPCORE
      */
-    object_property_set_int(OBJECT(&s->a7mpcore), smp_cpus, "num-cpu",
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", smp_cpus,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->a7mpcore),
-                            FSL_IMX7_MAX_IRQ + GIC_INTERNAL,
-                            "num-irq", &error_abort);
+    object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
+                            FSL_IMX7_MAX_IRQ + GIC_INTERNAL, &error_abort);
 
     sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, FSL_IMX7_A7MPCORE_ADDR);
@@ -364,8 +363,8 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
             FSL_IMX7_ENET2_ADDR,
         };
 
-        object_property_set_uint(OBJECT(&s->eth[i]), FSL_IMX7_ETH_NUM_TX_RINGS,
-                                 "tx-ring-num", &error_abort);
+        object_property_set_uint(OBJECT(&s->eth[i]), "tx-ring-num",
+                                 FSL_IMX7_ETH_NUM_TX_RINGS, &error_abort);
         qdev_set_nic_properties(DEVICE(&s->eth[i]), &nd_table[i]);
         sysbus_realize(SYS_BUS_DEVICE(&s->eth[i]), &error_abort);
 
@@ -393,8 +392,8 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
             FSL_IMX7_USDHC3_IRQ,
         };
 
-        object_property_set_uint(OBJECT(&s->usdhc[i]), SDHCI_VENDOR_IMX,
-                                 "vendor", &error_abort);
+        object_property_set_uint(OBJECT(&s->usdhc[i]), "vendor",
+                                 SDHCI_VENDOR_IMX, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(&s->usdhc[i]), &error_abort);
 
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->usdhc[i]), 0,
@@ -432,8 +431,8 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
             FSL_IMX7_WDOG4_IRQ,
         };
 
-        object_property_set_bool(OBJECT(&s->wdt[i]), true, "pretimeout-support",
-                                 &error_abort);
+        object_property_set_bool(OBJECT(&s->wdt[i]), "pretimeout-support",
+                                 true, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &error_abort);
 
         sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, FSL_IMX7_WDOGn_ADDR[i]);
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index c7ef48ecde..c96f2ab9cf 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -267,18 +267,18 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
         cpuobj = object_new(machine->cpu_type);
         cpu = ARM_CPU(cpuobj);
 
-        object_property_set_int(cpuobj, QEMU_PSCI_CONDUIT_SMC,
-                                "psci-conduit", &error_abort);
+        object_property_set_int(cpuobj, "psci-conduit", QEMU_PSCI_CONDUIT_SMC,
+                                &error_abort);
 
         if (n) {
             /* Secondary CPUs start in PSCI powered-down state */
-            object_property_set_bool(cpuobj, true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(cpuobj, "start-powered-off", true,
+                                     &error_abort);
         }
 
         if (object_property_find(cpuobj, "reset-cbar", NULL)) {
-            object_property_set_int(cpuobj, MPCORE_PERIPHBASE,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(cpuobj, "reset-cbar", MPCORE_PERIPHBASE,
+                                    &error_abort);
         }
         qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
         cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ);
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index b11a846355..f304c2b4f0 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -604,7 +604,7 @@ static void integratorcp_init(MachineState *machine)
      * realization.
      */
     if (object_property_find(cpuobj, "has_el3", NULL)) {
-        object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
+        object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
     }
 
     qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
index 8fe42c9d6a..a91acab1cb 100644
--- a/hw/arm/microbit.c
+++ b/hw/arm/microbit.c
@@ -40,8 +40,8 @@ static void microbit_init(MachineState *machine)
     object_initialize_child(OBJECT(machine), "nrf51", &s->nrf51,
                             TYPE_NRF51_SOC);
     qdev_prop_set_chr(DEVICE(&s->nrf51), "serial0", serial_hd(0));
-    object_property_set_link(OBJECT(&s->nrf51), OBJECT(system_memory),
-                             "memory", &error_fatal);
+    object_property_set_link(OBJECT(&s->nrf51), "memory",
+                             OBJECT(system_memory), &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(&s->nrf51), &error_fatal);
 
     /*
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 8155c35418..79c17fce96 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -264,8 +264,8 @@ static MemoryRegion *make_mpc(MPS2TZMachineState *mms, void *opaque,
     memory_region_init_ram(ssram, NULL, name, ramsize[i], &error_fatal);
 
     object_initialize_child(OBJECT(mms), mpcname, mpc, TYPE_TZ_MPC);
-    object_property_set_link(OBJECT(mpc), OBJECT(ssram),
-                             "downstream", &error_fatal);
+    object_property_set_link(OBJECT(mpc), "downstream", OBJECT(ssram),
+                             &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(mpc), &error_fatal);
     /* Map the upstream end of the MPC into system memory */
     upstream = sysbus_mmio_get_region(SYS_BUS_DEVICE(mpc), 1);
@@ -307,10 +307,9 @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
      */
     object_initialize_child(OBJECT(mms), mscname, msc, TYPE_TZ_MSC);
     msc_downstream = sysbus_mmio_get_region(SYS_BUS_DEVICE(&mms->iotkit), 0);
-    object_property_set_link(OBJECT(msc), OBJECT(msc_downstream),
-                             "downstream", &error_fatal);
-    object_property_set_link(OBJECT(msc), OBJECT(mms),
-                             "idau", &error_fatal);
+    object_property_set_link(OBJECT(msc), "downstream",
+                             OBJECT(msc_downstream), &error_fatal);
+    object_property_set_link(OBJECT(msc), "idau", OBJECT(mms), &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(msc), &error_fatal);
 
     qdev_connect_gpio_out_named(DEVICE(msc), "irq", 0,
@@ -329,8 +328,8 @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
     msc_upstream = sysbus_mmio_get_region(SYS_BUS_DEVICE(msc), 0);
 
     object_initialize_child(OBJECT(mms), name, dma, TYPE_PL081);
-    object_property_set_link(OBJECT(dma), OBJECT(msc_upstream),
-                             "downstream", &error_fatal);
+    object_property_set_link(OBJECT(dma), "downstream", OBJECT(msc_upstream),
+                             &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(dma), &error_fatal);
 
     s = SYS_BUS_DEVICE(dma);
@@ -391,8 +390,8 @@ static void mps2tz_common_init(MachineState *machine)
     object_initialize_child(OBJECT(machine), TYPE_IOTKIT, &mms->iotkit,
                             mmc->armsse_type);
     iotkitdev = DEVICE(&mms->iotkit);
-    object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
-                             "memory", &error_abort);
+    object_property_set_link(OBJECT(&mms->iotkit), "memory",
+                             OBJECT(system_memory), &error_abort);
     qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
     qdev_prop_set_uint32(iotkitdev, "MAINCLK", SYSCLK_FRQ);
     sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
@@ -412,7 +411,7 @@ static void mps2tz_common_init(MachineState *machine)
                                                NULL);
             g_free(name);
 
-            object_property_set_int(OBJECT(splitter), 2, "num-lines",
+            object_property_set_int(OBJECT(splitter), "num-lines", 2,
                                     &error_fatal);
             qdev_realize(DEVICE(splitter), NULL, &error_fatal);
             qdev_connect_gpio_out(DEVICE(splitter), 0,
@@ -429,9 +428,9 @@ static void mps2tz_common_init(MachineState *machine)
      */
     object_initialize_child(OBJECT(machine), "sec-resp-splitter",
                             &mms->sec_resp_splitter, TYPE_SPLIT_IRQ);
-    object_property_set_int(OBJECT(&mms->sec_resp_splitter),
+    object_property_set_int(OBJECT(&mms->sec_resp_splitter), "num-lines",
                             ARRAY_SIZE(mms->ppc) + ARRAY_SIZE(mms->msc),
-                            "num-lines", &error_fatal);
+                            &error_fatal);
     qdev_realize(DEVICE(&mms->sec_resp_splitter), NULL, &error_fatal);
     dev_splitter = DEVICE(&mms->sec_resp_splitter);
     qdev_connect_gpio_out_named(iotkitdev, "sec_resp_cfg", 0,
@@ -462,7 +461,7 @@ static void mps2tz_common_init(MachineState *machine)
      */
     object_initialize_child(OBJECT(mms), "uart-irq-orgate",
                             &mms->uart_irq_orgate, TYPE_OR_IRQ);
-    object_property_set_int(OBJECT(&mms->uart_irq_orgate), 10, "num-lines",
+    object_property_set_int(OBJECT(&mms->uart_irq_orgate), "num-lines", 10,
                             &error_fatal);
     qdev_realize(DEVICE(&mms->uart_irq_orgate), NULL, &error_fatal);
     qdev_connect_gpio_out(DEVICE(&mms->uart_irq_orgate), 0,
@@ -555,8 +554,8 @@ static void mps2tz_common_init(MachineState *machine)
 
             mr = pinfo->devfn(mms, pinfo->opaque, pinfo->name, pinfo->size);
             portname = g_strdup_printf("port[%d]", port);
-            object_property_set_link(OBJECT(ppc), OBJECT(mr),
-                                     portname, &error_fatal);
+            object_property_set_link(OBJECT(ppc), portname, OBJECT(mr),
+                                     &error_fatal);
             g_free(portname);
         }
 
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index daa55f730b..467244a9c4 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -194,8 +194,8 @@ static void mps2_common_init(MachineState *machine)
     }
     qdev_prop_set_string(armv7m, "cpu-type", machine->cpu_type);
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
-    object_property_set_link(OBJECT(&mms->armv7m), OBJECT(system_memory),
-                             "memory", &error_abort);
+    object_property_set_link(OBJECT(&mms->armv7m), "memory",
+                             OBJECT(system_memory), &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&mms->armv7m), &error_fatal);
 
     create_unimplemented_device("zbtsmram mirror", 0x00400000, 0x00400000);
@@ -228,7 +228,7 @@ static void mps2_common_init(MachineState *machine)
         int i;
 
         orgate = object_new(TYPE_OR_IRQ);
-        object_property_set_int(orgate, 6, "num-lines", &error_fatal);
+        object_property_set_int(orgate, "num-lines", 6, &error_fatal);
         qdev_realize(DEVICE(orgate), NULL, &error_fatal);
         orgate_dev = DEVICE(orgate);
         qdev_connect_gpio_out(orgate_dev, 0, qdev_get_gpio_in(armv7m, 12));
@@ -265,7 +265,7 @@ static void mps2_common_init(MachineState *machine)
         int i;
 
         orgate = object_new(TYPE_OR_IRQ);
-        object_property_set_int(orgate, 10, "num-lines", &error_fatal);
+        object_property_set_int(orgate, "num-lines", 10, &error_fatal);
         qdev_realize(DEVICE(orgate), NULL, &error_fatal);
         orgate_dev = DEVICE(orgate);
         qdev_connect_gpio_out(orgate_dev, 0, qdev_get_gpio_in(armv7m, 12));
@@ -280,7 +280,7 @@ static void mps2_common_init(MachineState *machine)
             DeviceState *txrx_orgate_dev;
 
             txrx_orgate = object_new(TYPE_OR_IRQ);
-            object_property_set_int(txrx_orgate, 2, "num-lines", &error_fatal);
+            object_property_set_int(txrx_orgate, "num-lines", 2, &error_fatal);
             qdev_realize(DEVICE(txrx_orgate), NULL, &error_fatal);
             txrx_orgate_dev = DEVICE(txrx_orgate);
             qdev_connect_gpio_out(txrx_orgate_dev, 0,
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
index b6143fba92..16bb7c9916 100644
--- a/hw/arm/msf2-soc.c
+++ b/hw/arm/msf2-soc.c
@@ -122,8 +122,8 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_uint32(armv7m, "num-irq", 81);
     qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
-    object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
-                                     "memory", &error_abort);
+    object_property_set_link(OBJECT(&s->armv7m), "memory",
+                             OBJECT(get_system_memory()), &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
@@ -188,8 +188,8 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
     }
 
     dev = DEVICE(&s->emac);
-    object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
-                             "ahb-bus", &error_abort);
+    object_property_set_link(OBJECT(&s->emac), "ahb-bus",
+                             OBJECT(get_system_memory()), &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
         return;
     }
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
index 34376328fc..4bc737f93b 100644
--- a/hw/arm/musca.c
+++ b/hw/arm/musca.c
@@ -256,8 +256,8 @@ static MemoryRegion *make_mpc(MuscaMachineState *mms, void *opaque,
     }
 
     object_initialize_child(OBJECT(mms), mpcname, mpc, TYPE_TZ_MPC);
-    object_property_set_link(OBJECT(mpc), OBJECT(downstream),
-                             "downstream", &error_fatal);
+    object_property_set_link(OBJECT(mpc), "downstream", OBJECT(downstream),
+                             &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(mpc), &error_fatal);
     /* Map the upstream end of the MPC into system memory */
     upstream = sysbus_mmio_get_region(SYS_BUS_DEVICE(mpc), 1);
@@ -374,8 +374,8 @@ static void musca_init(MachineState *machine)
     object_initialize_child(OBJECT(machine), "sse-200", &mms->sse,
                             TYPE_SSE200);
     ssedev = DEVICE(&mms->sse);
-    object_property_set_link(OBJECT(&mms->sse), OBJECT(system_memory),
-                             "memory", &error_fatal);
+    object_property_set_link(OBJECT(&mms->sse), "memory",
+                             OBJECT(system_memory), &error_fatal);
     qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs);
     qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
     qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
@@ -403,7 +403,7 @@ static void musca_init(MachineState *machine)
                                            &error_fatal, NULL);
         g_free(name);
 
-        object_property_set_int(OBJECT(splitter), 2, "num-lines",
+        object_property_set_int(OBJECT(splitter), "num-lines", 2,
                                 &error_fatal);
         qdev_realize(DEVICE(splitter), NULL, &error_fatal);
         qdev_connect_gpio_out(DEVICE(splitter), 0,
@@ -422,8 +422,8 @@ static void musca_init(MachineState *machine)
                                        sizeof(mms->sec_resp_splitter),
                                        TYPE_SPLIT_IRQ, &error_fatal, NULL);
 
-    object_property_set_int(OBJECT(&mms->sec_resp_splitter),
-                            ARRAY_SIZE(mms->ppc), "num-lines", &error_fatal);
+    object_property_set_int(OBJECT(&mms->sec_resp_splitter), "num-lines",
+                            ARRAY_SIZE(mms->ppc), &error_fatal);
     qdev_realize(DEVICE(&mms->sec_resp_splitter), NULL, &error_fatal);
     dev_splitter = DEVICE(&mms->sec_resp_splitter);
     qdev_connect_gpio_out_named(ssedev, "sec_resp_cfg", 0,
@@ -541,8 +541,8 @@ static void musca_init(MachineState *machine)
 
             mr = pinfo->devfn(mms, pinfo->opaque, pinfo->name, pinfo->size);
             portname = g_strdup_printf("port[%d]", port);
-            object_property_set_link(OBJECT(ppc), OBJECT(mr),
-                                     portname, &error_fatal);
+            object_property_set_link(OBJECT(ppc), portname, OBJECT(mr),
+                                     &error_fatal);
             g_free(portname);
         }
 
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 394a3345bd..ff9a7c8cc6 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1690,8 +1690,8 @@ static void musicpal_init(MachineState *machine)
     wm8750_dev = i2c_create_slave(i2c, TYPE_WM8750, MP_WM_ADDR);
     dev = qdev_new(TYPE_MV88W8618_AUDIO);
     s = SYS_BUS_DEVICE(dev);
-    object_property_set_link(OBJECT(dev), OBJECT(wm8750_dev),
-                             "wm8750", NULL);
+    object_property_set_link(OBJECT(dev), "wm8750", OBJECT(wm8750_dev),
+                             NULL);
     sysbus_realize_and_unref(s, &error_fatal);
     sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
     sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index a398bdfab8..a5f8806577 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -65,7 +65,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
         return;
     }
 
-    object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
+    object_property_set_link(OBJECT(&s->cpu), "memory", OBJECT(&s->container),
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
         return;
@@ -103,7 +103,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
                        BASE_TO_IRQ(NRF51_RNG_BASE)));
 
     /* UICR, FICR, NVMC, FLASH */
-    object_property_set_uint(OBJECT(&s->nvm), s->flash_size, "flash-size",
+    object_property_set_uint(OBJECT(&s->nvm), "flash-size", s->flash_size,
                              &err);
     if (err) {
         error_propagate(errp, err);
@@ -136,7 +136,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
 
     /* TIMER */
     for (i = 0; i < NRF51_NUM_TIMERS; i++) {
-        object_property_set_uint(OBJECT(&s->timer[i]), i, "id", &err);
+        object_property_set_uint(OBJECT(&s->timer[i]), "id", i, &err);
         if (err) {
             error_propagate(errp, err);
             return;
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
index 843dcbbd62..1679468232 100644
--- a/hw/arm/orangepi.c
+++ b/hw/arm/orangepi.c
@@ -63,9 +63,8 @@ static void orangepi_init(MachineState *machine)
     object_unref(OBJECT(h3));
 
     /* Setup timer properties */
-    object_property_set_int(OBJECT(h3), 32768, "clk0-freq",
-                            &error_abort);
-    object_property_set_int(OBJECT(h3), 24 * 1000 * 1000, "clk1-freq",
+    object_property_set_int(OBJECT(h3), "clk0-freq", 32768, &error_abort);
+    object_property_set_int(OBJECT(h3), "clk1-freq", 24 * 1000 * 1000,
                             &error_abort);
 
     /* Setup SID properties. Currently using a default fixed SID identifier. */
@@ -77,12 +76,12 @@ static void orangepi_init(MachineState *machine)
     }
 
     /* Setup EMAC properties */
-    object_property_set_int(OBJECT(&h3->emac), 1, "phy-addr", &error_abort);
+    object_property_set_int(OBJECT(&h3->emac), "phy-addr", 1, &error_abort);
 
     /* DRAMC */
-    object_property_set_uint(OBJECT(h3), h3->memmap[AW_H3_SDRAM],
-                             "ram-addr", &error_abort);
-    object_property_set_int(OBJECT(h3), machine->ram_size / MiB, "ram-size",
+    object_property_set_uint(OBJECT(h3), "ram-addr", h3->memmap[AW_H3_SDRAM],
+                             &error_abort);
+    object_property_set_int(OBJECT(h3), "ram-size", machine->ram_size / MiB,
                             &error_abort);
 
     /* Mark H3 object realized */
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 09bf02ec9c..b2d6c9688f 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -285,7 +285,7 @@ static void raspi_machine_init(MachineState *machine)
     object_initialize_child(OBJECT(machine), "soc", &s->soc,
                             board_soc_type(board_rev));
     object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(machine->ram));
-    object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
+    object_property_set_int(OBJECT(&s->soc), "board-rev", board_rev,
                             &error_abort);
     qdev_realize(DEVICE(&s->soc), NULL, &error_abort);
 
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index f3c00fe00c..1a80c47ea7 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -106,11 +106,11 @@ static void realview_init(MachineState *machine,
          * before realization.
          */
         if (object_property_find(cpuobj, "has_el3", NULL)) {
-            object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
+            object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
         }
 
         if (is_pb && is_mpcore) {
-            object_property_set_int(cpuobj, periphbase, "reset-cbar",
+            object_property_set_int(cpuobj, "reset-cbar", periphbase,
                                     &error_fatal);
         }
 
@@ -204,7 +204,7 @@ static void realview_init(MachineState *machine,
 
     /* DMA controller is optional, apparently.  */
     dev = qdev_new("pl081");
-    object_property_set_link(OBJECT(dev), OBJECT(sysmem), "downstream",
+    object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
                              &error_fatal);
     busdev = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(busdev, &error_fatal);
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index e40c868a82..f030a416fd 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -499,7 +499,7 @@ static void create_smmu(const SBSAMachineState *sms, PCIBus *bus)
 
     dev = qdev_new("arm-smmuv3");
 
-    object_property_set_link(OBJECT(dev), OBJECT(bus), "primary-bus",
+    object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus),
                              &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
@@ -659,8 +659,8 @@ static void sbsa_ref_init(MachineState *machine)
         }
 
         cpuobj = object_new(possible_cpus->cpus[n].type);
-        object_property_set_int(cpuobj, possible_cpus->cpus[n].arch_id,
-                                "mp-affinity", NULL);
+        object_property_set_int(cpuobj, "mp-affinity",
+                                possible_cpus->cpus[n].arch_id, NULL);
 
         cs = CPU(cpuobj);
         cs->cpu_index = n;
@@ -669,16 +669,16 @@ static void sbsa_ref_init(MachineState *machine)
                           &error_fatal);
 
         if (object_property_find(cpuobj, "reset-cbar", NULL)) {
-            object_property_set_int(cpuobj,
+            object_property_set_int(cpuobj, "reset-cbar",
                                     sbsa_ref_memmap[SBSA_CPUPERIPHS].base,
-                                    "reset-cbar", &error_abort);
+                                    &error_abort);
         }
 
-        object_property_set_link(cpuobj, OBJECT(sysmem), "memory",
+        object_property_set_link(cpuobj, "memory", OBJECT(sysmem),
                                  &error_abort);
 
-        object_property_set_link(cpuobj, OBJECT(secure_sysmem),
-                                 "secure-memory", &error_abort);
+        object_property_set_link(cpuobj, "secure-memory",
+                                 OBJECT(secure_sysmem), &error_abort);
 
         qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
         object_unref(cpuobj);
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 97ef566c12..7156fb3ece 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1312,8 +1312,8 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
     qdev_prop_set_uint32(nvic, "num-irq", NUM_IRQ_LINES);
     qdev_prop_set_string(nvic, "cpu-type", ms->cpu_type);
     qdev_prop_set_bit(nvic, "enable-bitband", true);
-    object_property_set_link(OBJECT(nvic), OBJECT(get_system_memory()),
-                                     "memory", &error_abort);
+    object_property_set_link(OBJECT(nvic), "memory",
+                             OBJECT(get_system_memory()), &error_abort);
     /* This will exit with an error if the user passed us a bad cpu_type */
     sysbus_realize_and_unref(SYS_BUS_DEVICE(nvic), &error_fatal);
 
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
index 5b008722e5..a4f3344db2 100644
--- a/hw/arm/stm32f205_soc.c
+++ b/hw/arm/stm32f205_soc.c
@@ -104,8 +104,8 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_uint32(armv7m, "num-irq", 96);
     qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
-    object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
-                                     "memory", &error_abort);
+    object_property_set_link(OBJECT(&s->armv7m), "memory",
+                             OBJECT(get_system_memory()), &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
@@ -144,8 +144,8 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
     }
 
     /* ADC 1 to 3 */
-    object_property_set_int(OBJECT(s->adc_irqs), STM_NUM_ADCS,
-                            "num-lines", &error_abort);
+    object_property_set_int(OBJECT(s->adc_irqs), "num-lines", STM_NUM_ADCS,
+                            &error_abort);
     if (!qdev_realize(DEVICE(s->adc_irqs), NULL, errp)) {
         return;
     }
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index 48b7181665..282bc6f36c 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -116,8 +116,8 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     qdev_prop_set_uint32(armv7m, "num-irq", 96);
     qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
     qdev_prop_set_bit(armv7m, "enable-bitband", true);
-    object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
-                                     "memory", &error_abort);
+    object_property_set_link(OBJECT(&s->armv7m), "memory",
+                             OBJECT(system_memory), &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
         return;
     }
@@ -163,8 +163,8 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
         error_propagate(errp, err);
         return;
     }
-    object_property_set_int(OBJECT(&s->adc_irqs), STM_NUM_ADCS,
-                            "num-lines", &error_abort);
+    object_property_set_int(OBJECT(&s->adc_irqs), "num-lines", STM_NUM_ADCS,
+                            &error_abort);
     if (!qdev_realize(DEVICE(&s->adc_irqs), NULL, errp)) {
         return;
     }
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 2ebdcbd8ac..cccb8b14bc 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -212,7 +212,7 @@ static void versatile_init(MachineState *machine, int board_id)
      * realization.
      */
     if (object_property_find(cpuobj, "has_el3", NULL)) {
-        object_property_set_bool(cpuobj, false, "has_el3", &error_fatal);
+        object_property_set_bool(cpuobj, "has_el3", false, &error_fatal);
     }
 
     qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
@@ -287,7 +287,7 @@ static void versatile_init(MachineState *machine, int board_id)
     pl011_create(0x10009000, sic[6], serial_hd(3));
 
     dev = qdev_new("pl080");
-    object_property_set_link(OBJECT(dev), OBJECT(sysmem), "downstream",
+    object_property_set_link(OBJECT(dev), "downstream", OBJECT(sysmem),
                              &error_fatal);
     busdev = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(busdev, &error_fatal);
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 725d024c91..fe31b171a9 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -217,17 +217,17 @@ static void init_cpus(MachineState *ms, const char *cpu_type,
         Object *cpuobj = object_new(cpu_type);
 
         if (!secure) {
-            object_property_set_bool(cpuobj, false, "has_el3", NULL);
+            object_property_set_bool(cpuobj, "has_el3", false, NULL);
         }
         if (!virt) {
             if (object_property_find(cpuobj, "has_el2", NULL)) {
-                object_property_set_bool(cpuobj, false, "has_el2", NULL);
+                object_property_set_bool(cpuobj, "has_el2", false, NULL);
             }
         }
 
         if (object_property_find(cpuobj, "reset-cbar", NULL)) {
-            object_property_set_int(cpuobj, periphbase,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(cpuobj, "reset-cbar", periphbase,
+                                    &error_abort);
         }
         qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
     }
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 29b9d5b2e6..7d23f6e99d 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -594,7 +594,7 @@ static void create_its(VirtMachineState *vms)
 
     dev = qdev_new(itsclass);
 
-    object_property_set_link(OBJECT(dev), OBJECT(vms->gic), "parent-gicv3",
+    object_property_set_link(OBJECT(dev), "parent-gicv3", OBJECT(vms->gic),
                              &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
@@ -1173,7 +1173,7 @@ static void create_smmu(const VirtMachineState *vms,
 
     dev = qdev_new("arm-smmuv3");
 
-    object_property_set_link(OBJECT(dev), OBJECT(bus), "primary-bus",
+    object_property_set_link(OBJECT(dev), "primary-bus", OBJECT(bus),
                              &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
@@ -1766,8 +1766,8 @@ static void machvirt_init(MachineState *machine)
         }
 
         cpuobj = object_new(possible_cpus->cpus[n].type);
-        object_property_set_int(cpuobj, possible_cpus->cpus[n].arch_id,
-                                "mp-affinity", NULL);
+        object_property_set_int(cpuobj, "mp-affinity",
+                                possible_cpus->cpus[n].arch_id, NULL);
 
         cs = CPU(cpuobj);
         cs->cpu_index = n;
@@ -1778,43 +1778,44 @@ static void machvirt_init(MachineState *machine)
         aarch64 &= object_property_get_bool(cpuobj, "aarch64", NULL);
 
         if (!vms->secure) {
-            object_property_set_bool(cpuobj, false, "has_el3", NULL);
+            object_property_set_bool(cpuobj, "has_el3", false, NULL);
         }
 
         if (!vms->virt && object_property_find(cpuobj, "has_el2", NULL)) {
-            object_property_set_bool(cpuobj, false, "has_el2", NULL);
+            object_property_set_bool(cpuobj, "has_el2", false, NULL);
         }
 
         if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
-            object_property_set_int(cpuobj, vms->psci_conduit,
-                                    "psci-conduit", NULL);
+            object_property_set_int(cpuobj, "psci-conduit", vms->psci_conduit,
+                                    NULL);
 
             /* Secondary CPUs start in PSCI powered-down state */
             if (n > 0) {
-                object_property_set_bool(cpuobj, true,
-                                         "start-powered-off", NULL);
+                object_property_set_bool(cpuobj, "start-powered-off", true,
+                                         NULL);
             }
         }
 
         if (vmc->kvm_no_adjvtime &&
             object_property_find(cpuobj, "kvm-no-adjvtime", NULL)) {
-            object_property_set_bool(cpuobj, true, "kvm-no-adjvtime", NULL);
+            object_property_set_bool(cpuobj, "kvm-no-adjvtime", true, NULL);
         }
 
         if (vmc->no_pmu && object_property_find(cpuobj, "pmu", NULL)) {
-            object_property_set_bool(cpuobj, false, "pmu", NULL);
+            object_property_set_bool(cpuobj, "pmu", false, NULL);
         }
 
         if (object_property_find(cpuobj, "reset-cbar", NULL)) {
-            object_property_set_int(cpuobj, vms->memmap[VIRT_CPUPERIPHS].base,
-                                    "reset-cbar", &error_abort);
+            object_property_set_int(cpuobj, "reset-cbar",
+                                    vms->memmap[VIRT_CPUPERIPHS].base,
+                                    &error_abort);
         }
 
-        object_property_set_link(cpuobj, OBJECT(sysmem), "memory",
+        object_property_set_link(cpuobj, "memory", OBJECT(sysmem),
                                  &error_abort);
         if (vms->secure) {
-            object_property_set_link(cpuobj, OBJECT(secure_sysmem),
-                                     "secure-memory", &error_abort);
+            object_property_set_link(cpuobj, "secure-memory",
+                                     OBJECT(secure_sysmem), &error_abort);
         }
 
         qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index ed970273f3..32aa7323d9 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -196,12 +196,12 @@ static void zynq_init(MachineState *machine)
      * realization.
      */
     if (object_property_find(OBJECT(cpu), "has_el3", NULL)) {
-        object_property_set_bool(OBJECT(cpu), false, "has_el3", &error_fatal);
+        object_property_set_bool(OBJECT(cpu), "has_el3", false, &error_fatal);
     }
 
-    object_property_set_int(OBJECT(cpu), ZYNQ_BOARD_MIDR, "midr",
+    object_property_set_int(OBJECT(cpu), "midr", ZYNQ_BOARD_MIDR,
                             &error_fatal);
-    object_property_set_int(OBJECT(cpu), MPCORE_PERIPHBASE, "reset-cbar",
+    object_property_set_int(OBJECT(cpu), "reset-cbar", MPCORE_PERIPHBASE,
                             &error_fatal);
     qdev_realize(DEVICE(cpu), NULL, &error_fatal);
 
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index a3b1ce9c7c..4b3152ee77 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -502,10 +502,10 @@ static void versal_virt_init(MachineState *machine)
 
     object_initialize_child(OBJECT(machine), "xlnx-versal", &s->soc,
                             TYPE_XLNX_VERSAL);
-    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
-                             "ddr", &error_abort);
-    object_property_set_int(OBJECT(&s->soc), psci_conduit,
-                            "psci-conduit", &error_abort);
+    object_property_set_link(OBJECT(&s->soc), "ddr", OBJECT(machine->ram),
+                             &error_abort);
+    object_property_set_int(OBJECT(&s->soc), "psci-conduit", psci_conduit,
+                            &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal);
 
     fdt_create(s);
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
index fed9d07ca2..ead038b971 100644
--- a/hw/arm/xlnx-versal.c
+++ b/hw/arm/xlnx-versal.c
@@ -35,17 +35,17 @@ static void versal_create_apu_cpus(Versal *s)
         object_initialize_child(OBJECT(s), "apu-cpu[*]", &s->fpd.apu.cpu[i],
                                 XLNX_VERSAL_ACPU_TYPE);
         obj = OBJECT(&s->fpd.apu.cpu[i]);
-        object_property_set_int(obj, s->cfg.psci_conduit,
-                                "psci-conduit", &error_abort);
+        object_property_set_int(obj, "psci-conduit", s->cfg.psci_conduit,
+                                &error_abort);
         if (i) {
             /* Secondary CPUs start in PSCI powered-down state */
-            object_property_set_bool(obj, true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(obj, "start-powered-off", true,
+                                     &error_abort);
         }
 
-        object_property_set_int(obj, ARRAY_SIZE(s->fpd.apu.cpu),
-                                "core-count", &error_abort);
-        object_property_set_link(obj, OBJECT(&s->fpd.apu.mr), "memory",
+        object_property_set_int(obj, "core-count", ARRAY_SIZE(s->fpd.apu.cpu),
+                                &error_abort);
+        object_property_set_link(obj, "memory", OBJECT(&s->fpd.apu.mr),
                                  &error_abort);
         qdev_realize(DEVICE(obj), NULL, &error_fatal);
     }
@@ -164,11 +164,9 @@ static void versal_create_gems(Versal *s, qemu_irq *pic)
             qemu_check_nic_model(nd, "cadence_gem");
             qdev_set_nic_properties(dev, nd);
         }
-        object_property_set_int(OBJECT(dev),
-                                2, "num-priority-queues",
+        object_property_set_int(OBJECT(dev), "num-priority-queues", 2,
                                 &error_abort);
-        object_property_set_link(OBJECT(dev),
-                                 OBJECT(&s->mr_ps), "dma",
+        object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
                                  &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
 
@@ -192,7 +190,7 @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
         object_initialize_child(OBJECT(s), name, &s->lpd.iou.adma[i],
                                 TYPE_XLNX_ZDMA);
         dev = DEVICE(&s->lpd.iou.adma[i]);
-        object_property_set_int(OBJECT(dev), 128, "bus-width", &error_abort);
+        object_property_set_int(OBJECT(dev), "bus-width", 128, &error_abort);
         sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
 
         mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
@@ -217,11 +215,11 @@ static void versal_create_sds(Versal *s, qemu_irq *pic)
                                 TYPE_SYSBUS_SDHCI);
         dev = DEVICE(&s->pmc.iou.sd[i]);
 
-        object_property_set_uint(OBJECT(dev),
-                                 3, "sd-spec-version", &error_fatal);
-        object_property_set_uint(OBJECT(dev), SDHCI_CAPABILITIES, "capareg",
+        object_property_set_uint(OBJECT(dev), "sd-spec-version", 3,
                                  &error_fatal);
-        object_property_set_uint(OBJECT(dev), UHS_I, "uhs", &error_fatal);
+        object_property_set_uint(OBJECT(dev), "capareg", SDHCI_CAPABILITIES,
+                                 &error_fatal);
+        object_property_set_uint(OBJECT(dev), "uhs", UHS_I, &error_fatal);
         sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
 
         mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 77449759c6..5997262459 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -118,11 +118,11 @@ static void xlnx_zcu102_init(MachineState *machine)
 
     object_initialize_child(OBJECT(machine), "soc", &s->soc, TYPE_XLNX_ZYNQMP);
 
-    object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
-                         "ddr-ram", &error_abort);
-    object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
+    object_property_set_link(OBJECT(&s->soc), "ddr-ram", OBJECT(machine->ram),
+                             &error_abort);
+    object_property_set_bool(OBJECT(&s->soc), "secure", s->secure,
                              &error_fatal);
-    object_property_set_bool(OBJECT(&s->soc), s->virt, "virtualization",
+    object_property_set_bool(OBJECT(&s->soc), "virtualization", s->virt,
                              &error_fatal);
 
     qdev_realize(DEVICE(&s->soc), NULL, &error_fatal);
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 33e63a2c4e..48bbb5066e 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -199,14 +199,14 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
         name = object_get_canonical_path_component(OBJECT(&s->rpu_cpu[i]));
         if (strcmp(name, boot_cpu)) {
             /* Secondary CPUs start in PSCI powered-down state */
-            object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(OBJECT(&s->rpu_cpu[i]),
+                                     "start-powered-off", true, &error_abort);
         } else {
             s->boot_cpu_ptr = &s->rpu_cpu[i];
         }
         g_free(name);
 
-        object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
+        object_property_set_bool(OBJECT(&s->rpu_cpu[i]), "reset-hivecs", true,
                                  &error_abort);
         if (!qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, errp)) {
             return;
@@ -343,27 +343,27 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < num_apus; i++) {
         char *name;
 
-        object_property_set_int(OBJECT(&s->apu_cpu[i]), QEMU_PSCI_CONDUIT_SMC,
-                                "psci-conduit", &error_abort);
+        object_property_set_int(OBJECT(&s->apu_cpu[i]), "psci-conduit",
+                                QEMU_PSCI_CONDUIT_SMC, &error_abort);
 
         name = object_get_canonical_path_component(OBJECT(&s->apu_cpu[i]));
         if (strcmp(name, boot_cpu)) {
             /* Secondary CPUs start in PSCI powered-down state */
-            object_property_set_bool(OBJECT(&s->apu_cpu[i]), true,
-                                     "start-powered-off", &error_abort);
+            object_property_set_bool(OBJECT(&s->apu_cpu[i]),
+                                     "start-powered-off", true, &error_abort);
         } else {
             s->boot_cpu_ptr = &s->apu_cpu[i];
         }
         g_free(name);
 
-        object_property_set_bool(OBJECT(&s->apu_cpu[i]),
-                                 s->secure, "has_el3", NULL);
-        object_property_set_bool(OBJECT(&s->apu_cpu[i]),
-                                 s->virt, "has_el2", NULL);
-        object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR,
-                                "reset-cbar", &error_abort);
-        object_property_set_int(OBJECT(&s->apu_cpu[i]), num_apus,
-                                "core-count", &error_abort);
+        object_property_set_bool(OBJECT(&s->apu_cpu[i]), "has_el3", s->secure,
+                                 NULL);
+        object_property_set_bool(OBJECT(&s->apu_cpu[i]), "has_el2", s->virt,
+                                 NULL);
+        object_property_set_int(OBJECT(&s->apu_cpu[i]), "reset-cbar",
+                                GIC_BASE_ADDR, &error_abort);
+        object_property_set_int(OBJECT(&s->apu_cpu[i]), "core-count",
+                                num_apus, &error_abort);
         if (!qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, errp)) {
             return;
         }
@@ -459,9 +459,9 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
             qemu_check_nic_model(nd, TYPE_CADENCE_GEM);
             qdev_set_nic_properties(DEVICE(&s->gem[i]), nd);
         }
-        object_property_set_int(OBJECT(&s->gem[i]), GEM_REVISION, "revision",
+        object_property_set_int(OBJECT(&s->gem[i]), "revision", GEM_REVISION,
                                 &error_abort);
-        object_property_set_int(OBJECT(&s->gem[i]), 2, "num-priority-queues",
+        object_property_set_int(OBJECT(&s->gem[i]), "num-priority-queues", 2,
                                 &error_abort);
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
             return;
@@ -481,7 +481,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
                            gic_spi[uart_intr[i]]);
     }
 
-    object_property_set_int(OBJECT(&s->sata), SATA_NUM_PORTS, "num-ports",
+    object_property_set_int(OBJECT(&s->sata), "num-ports", SATA_NUM_PORTS,
                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
         return;
@@ -500,17 +500,17 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
          * - SDIO Specification Version 3.0
          * - eMMC Specification Version 4.51
          */
-        object_property_set_uint(sdhci, 3, "sd-spec-version", &err);
+        object_property_set_uint(sdhci, "sd-spec-version", 3, &err);
         if (err) {
             error_propagate(errp, err);
             return;
         }
-        object_property_set_uint(sdhci, SDHCI_CAPABILITIES, "capareg", &err);
+        object_property_set_uint(sdhci, "capareg", SDHCI_CAPABILITIES, &err);
         if (err) {
             error_propagate(errp, err);
             return;
         }
-        object_property_set_uint(sdhci, UHS_I, "uhs", &err);
+        object_property_set_uint(sdhci, "uhs", UHS_I, &err);
         if (err) {
             error_propagate(errp, err);
             return;
@@ -574,7 +574,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), errp)) {
         return;
     }
-    object_property_set_link(OBJECT(&s->dp), OBJECT(&s->dpdma), "dpdma",
+    object_property_set_link(OBJECT(&s->dp), "dpdma", OBJECT(&s->dpdma),
                              &error_abort);
     sysbus_mmio_map(SYS_BUS_DEVICE(&s->dpdma), 0, DPDMA_ADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->dpdma), 0, gic_spi[DPDMA_IRQ]);
@@ -592,7 +592,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0, gic_spi[RTC_IRQ]);
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
-        object_property_set_uint(OBJECT(&s->gdma[i]), 128, "bus-width", &err);
+        object_property_set_uint(OBJECT(&s->gdma[i]), "bus-width", 128, &err);
         if (err) {
             error_propagate(errp, err);
             return;
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index d45758937a..1b323b44d9 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -931,21 +931,20 @@ static void xen_block_device_create(XenBackendInstance *backend,
     xendev = XEN_DEVICE(qdev_new(type));
     blockdev = XEN_BLOCK_DEVICE(xendev);
 
-    object_property_set_str(OBJECT(xendev), vdev, "vdev", &local_err);
+    object_property_set_str(OBJECT(xendev), "vdev", vdev, &local_err);
     if (local_err) {
         error_propagate_prepend(errp, local_err, "failed to set 'vdev': ");
         goto fail;
     }
 
-    object_property_set_str(OBJECT(xendev),
-                            xen_block_drive_get_node_name(drive), "drive",
-                            &local_err);
+    object_property_set_str(OBJECT(xendev), "drive",
+                            xen_block_drive_get_node_name(drive), &local_err);
     if (local_err) {
         error_propagate_prepend(errp, local_err, "failed to set 'drive': ");
         goto fail;
     }
 
-    object_property_set_str(OBJECT(xendev), iothread->id, "iothread",
+    object_property_set_str(OBJECT(xendev), "iothread", iothread->id,
                             &local_err);
     if (local_err) {
         error_propagate_prepend(errp, local_err,
diff --git a/hw/core/bus.c b/hw/core/bus.c
index 544dd8a6fa..00d1d31762 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -25,8 +25,8 @@
 
 void qbus_set_hotplug_handler(BusState *bus, Object *handler)
 {
-    object_property_set_link(OBJECT(bus), handler,
-                             QDEV_HOTPLUG_HANDLER_PROPERTY, &error_abort);
+    object_property_set_link(OBJECT(bus), QDEV_HOTPLUG_HANDLER_PROPERTY,
+                             handler, &error_abort);
 }
 
 void qbus_set_bus_hotplug_handler(BusState *bus)
@@ -168,14 +168,14 @@ bool qbus_realize(BusState *bus, Error **errp)
 {
     Error *err = NULL;
 
-    object_property_set_bool(OBJECT(bus), true, "realized", &err);
+    object_property_set_bool(OBJECT(bus), "realized", true, &err);
     error_propagate(errp, err);
     return !err;
 }
 
 void qbus_unrealize(BusState *bus)
 {
-    object_property_set_bool(OBJECT(bus), false, "realized", &error_abort);
+    object_property_set_bool(OBJECT(bus), "realized", false, &error_abort);
 }
 
 static bool bus_get_realized(Object *obj, Error **errp)
diff --git a/hw/core/numa.c b/hw/core/numa.c
index 118803a0e8..2d076f084f 100644
--- a/hw/core/numa.c
+++ b/hw/core/numa.c
@@ -785,8 +785,8 @@ void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
         /* due to bug in libvirt, it doesn't pass node-id from props on
          * device_add as expected, so we have to fix it up here */
         if (slot->props.has_node_id) {
-            object_property_set_int(OBJECT(dev), slot->props.node_id,
-                                    "node-id", errp);
+            object_property_set_int(OBJECT(dev), "node-id",
+                                    slot->props.node_id, errp);
         }
     } else if (node_id != slot->props.node_id) {
         error_setg(errp, "invalid node-id, must be %"PRId64,
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index f69e2858d1..abd851656f 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -428,7 +428,7 @@ void qdev_prop_set_drive_err(DeviceState *dev, const char *name,
         }
     }
 
-    object_property_set_str(OBJECT(dev), ref, name, errp);
+    object_property_set_str(OBJECT(dev), name, ref, errp);
 }
 
 void qdev_prop_set_drive(DeviceState *dev, const char *name,
@@ -441,16 +441,16 @@ void qdev_prop_set_chr(DeviceState *dev, const char *name,
                        Chardev *value)
 {
     assert(!value || value->label);
-    object_property_set_str(OBJECT(dev),
-                            value ? value->label : "", name, &error_abort);
+    object_property_set_str(OBJECT(dev), name, value ? value->label : "",
+                            &error_abort);
 }
 
 void qdev_prop_set_netdev(DeviceState *dev, const char *name,
                           NetClientState *value)
 {
     assert(!value || value->name);
-    object_property_set_str(OBJECT(dev),
-                            value ? value->name : "", name, &error_abort);
+    object_property_set_str(OBJECT(dev), name, value ? value->name : "",
+                            &error_abort);
 }
 
 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 11e7d27ccc..e1ad147339 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1149,37 +1149,37 @@ void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
 
 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
 {
-    object_property_set_bool(OBJECT(dev), value, name, &error_abort);
+    object_property_set_bool(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
 {
-    object_property_set_int(OBJECT(dev), value, name, &error_abort);
+    object_property_set_int(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
 {
-    object_property_set_int(OBJECT(dev), value, name, &error_abort);
+    object_property_set_int(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
 {
-    object_property_set_int(OBJECT(dev), value, name, &error_abort);
+    object_property_set_int(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
 {
-    object_property_set_int(OBJECT(dev), value, name, &error_abort);
+    object_property_set_int(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
 {
-    object_property_set_int(OBJECT(dev), value, name, &error_abort);
+    object_property_set_int(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
 {
-    object_property_set_str(OBJECT(dev), value, name, &error_abort);
+    object_property_set_str(OBJECT(dev), name, value, &error_abort);
 }
 
 void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
@@ -1189,7 +1189,7 @@ void qdev_prop_set_macaddr(DeviceState *dev, const char *name,
     snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
              value[0], value[1], value[2], value[3], value[4], value[5]);
 
-    object_property_set_str(OBJECT(dev), str, name, &error_abort);
+    object_property_set_str(OBJECT(dev), name, str, &error_abort);
 }
 
 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
@@ -1197,9 +1197,9 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
     Property *prop;
 
     prop = qdev_prop_find(dev, name);
-    object_property_set_str(OBJECT(dev),
+    object_property_set_str(OBJECT(dev), name,
                             qapi_enum_lookup(prop->info->enum_table, value),
-                            name, &error_abort);
+                            &error_abort);
 }
 
 static GPtrArray *global_props(void)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 2131c7f951..8de99f6ba5 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -396,7 +396,7 @@ bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
         assert(!DEVICE_GET_CLASS(dev)->bus_type);
     }
 
-    object_property_set_bool(OBJECT(dev), true, "realized", &err);
+    object_property_set_bool(OBJECT(dev), "realized", true, &err);
     if (err) {
         error_propagate(errp, err);
     }
@@ -424,7 +424,7 @@ bool qdev_realize_and_unref(DeviceState *dev, BusState *bus, Error **errp)
 
 void qdev_unrealize(DeviceState *dev)
 {
-    object_property_set_bool(OBJECT(dev), false, "realized", &error_abort);
+    object_property_set_bool(OBJECT(dev), "realized", false, &error_abort);
 }
 
 static int qdev_assert_realized_properly(Object *obj, void *opaque)
@@ -565,7 +565,7 @@ void qdev_connect_gpio_out_named(DeviceState *dev, const char *name, int n,
                                                 "/unattached"),
                                   "non-qdev-gpio[*]", OBJECT(pin));
     }
-    object_property_set_link(OBJECT(dev), OBJECT(pin), propname, &error_abort);
+    object_property_set_link(OBJECT(dev), propname, OBJECT(pin), &error_abort);
     g_free(propname);
 }
 
@@ -591,7 +591,7 @@ static qemu_irq qdev_disconnect_gpio_out_named(DeviceState *dev,
     qemu_irq ret = (qemu_irq)object_property_get_link(OBJECT(dev), propname,
                                                       NULL);
     if (ret) {
-        object_property_set_link(OBJECT(dev), NULL, propname, NULL);
+        object_property_set_link(OBJECT(dev), propname, NULL, NULL);
     }
     g_free(propname);
     return ret;
diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
index 93ba5956ed..34d8e93f28 100644
--- a/hw/display/virtio-gpu-pci.c
+++ b/hw/display/virtio-gpu-pci.c
@@ -38,9 +38,8 @@ static void virtio_gpu_pci_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     }
 
     for (i = 0; i < g->conf.max_outputs; i++) {
-        object_property_set_link(OBJECT(g->scanout[i].con),
-                                 OBJECT(vpci_dev),
-                                 "device", &error_abort);
+        object_property_set_link(OBJECT(g->scanout[i].con), "device",
+                                 OBJECT(vpci_dev), &error_abort);
     }
 }
 
diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
index fd550b35c8..f533d7d1b4 100644
--- a/hw/display/virtio-vga.c
+++ b/hw/display/virtio-vga.c
@@ -149,9 +149,8 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     graphic_console_set_hwops(vga->con, &virtio_vga_base_ops, vvga);
 
     for (i = 0; i < g->conf.max_outputs; i++) {
-        object_property_set_link(OBJECT(g->scanout[i].con),
-                                 OBJECT(vpci_dev),
-                                 "device", &error_abort);
+        object_property_set_link(OBJECT(g->scanout[i].con), "device",
+                                 OBJECT(vpci_dev), &error_abort);
     }
 }
 
diff --git a/hw/dma/sparc32_dma.c b/hw/dma/sparc32_dma.c
index 2d7dbbb92d..9459178866 100644
--- a/hw/dma/sparc32_dma.c
+++ b/hw/dma/sparc32_dma.c
@@ -346,7 +346,7 @@ static void sparc32_ledma_device_realize(DeviceState *dev, Error **errp)
     d = qdev_new(TYPE_LANCE);
     object_property_add_child(OBJECT(dev), "lance", OBJECT(d));
     qdev_set_nic_properties(d, nd);
-    object_property_set_link(OBJECT(d), OBJECT(dev), "dma", &error_abort);
+    object_property_set_link(OBJECT(d), "dma", OBJECT(dev), &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(d), &error_fatal);
 }
 
@@ -379,7 +379,7 @@ static void sparc32_dma_realize(DeviceState *dev, Error **errp)
     }
 
     espdma = qdev_new(TYPE_SPARC32_ESPDMA_DEVICE);
-    object_property_set_link(OBJECT(espdma), iommu, "iommu", &error_abort);
+    object_property_set_link(OBJECT(espdma), "iommu", iommu, &error_abort);
     object_property_add_child(OBJECT(s), "espdma", OBJECT(espdma));
     sysbus_realize_and_unref(SYS_BUS_DEVICE(espdma), &error_fatal);
 
@@ -394,7 +394,7 @@ static void sparc32_dma_realize(DeviceState *dev, Error **errp)
                                 sysbus_mmio_get_region(sbd, 0));
 
     ledma = qdev_new(TYPE_SPARC32_LEDMA_DEVICE);
-    object_property_set_link(OBJECT(ledma), iommu, "iommu", &error_abort);
+    object_property_set_link(OBJECT(ledma), "iommu", iommu, &error_abort);
     object_property_add_child(OBJECT(s), "ledma", OBJECT(ledma));
     sysbus_realize_and_unref(SYS_BUS_DEVICE(ledma), &error_fatal);
 
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
index a069637bf2..a4812e480a 100644
--- a/hw/dma/xilinx_axidma.c
+++ b/hw/dma/xilinx_axidma.c
@@ -547,8 +547,8 @@ static void xilinx_axidma_realize(DeviceState *dev, Error **errp)
                              (Object **)&cs->dma,
                              object_property_allow_set_link,
                              OBJ_PROP_LINK_STRONG);
-    object_property_set_link(OBJECT(ds), OBJECT(s), "dma", &error_abort);
-    object_property_set_link(OBJECT(cs), OBJECT(s), "dma", &error_abort);
+    object_property_set_link(OBJECT(ds), "dma", OBJECT(s), &error_abort);
+    object_property_set_link(OBJECT(cs), "dma", OBJECT(s), &error_abort);
 
     for (i = 0; i < 2; i++) {
         struct Stream *st = &s->streams[i];
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 50e431346e..4d4a4b2a48 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -664,8 +664,8 @@ void pc_cmos_init(PCMachineState *pcms,
                              (Object **)&x86ms->rtc,
                              object_property_allow_set_link,
                              OBJ_PROP_LINK_STRONG);
-    object_property_set_link(OBJECT(pcms), OBJECT(s),
-                             "rtc_state", &error_abort);
+    object_property_set_link(OBJECT(pcms), "rtc_state", OBJECT(s),
+                             &error_abort);
 
     set_boot_dev(s, MACHINE(pcms)->boot_order, &error_fatal);
 
@@ -1167,8 +1167,8 @@ static void pc_superio_init(ISABus *isa_bus, bool create_fdctrl, bool no_vmport)
         vmmouse = NULL;
     }
     if (vmmouse) {
-        object_property_set_link(OBJECT(vmmouse), OBJECT(i8042),
-                                 "i8042", &error_abort);
+        object_property_set_link(OBJECT(vmmouse), "i8042", OBJECT(i8042),
+                                 &error_abort);
         isa_realize_and_unref(vmmouse, isa_bus, &error_fatal);
     }
     port92 = isa_create_simple(isa_bus, TYPE_PORT92);
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 1497d0e4ae..e91747560f 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -294,8 +294,8 @@ static void pc_init1(MachineState *machine,
                                  (Object **)&pcms->acpi_dev,
                                  object_property_allow_set_link,
                                  OBJ_PROP_LINK_STRONG);
-        object_property_set_link(OBJECT(machine), OBJECT(piix4_pm),
-                                 PC_MACHINE_ACPI_DEVICE_PROP, &error_abort);
+        object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
+                                 OBJECT(piix4_pm), &error_abort);
     }
 
     if (machine->nvdimms_state->is_enabled) {
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 46cd06524c..deff0d0c05 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -217,18 +217,18 @@ static void pc_q35_init(MachineState *machine)
     q35_host = Q35_HOST_DEVICE(qdev_new(TYPE_Q35_HOST_DEVICE));
 
     object_property_add_child(qdev_get_machine(), "q35", OBJECT(q35_host));
-    object_property_set_link(OBJECT(q35_host), OBJECT(ram_memory),
-                             MCH_HOST_PROP_RAM_MEM, NULL);
-    object_property_set_link(OBJECT(q35_host), OBJECT(pci_memory),
-                             MCH_HOST_PROP_PCI_MEM, NULL);
-    object_property_set_link(OBJECT(q35_host), OBJECT(get_system_memory()),
-                             MCH_HOST_PROP_SYSTEM_MEM, NULL);
-    object_property_set_link(OBJECT(q35_host), OBJECT(system_io),
-                             MCH_HOST_PROP_IO_MEM, NULL);
-    object_property_set_int(OBJECT(q35_host), x86ms->below_4g_mem_size,
-                            PCI_HOST_BELOW_4G_MEM_SIZE, NULL);
-    object_property_set_int(OBJECT(q35_host), x86ms->above_4g_mem_size,
-                            PCI_HOST_ABOVE_4G_MEM_SIZE, NULL);
+    object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_RAM_MEM,
+                             OBJECT(ram_memory), NULL);
+    object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_PCI_MEM,
+                             OBJECT(pci_memory), NULL);
+    object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_SYSTEM_MEM,
+                             OBJECT(get_system_memory()), NULL);
+    object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_IO_MEM,
+                             OBJECT(system_io), NULL);
+    object_property_set_int(OBJECT(q35_host), PCI_HOST_BELOW_4G_MEM_SIZE,
+                            x86ms->below_4g_mem_size, NULL);
+    object_property_set_int(OBJECT(q35_host), PCI_HOST_ABOVE_4G_MEM_SIZE,
+                            x86ms->above_4g_mem_size, NULL);
     /* pci */
     sysbus_realize_and_unref(SYS_BUS_DEVICE(q35_host), &error_fatal);
     phb = PCI_HOST_BRIDGE(q35_host);
@@ -243,8 +243,8 @@ static void pc_q35_init(MachineState *machine)
                              (Object **)&pcms->acpi_dev,
                              object_property_allow_set_link,
                              OBJ_PROP_LINK_STRONG);
-    object_property_set_link(OBJECT(machine), OBJECT(lpc),
-                             PC_MACHINE_ACPI_DEVICE_PROP, &error_abort);
+    object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
+                             OBJECT(lpc), &error_abort);
 
     /* irq lines */
     gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
diff --git a/hw/i386/x86.c b/hw/i386/x86.c
index 3a7029e6db..86e853c1d4 100644
--- a/hw/i386/x86.c
+++ b/hw/i386/x86.c
@@ -120,7 +120,7 @@ void x86_cpu_new(X86MachineState *x86ms, int64_t apic_id, Error **errp)
 {
     Object *cpu = object_new(MACHINE(x86ms)->cpu_type);
 
-    object_property_set_uint(cpu, apic_id, "apic-id", &error_abort);
+    object_property_set_uint(cpu, "apic-id", apic_id, &error_abort);
     qdev_realize_and_unref(DEVICE(cpu), NULL, errp);
 }
 
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index ba8b0d7f02..27ff1f7f66 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -269,7 +269,7 @@ static void ide_dev_instance_init(Object *obj)
     object_property_add(obj, "bootindex", "int32",
                         ide_dev_get_bootindex,
                         ide_dev_set_bootindex, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+    object_property_set_int(obj, "bootindex", -1, NULL);
 }
 
 static void ide_hd_realize(IDEDevice *dev, Error **errp)
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
index 7d33457e81..5f69626b3a 100644
--- a/hw/intc/pnv_xive.c
+++ b/hw/intc/pnv_xive.c
@@ -1829,17 +1829,16 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
      * resized dynamically when the controller is configured by the FW
      * to limit accesses to resources not provisioned.
      */
-    object_property_set_int(OBJECT(xsrc), PNV_XIVE_NR_IRQS, "nr-irqs",
+    object_property_set_int(OBJECT(xsrc), "nr-irqs", PNV_XIVE_NR_IRQS,
                             &error_fatal);
-    object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
-                             &error_abort);
+    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive), &error_abort);
     if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
 
-    object_property_set_int(OBJECT(end_xsrc), PNV_XIVE_NR_ENDS, "nr-ends",
+    object_property_set_int(OBJECT(end_xsrc), "nr-ends", PNV_XIVE_NR_ENDS,
                             &error_fatal);
-    object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
+    object_property_set_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
                              &error_abort);
     if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index 4e9ee90353..89c8cd9667 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -308,10 +308,9 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
     /*
      * Initialize the internal sources, for IPIs and virtual devices.
      */
-    object_property_set_int(OBJECT(xsrc), xive->nr_irqs, "nr-irqs",
+    object_property_set_int(OBJECT(xsrc), "nr-irqs", xive->nr_irqs,
                             &error_fatal);
-    object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
-                             &error_abort);
+    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(xive), &error_abort);
     if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
@@ -320,9 +319,9 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
     /*
      * Initialize the END ESB source
      */
-    object_property_set_int(OBJECT(end_xsrc), xive->nr_irqs, "nr-ends",
+    object_property_set_int(OBJECT(end_xsrc), "nr-ends", xive->nr_irqs,
                             &error_fatal);
-    object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
+    object_property_set_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
                              &error_abort);
     if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
         return;
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 0d336fb033..68f9d44feb 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -381,8 +381,8 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
     obj = object_new(type);
     object_property_add_child(cpu, type, obj);
     object_unref(obj);
-    object_property_set_link(obj, OBJECT(xi), ICP_PROP_XICS, &error_abort);
-    object_property_set_link(obj, cpu, ICP_PROP_CPU, &error_abort);
+    object_property_set_link(obj, ICP_PROP_XICS, OBJECT(xi), &error_abort);
+    object_property_set_link(obj, ICP_PROP_CPU, cpu, &error_abort);
     if (!qdev_realize(DEVICE(obj), NULL, errp)) {
         object_unparent(obj);
         obj = NULL;
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 8e167306e7..34591659d3 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -763,8 +763,8 @@ Object *xive_tctx_create(Object *cpu, XivePresenter *xptr, Error **errp)
     obj = object_new(TYPE_XIVE_TCTX);
     object_property_add_child(cpu, TYPE_XIVE_TCTX, obj);
     object_unref(obj);
-    object_property_set_link(obj, cpu, "cpu", &error_abort);
-    object_property_set_link(obj, OBJECT(xptr), "presenter", &error_abort);
+    object_property_set_link(obj, "cpu", cpu, &error_abort);
+    object_property_set_link(obj, "presenter", OBJECT(xptr), &error_abort);
     if (!qdev_realize(DEVICE(obj), NULL, &local_err)) {
         goto error;
     }
diff --git a/hw/m68k/q800.c b/hw/m68k/q800.c
index 459d326af0..1ca482ad81 100644
--- a/hw/m68k/q800.c
+++ b/hw/m68k/q800.c
@@ -262,8 +262,8 @@ static void q800_init(MachineState *machine)
     qdev_set_nic_properties(dev, &nd_table[0]);
     qdev_prop_set_uint8(dev, "it_shift", 2);
     qdev_prop_set_bit(dev, "big_endian", true);
-    object_property_set_link(OBJECT(dev), OBJECT(get_system_memory()),
-                             "dma_mr", &error_abort);
+    object_property_set_link(OBJECT(dev), "dma_mr",
+                             OBJECT(get_system_memory()), &error_abort);
     sysbus = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(sysbus, &error_fatal);
     sysbus_mmio_map(sysbus, 0, SONIC_BASE);
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 50e049ce1e..9d3f0b9691 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -56,7 +56,7 @@ void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,
         error_propagate(errp, local_err);
         return;
     }
-    object_property_set_int(OBJECT(dimm), slot, PC_DIMM_SLOT_PROP,
+    object_property_set_int(OBJECT(dimm), PC_DIMM_SLOT_PROP, slot,
                             &error_abort);
     trace_mhp_pc_dimm_assigned_slot(slot);
 
@@ -225,7 +225,7 @@ static uint64_t pc_dimm_md_get_addr(const MemoryDeviceState *md)
 static void pc_dimm_md_set_addr(MemoryDeviceState *md, uint64_t addr,
                                 Error **errp)
 {
-    object_property_set_uint(OBJECT(md), addr, PC_DIMM_ADDR_PROP, errp);
+    object_property_set_uint(OBJECT(md), PC_DIMM_ADDR_PROP, addr, errp);
 }
 
 static MemoryRegion *pc_dimm_md_get_memory_region(MemoryDeviceState *md,
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index fff2c578ef..e49fc86eb8 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -83,14 +83,14 @@ petalogix_ml605_init(MachineState *machine)
 
     /* init CPUs */
     cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
-    object_property_set_str(OBJECT(cpu), "8.10.a", "version", &error_abort);
+    object_property_set_str(OBJECT(cpu), "version", "8.10.a", &error_abort);
     /* Use FPU but don't use floating point conversion and square
      * root instructions
      */
-    object_property_set_int(OBJECT(cpu), 1, "use-fpu", &error_abort);
-    object_property_set_bool(OBJECT(cpu), true, "dcache-writeback",
+    object_property_set_int(OBJECT(cpu), "use-fpu", 1, &error_abort);
+    object_property_set_bool(OBJECT(cpu), "dcache-writeback", true,
                              &error_abort);
-    object_property_set_bool(OBJECT(cpu), true, "endianness", &error_abort);
+    object_property_set_bool(OBJECT(cpu), "endianness", true, &error_abort);
     qdev_realize(DEVICE(cpu), NULL, &error_abort);
 
     /* Attach emulated BRAM through the LMB.  */
@@ -148,10 +148,10 @@ petalogix_ml605_init(MachineState *machine)
     qdev_set_nic_properties(eth0, &nd_table[0]);
     qdev_prop_set_uint32(eth0, "rxmem", 0x1000);
     qdev_prop_set_uint32(eth0, "txmem", 0x1000);
-    object_property_set_link(OBJECT(eth0), ds,
-                             "axistream-connected", &error_abort);
-    object_property_set_link(OBJECT(eth0), cs,
-                             "axistream-control-connected", &error_abort);
+    object_property_set_link(OBJECT(eth0), "axistream-connected", ds,
+                             &error_abort);
+    object_property_set_link(OBJECT(eth0), "axistream-control-connected", cs,
+                             &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(eth0), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(eth0), 0, AXIENET_BASEADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(eth0), 0, irq[AXIENET_IRQ]);
@@ -161,10 +161,10 @@ petalogix_ml605_init(MachineState *machine)
     cs = object_property_get_link(OBJECT(eth0),
                                   "axistream-control-connected-target", NULL);
     qdev_prop_set_uint32(dma, "freqhz", 100 * 1000000);
-    object_property_set_link(OBJECT(dma), ds,
-                             "axistream-connected", &error_abort);
-    object_property_set_link(OBJECT(dma), cs,
-                             "axistream-control-connected", &error_abort);
+    object_property_set_link(OBJECT(dma), "axistream-connected", ds,
+                             &error_abort);
+    object_property_set_link(OBJECT(dma), "axistream-control-connected", cs,
+                             &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dma), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dma), 0, AXIDMA_BASEADDR);
     sysbus_connect_irq(SYS_BUS_DEVICE(dma), 0, irq[AXIDMA_IRQ0]);
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index a43c980fc9..9d959d1ad8 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -70,7 +70,7 @@ petalogix_s3adsp1800_init(MachineState *machine)
     MemoryRegion *sysmem = get_system_memory();
 
     cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
-    object_property_set_str(OBJECT(cpu), "7.10.d", "version", &error_abort);
+    object_property_set_str(OBJECT(cpu), "version", "7.10.d", &error_abort);
     qdev_realize(DEVICE(cpu), NULL, &error_abort);
 
     /* Attach emulated BRAM through the LMB.  */
diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
index cd4f3427d8..5f994547f7 100644
--- a/hw/microblaze/xlnx-zynqmp-pmu.c
+++ b/hw/microblaze/xlnx-zynqmp-pmu.c
@@ -77,33 +77,33 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
 {
     XlnxZynqMPPMUSoCState *s = XLNX_ZYNQMP_PMU_SOC(dev);
 
-    object_property_set_uint(OBJECT(&s->cpu), XLNX_ZYNQMP_PMU_ROM_ADDR,
-                             "base-vectors", &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), true, "use-stack-protection",
+    object_property_set_uint(OBJECT(&s->cpu), "base-vectors",
+                             XLNX_ZYNQMP_PMU_ROM_ADDR, &error_abort);
+    object_property_set_bool(OBJECT(&s->cpu), "use-stack-protection", true,
                              &error_abort);
-    object_property_set_uint(OBJECT(&s->cpu), 0, "use-fpu", &error_abort);
-    object_property_set_uint(OBJECT(&s->cpu), 0, "use-hw-mul", &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), true, "use-barrel",
+    object_property_set_uint(OBJECT(&s->cpu), "use-fpu", 0, &error_abort);
+    object_property_set_uint(OBJECT(&s->cpu), "use-hw-mul", 0, &error_abort);
+    object_property_set_bool(OBJECT(&s->cpu), "use-barrel", true,
                              &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), true, "use-msr-instr",
+    object_property_set_bool(OBJECT(&s->cpu), "use-msr-instr", true,
                              &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), true, "use-pcmp-instr",
+    object_property_set_bool(OBJECT(&s->cpu), "use-pcmp-instr", true,
                              &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), false, "use-mmu", &error_abort);
-    object_property_set_bool(OBJECT(&s->cpu), true, "endianness",
+    object_property_set_bool(OBJECT(&s->cpu), "use-mmu", false, &error_abort);
+    object_property_set_bool(OBJECT(&s->cpu), "endianness", true,
                              &error_abort);
-    object_property_set_str(OBJECT(&s->cpu), "8.40.b", "version",
+    object_property_set_str(OBJECT(&s->cpu), "version", "8.40.b",
                             &error_abort);
-    object_property_set_uint(OBJECT(&s->cpu), 0, "pvr", &error_abort);
+    object_property_set_uint(OBJECT(&s->cpu), "pvr", 0, &error_abort);
     if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
         return;
     }
 
-    object_property_set_uint(OBJECT(&s->intc), 0x10, "intc-intr-size",
+    object_property_set_uint(OBJECT(&s->intc), "intc-intr-size", 0x10,
                              &error_abort);
-    object_property_set_uint(OBJECT(&s->intc), 0x0, "intc-level-edge",
+    object_property_set_uint(OBJECT(&s->intc), "intc-level-edge", 0x0,
                              &error_abort);
-    object_property_set_uint(OBJECT(&s->intc), 0xffff, "intc-positive",
+    object_property_set_uint(OBJECT(&s->intc), "intc-positive", 0xffff,
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
         return;
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
index f5d4ac8cd4..766458c015 100644
--- a/hw/mips/boston.c
+++ b/hw/mips/boston.c
@@ -455,9 +455,9 @@ static void boston_mach_init(MachineState *machine)
     is_64b = cpu_supports_isa(machine->cpu_type, ISA_MIPS64);
 
     object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_MIPS_CPS);
-    object_property_set_str(OBJECT(&s->cps), machine->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type,
                             &error_fatal);
-    object_property_set_int(OBJECT(&s->cps), machine->smp.cpus, "num-vp",
+    object_property_set_int(OBJECT(&s->cps), "num-vp", machine->smp.cpus,
                             &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
 
diff --git a/hw/mips/cps.c b/hw/mips/cps.c
index b4f2306596..615e1a1ad2 100644
--- a/hw/mips/cps.c
+++ b/hw/mips/cps.c
@@ -99,11 +99,11 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
     /* Inter-Thread Communication Unit */
     if (itu_present) {
         object_initialize_child(OBJECT(dev), "itu", &s->itu, TYPE_MIPS_ITU);
-        object_property_set_int(OBJECT(&s->itu), 16, "num-fifo",
+        object_property_set_int(OBJECT(&s->itu), "num-fifo", 16,
                                 &error_abort);
-        object_property_set_int(OBJECT(&s->itu), 16, "num-semaphores",
+        object_property_set_int(OBJECT(&s->itu), "num-semaphores", 16,
                                 &error_abort);
-        object_property_set_bool(OBJECT(&s->itu), saar_present, "saar-present",
+        object_property_set_bool(OBJECT(&s->itu), "saar-present", saar_present,
                                  &error_abort);
         if (saar_present) {
             s->itu.saar = &env->CP0_SAAR;
@@ -118,9 +118,9 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
 
     /* Cluster Power Controller */
     object_initialize_child(OBJECT(dev), "cpc", &s->cpc, TYPE_MIPS_CPC);
-    object_property_set_int(OBJECT(&s->cpc), s->num_vp, "num-vp",
+    object_property_set_int(OBJECT(&s->cpc), "num-vp", s->num_vp,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->cpc), 1, "vp-start-running",
+    object_property_set_int(OBJECT(&s->cpc), "vp-start-running", 1,
                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpc), errp)) {
         return;
@@ -131,9 +131,9 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
 
     /* Global Interrupt Controller */
     object_initialize_child(OBJECT(dev), "gic", &s->gic, TYPE_MIPS_GIC);
-    object_property_set_int(OBJECT(&s->gic), s->num_vp, "num-vp",
+    object_property_set_int(OBJECT(&s->gic), "num-vp", s->num_vp,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->gic), 128, "num-irq",
+    object_property_set_int(OBJECT(&s->gic), "num-irq", 128,
                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
         return;
@@ -146,15 +146,15 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
     gcr_base = env->CP0_CMGCRBase << 4;
 
     object_initialize_child(OBJECT(dev), "gcr", &s->gcr, TYPE_MIPS_GCR);
-    object_property_set_int(OBJECT(&s->gcr), s->num_vp, "num-vp",
+    object_property_set_int(OBJECT(&s->gcr), "num-vp", s->num_vp,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->gcr), 0x800, "gcr-rev",
+    object_property_set_int(OBJECT(&s->gcr), "gcr-rev", 0x800,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->gcr), gcr_base, "gcr-base",
+    object_property_set_int(OBJECT(&s->gcr), "gcr-base", gcr_base,
                             &error_abort);
-    object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->gic.mr), "gic",
+    object_property_set_link(OBJECT(&s->gcr), "gic", OBJECT(&s->gic.mr),
                              &error_abort);
-    object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc",
+    object_property_set_link(OBJECT(&s->gcr), "cpc", OBJECT(&s->cpc.mr),
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
         return;
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index c3b0da60cc..106750da13 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -290,8 +290,8 @@ static void mips_jazz_init(MachineState *machine,
             dev = qdev_new("dp8393x");
             qdev_set_nic_properties(dev, nd);
             qdev_prop_set_uint8(dev, "it_shift", 2);
-            object_property_set_link(OBJECT(dev), OBJECT(rc4030_dma_mr),
-                                     "dma_mr", &error_abort);
+            object_property_set_link(OBJECT(dev), "dma_mr",
+                                     OBJECT(rc4030_dma_mr), &error_abort);
             sysbus = SYS_BUS_DEVICE(dev);
             sysbus_realize_and_unref(sysbus, &error_fatal);
             sysbus_mmio_map(sysbus, 0, 0x80001000);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index d95926a89c..a59e20c81c 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -1184,9 +1184,9 @@ static void create_cps(MachineState *ms, MaltaState *s,
                        qemu_irq *cbus_irq, qemu_irq *i8259_irq)
 {
     object_initialize_child(OBJECT(s), "cps", &s->cps, TYPE_MIPS_CPS);
-    object_property_set_str(OBJECT(&s->cps), ms->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->cps), "cpu-type", ms->cpu_type,
                             &error_fatal);
-    object_property_set_int(OBJECT(&s->cps), ms->smp.cpus, "num-vp",
+    object_property_set_int(OBJECT(&s->cps), "num-vp", ms->smp.cpus,
                             &error_fatal);
     sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal);
 
diff --git a/hw/misc/iotkit-sysctl.c b/hw/misc/iotkit-sysctl.c
index ec1cc1931a..269783366d 100644
--- a/hw/misc/iotkit-sysctl.c
+++ b/hw/misc/iotkit-sysctl.c
@@ -84,7 +84,7 @@ static void set_init_vtor(uint64_t cpuid, uint32_t vtor)
 
     if (cpuobj) {
         if (object_property_find(cpuobj, "init-svtor", NULL)) {
-            object_property_set_uint(cpuobj, vtor, "init-svtor", &error_abort);
+            object_property_set_uint(cpuobj, "init-svtor", vtor, &error_abort);
         }
     }
 }
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index bedf10e77b..679722628e 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -131,7 +131,7 @@ static void macio_realize_ide(MacIOState *s, MACIOIDEState *ide,
     sysbus_connect_irq(sysbus_dev, 0, irq0);
     sysbus_connect_irq(sysbus_dev, 1, irq1);
     qdev_prop_set_uint32(DEVICE(ide), "channel", dmaid);
-    object_property_set_link(OBJECT(ide), OBJECT(&s->dbdma), "dbdma",
+    object_property_set_link(OBJECT(ide), "dbdma", OBJECT(&s->dbdma),
                              &error_abort);
     macio_ide_register_dma(ide);
 
@@ -325,7 +325,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
     if (ns->has_pmu) {
         /* GPIOs */
         sysbus_dev = SYS_BUS_DEVICE(&ns->gpio);
-        object_property_set_link(OBJECT(&ns->gpio), OBJECT(pic_dev), "pic",
+        object_property_set_link(OBJECT(&ns->gpio), "pic", OBJECT(pic_dev),
                                  &error_abort);
         memory_region_add_subregion(&s->bar, 0x50,
                                     sysbus_mmio_get_region(sysbus_dev, 0));
@@ -335,7 +335,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
 
         /* PMU */
         object_initialize_child(OBJECT(s), "pmu", &s->pmu, TYPE_VIA_PMU);
-        object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
+        object_property_set_link(OBJECT(&s->pmu), "gpio", OBJECT(sysbus_dev),
                                  &error_abort);
         qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
         if (!qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), errp)) {
diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c
index 0594abd93a..a878056426 100644
--- a/hw/net/ne2000-isa.c
+++ b/hw/net/ne2000-isa.c
@@ -133,7 +133,7 @@ static void isa_ne2000_instance_init(Object *obj)
     object_property_add(obj, "bootindex", "int32",
                         isa_ne2000_get_bootindex,
                         isa_ne2000_set_bootindex, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+    object_property_set_int(obj, "bootindex", -1, NULL);
 }
 static const TypeInfo ne2000_isa_info = {
     .name          = TYPE_ISA_NE2000,
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
index 679a359f9a..1e48eb70c9 100644
--- a/hw/net/xilinx_axienet.c
+++ b/hw/net/xilinx_axienet.c
@@ -989,8 +989,8 @@ static void xilinx_enet_realize(DeviceState *dev, Error **errp)
                              (Object **) &cs->enet,
                              object_property_allow_set_link,
                              OBJ_PROP_LINK_STRONG);
-    object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &error_abort);
-    object_property_set_link(OBJECT(cs), OBJECT(s), "enet", &error_abort);
+    object_property_set_link(OBJECT(ds), "enet", OBJECT(s), &error_abort);
+    object_property_set_link(OBJECT(cs), "enet", OBJECT(s), &error_abort);
 
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
     s->nic = qemu_new_nic(&net_xilinx_enet_info, &s->conf,
diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
index d85ca709d9..82132c12ca 100644
--- a/hw/pci-host/pnv_phb3.c
+++ b/hw/pci-host/pnv_phb3.c
@@ -998,9 +998,9 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
     }
 
     /* LSI sources */
-    object_property_set_link(OBJECT(&phb->lsis), OBJECT(pnv), "xics",
-                                   &error_abort);
-    object_property_set_int(OBJECT(&phb->lsis), PNV_PHB3_NUM_LSI, "nr-irqs",
+    object_property_set_link(OBJECT(&phb->lsis), "xics", OBJECT(pnv),
+                             &error_abort);
+    object_property_set_int(OBJECT(&phb->lsis), "nr-irqs", PNV_PHB3_NUM_LSI,
                             &error_abort);
     if (!qdev_realize(DEVICE(&phb->lsis), NULL, errp)) {
         return;
@@ -1013,19 +1013,19 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
     phb->qirqs = qemu_allocate_irqs(ics_set_irq, &phb->lsis, phb->lsis.nr_irqs);
 
     /* MSI sources */
-    object_property_set_link(OBJECT(&phb->msis), OBJECT(phb), "phb",
-                                   &error_abort);
-    object_property_set_link(OBJECT(&phb->msis), OBJECT(pnv), "xics",
-                                   &error_abort);
-    object_property_set_int(OBJECT(&phb->msis), PHB3_MAX_MSI, "nr-irqs",
+    object_property_set_link(OBJECT(&phb->msis), "phb", OBJECT(phb),
+                             &error_abort);
+    object_property_set_link(OBJECT(&phb->msis), "xics", OBJECT(pnv),
+                             &error_abort);
+    object_property_set_int(OBJECT(&phb->msis), "nr-irqs", PHB3_MAX_MSI,
                             &error_abort);
     if (!qdev_realize(DEVICE(&phb->msis), NULL, errp)) {
         return;
     }
 
     /* Power Bus Common Queue */
-    object_property_set_link(OBJECT(&phb->pbcq), OBJECT(phb), "phb",
-                                   &error_abort);
+    object_property_set_link(OBJECT(&phb->pbcq), "phb", OBJECT(phb),
+                             &error_abort);
     if (!qdev_realize(DEVICE(&phb->pbcq), NULL, errp)) {
         return;
     }
diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
index 7739fd5984..75ad766fe0 100644
--- a/hw/pci-host/pnv_phb4.c
+++ b/hw/pci-host/pnv_phb4.c
@@ -1215,8 +1215,8 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
     } else {
         nr_irqs = PNV_PHB4_MAX_INTs >> 1;
     }
-    object_property_set_int(OBJECT(xsrc), nr_irqs, "nr-irqs", &error_fatal);
-    object_property_set_link(OBJECT(xsrc), OBJECT(phb), "xive", &error_fatal);
+    object_property_set_int(OBJECT(xsrc), "nr-irqs", nr_irqs, &error_fatal);
+    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(phb), &error_fatal);
     if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
index 40f993bd06..741ddc90ed 100644
--- a/hw/pci-host/pnv_phb4_pec.c
+++ b/hw/pci-host/pnv_phb4_pec.c
@@ -387,8 +387,8 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
         PnvPhb4PecStack *stack = &pec->stacks[i];
         Object *stk_obj = OBJECT(stack);
 
-        object_property_set_int(stk_obj, i, "stack-no", &error_abort);
-        object_property_set_link(stk_obj, OBJECT(pec), "pec", &error_abort);
+        object_property_set_int(stk_obj, "stack-no", i, &error_abort);
+        object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort);
         if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
             return;
         }
diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index 367e408b91..4b93fd2b01 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -236,7 +236,7 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
         /* According to PReP specification section 6.1.6 "System Interrupt
          * Assignments", all PCI interrupts are routed via IRQ 15 */
         s->or_irq = OR_IRQ(object_new(TYPE_OR_IRQ));
-        object_property_set_int(OBJECT(s->or_irq), PCI_NUM_PINS, "num-lines",
+        object_property_set_int(OBJECT(s->or_irq), "num-lines", PCI_NUM_PINS,
                                 &error_fatal);
         qdev_realize(DEVICE(s->or_irq), NULL, &error_fatal);
         sysbus_init_irq(dev, &s->or_irq->out_irq);
@@ -307,7 +307,7 @@ static void raven_pcihost_initfn(Object *obj)
 
     object_initialize(&s->pci_dev, sizeof(s->pci_dev), TYPE_RAVEN_PCI_DEVICE);
     pci_dev = DEVICE(&s->pci_dev);
-    object_property_set_int(OBJECT(&s->pci_dev), PCI_DEVFN(0, 0), "addr",
+    object_property_set_int(OBJECT(&s->pci_dev), "addr", PCI_DEVFN(0, 0),
                             NULL);
     qdev_prop_set_bit(pci_dev, "multifunction", false);
 }
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 5f3a028e6a..243e15d3c6 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -304,7 +304,7 @@ static void ppc_core99_init(MachineState *machine)
         /* 970 gets a U3 bus */
         /* Uninorth AGP bus */
         dev = qdev_new(TYPE_U3_AGP_HOST_BRIDGE);
-        object_property_set_link(OBJECT(dev), OBJECT(pic_dev), "pic",
+        object_property_set_link(OBJECT(dev), "pic", OBJECT(pic_dev),
                                  &error_abort);
         sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
         uninorth_pci = U3_AGP_HOST_BRIDGE(dev);
@@ -323,7 +323,7 @@ static void ppc_core99_init(MachineState *machine)
         /* Use values found on a real PowerMac */
         /* Uninorth AGP bus */
         dev = qdev_new(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
-        object_property_set_link(OBJECT(dev), OBJECT(pic_dev), "pic",
+        object_property_set_link(OBJECT(dev), "pic", OBJECT(pic_dev),
                                  &error_abort);
         s = SYS_BUS_DEVICE(dev);
         sysbus_realize_and_unref(s, &error_fatal);
@@ -332,7 +332,7 @@ static void ppc_core99_init(MachineState *machine)
 
         /* Uninorth internal bus */
         dev = qdev_new(TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE);
-        object_property_set_link(OBJECT(dev), OBJECT(pic_dev), "pic",
+        object_property_set_link(OBJECT(dev), "pic", OBJECT(pic_dev),
                                  &error_abort);
         s = SYS_BUS_DEVICE(dev);
         sysbus_realize_and_unref(s, &error_fatal);
@@ -342,7 +342,7 @@ static void ppc_core99_init(MachineState *machine)
         /* Uninorth main bus */
         dev = qdev_new(TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
         qdev_prop_set_uint32(dev, "ofw-addr", 0xf2000000);
-        object_property_set_link(OBJECT(dev), OBJECT(pic_dev), "pic",
+        object_property_set_link(OBJECT(dev), "pic", OBJECT(pic_dev),
                                  &error_abort);
         sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
         uninorth_pci = UNI_NORTH_PCI_HOST_BRIDGE(dev);
@@ -380,7 +380,7 @@ static void ppc_core99_init(MachineState *machine)
     qdev_prop_set_uint64(dev, "frequency", tbfreq);
     qdev_prop_set_bit(dev, "has-pmu", has_pmu);
     qdev_prop_set_bit(dev, "has-adb", has_adb);
-    object_property_set_link(OBJECT(macio), OBJECT(pic_dev), "pic",
+    object_property_set_link(OBJECT(macio), "pic", OBJECT(pic_dev),
                              &error_abort);
     pci_realize_and_unref(macio, pci_bus, &error_fatal);
 
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index f8c204ead7..7aba040f1b 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -254,7 +254,7 @@ static void ppc_heathrow_init(MachineState *machine)
     /* Grackle PCI host bridge */
     dev = qdev_new(TYPE_GRACKLE_PCI_HOST_BRIDGE);
     qdev_prop_set_uint32(dev, "ofw-addr", 0x80000000);
-    object_property_set_link(OBJECT(dev), OBJECT(pic_dev), "pic",
+    object_property_set_link(OBJECT(dev), "pic", OBJECT(pic_dev),
                              &error_abort);
     s = SYS_BUS_DEVICE(dev);
     sysbus_realize_and_unref(s, &error_fatal);
@@ -281,7 +281,7 @@ static void ppc_heathrow_init(MachineState *machine)
     macio = pci_new(-1, TYPE_OLDWORLD_MACIO);
     dev = DEVICE(macio);
     qdev_prop_set_uint64(dev, "frequency", tbfreq);
-    object_property_set_link(OBJECT(macio), OBJECT(pic_dev), "pic",
+    object_property_set_link(OBJECT(macio), "pic", OBJECT(pic_dev),
                              &error_abort);
     pci_realize_and_unref(macio, pci_bus, &error_fatal);
 
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 392aa138de..388e51c063 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -696,8 +696,8 @@ static void pnv_ipmi_bt_init(ISABus *bus, IPMIBmc *bmc, uint32_t irq)
 {
     ISADevice *dev = isa_new("isa-ipmi-bt");
 
-    object_property_set_link(OBJECT(dev), OBJECT(bmc), "bmc", &error_fatal);
-    object_property_set_int(OBJECT(dev), irq, "irq", &error_fatal);
+    object_property_set_link(OBJECT(dev), "bmc", OBJECT(bmc), &error_fatal);
+    object_property_set_int(OBJECT(dev), "irq", irq, &error_fatal);
     isa_realize_and_unref(dev, bus, &error_fatal);
 }
 
@@ -825,27 +825,27 @@ static void pnv_init(MachineState *machine)
          * way to specify different ranges for each chip
          */
         if (i == 0) {
-            object_property_set_int(chip, machine->ram_size, "ram-size",
+            object_property_set_int(chip, "ram-size", machine->ram_size,
                                     &error_fatal);
         }
 
         snprintf(chip_name, sizeof(chip_name), "chip[%d]", PNV_CHIP_HWID(i));
         object_property_add_child(OBJECT(pnv), chip_name, chip);
-        object_property_set_int(chip, PNV_CHIP_HWID(i), "chip-id",
+        object_property_set_int(chip, "chip-id", PNV_CHIP_HWID(i),
+                                &error_fatal);
+        object_property_set_int(chip, "nr-cores", machine->smp.cores,
+                                &error_fatal);
+        object_property_set_int(chip, "nr-threads", machine->smp.threads,
                                 &error_fatal);
-        object_property_set_int(chip, machine->smp.cores,
-                                "nr-cores", &error_fatal);
-        object_property_set_int(chip, machine->smp.threads,
-                                "nr-threads", &error_fatal);
         /*
          * The POWER8 machine use the XICS interrupt interface.
          * Propagate the XICS fabric to the chip and its controllers.
          */
         if (object_dynamic_cast(OBJECT(pnv), TYPE_XICS_FABRIC)) {
-            object_property_set_link(chip, OBJECT(pnv), "xics", &error_abort);
+            object_property_set_link(chip, "xics", OBJECT(pnv), &error_abort);
         }
         if (object_dynamic_cast(OBJECT(pnv), TYPE_XIVE_FABRIC)) {
-            object_property_set_link(chip, OBJECT(pnv), "xive-fabric",
+            object_property_set_link(chip, "xive-fabric", OBJECT(pnv),
                                      &error_abort);
         }
         sysbus_realize_and_unref(SYS_BUS_DEVICE(chip), &error_fatal);
@@ -1133,10 +1133,10 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     }
 
     /* Processor Service Interface (PSI) Host Bridge */
-    object_property_set_int(OBJECT(&chip8->psi), PNV_PSIHB_BASE(chip),
-                            "bar", &error_fatal);
-    object_property_set_link(OBJECT(&chip8->psi), OBJECT(chip8->xics),
-                             ICS_PROP_XICS, &error_abort);
+    object_property_set_int(OBJECT(&chip8->psi), "bar", PNV_PSIHB_BASE(chip),
+                            &error_fatal);
+    object_property_set_link(OBJECT(&chip8->psi), ICS_PROP_XICS,
+                             OBJECT(chip8->xics), &error_abort);
     if (!qdev_realize(DEVICE(&chip8->psi), NULL, errp)) {
         return;
     }
@@ -1144,7 +1144,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
                             &PNV_PSI(psi8)->xscom_regs);
 
     /* Create LPC controller */
-    object_property_set_link(OBJECT(&chip8->lpc), OBJECT(&chip8->psi), "psi",
+    object_property_set_link(OBJECT(&chip8->lpc), "psi", OBJECT(&chip8->psi),
                              &error_abort);
     qdev_realize(DEVICE(&chip8->lpc), NULL, &error_fatal);
     pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip8->lpc.xscom_regs);
@@ -1164,7 +1164,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     }
 
     /* Create the simplified OCC model */
-    object_property_set_link(OBJECT(&chip8->occ), OBJECT(&chip8->psi), "psi",
+    object_property_set_link(OBJECT(&chip8->occ), "psi", OBJECT(&chip8->psi),
                              &error_abort);
     if (!qdev_realize(DEVICE(&chip8->occ), NULL, errp)) {
         return;
@@ -1176,7 +1176,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
                                 &chip8->occ.sram_regs);
 
     /* HOMER */
-    object_property_set_link(OBJECT(&chip8->homer), OBJECT(chip), "chip",
+    object_property_set_link(OBJECT(&chip8->homer), "chip", OBJECT(chip),
                              &error_abort);
     if (!qdev_realize(DEVICE(&chip8->homer), NULL, errp)) {
         return;
@@ -1193,8 +1193,8 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
         PnvPHB3 *phb = &chip8->phbs[i];
         PnvPBCQState *pbcq = &phb->pbcq;
 
-        object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
-        object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
+        object_property_set_int(OBJECT(phb), "index", i, &error_fatal);
+        object_property_set_int(OBJECT(phb), "chip-id", chip->chip_id,
                                 &error_fatal);
         if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
             return;
@@ -1340,7 +1340,7 @@ static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
                                            sizeof(*eq), TYPE_PNV_QUAD,
                                            &error_fatal, NULL);
 
-        object_property_set_int(OBJECT(eq), core_id, "id", &error_fatal);
+        object_property_set_int(OBJECT(eq), "id", core_id, &error_fatal);
         qdev_realize(DEVICE(eq), NULL, &error_fatal);
 
         pnv_xscom_add_subregion(chip, PNV9_XSCOM_EQ_BASE(eq->id),
@@ -1360,18 +1360,18 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
         uint32_t pec_nest_base;
         uint32_t pec_pci_base;
 
-        object_property_set_int(OBJECT(pec), i, "index", &error_fatal);
+        object_property_set_int(OBJECT(pec), "index", i, &error_fatal);
         /*
          * PEC0 -> 1 stack
          * PEC1 -> 2 stacks
          * PEC2 -> 3 stacks
          */
-        object_property_set_int(OBJECT(pec), i + 1, "num-stacks",
+        object_property_set_int(OBJECT(pec), "num-stacks", i + 1,
                                 &error_fatal);
-        object_property_set_int(OBJECT(pec), chip->chip_id, "chip-id",
-                                 &error_fatal);
-        object_property_set_link(OBJECT(pec), OBJECT(get_system_memory()),
-                                 "system-memory", &error_abort);
+        object_property_set_int(OBJECT(pec), "chip-id", chip->chip_id,
+                                &error_fatal);
+        object_property_set_link(OBJECT(pec), "system-memory",
+                                 OBJECT(get_system_memory()), &error_abort);
         if (!qdev_realize(DEVICE(pec), NULL, errp)) {
             return;
         }
@@ -1387,14 +1387,15 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
             PnvPhb4PecStack *stack = &pec->stacks[j];
             Object *obj = OBJECT(&stack->phb);
 
-            object_property_set_int(obj, phb_id, "index", &error_fatal);
-            object_property_set_int(obj, chip->chip_id, "chip-id",
+            object_property_set_int(obj, "index", phb_id, &error_fatal);
+            object_property_set_int(obj, "chip-id", chip->chip_id,
                                     &error_fatal);
-            object_property_set_int(obj, PNV_PHB4_VERSION, "version",
+            object_property_set_int(obj, "version", PNV_PHB4_VERSION,
                                     &error_fatal);
-            object_property_set_int(obj, PNV_PHB4_DEVICE_ID, "device-id",
+            object_property_set_int(obj, "device-id", PNV_PHB4_DEVICE_ID,
                                     &error_fatal);
-            object_property_set_link(obj, OBJECT(stack), "stack", &error_abort);
+            object_property_set_link(obj, "stack", OBJECT(stack),
+                                     &error_abort);
             if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
                 return;
             }
@@ -1443,15 +1444,15 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     }
 
     /* XIVE interrupt controller (POWER9) */
-    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_IC_BASE(chip),
-                            "ic-bar", &error_fatal);
-    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_VC_BASE(chip),
-                            "vc-bar", &error_fatal);
-    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_PC_BASE(chip),
-                            "pc-bar", &error_fatal);
-    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_TM_BASE(chip),
-                            "tm-bar", &error_fatal);
-    object_property_set_link(OBJECT(&chip9->xive), OBJECT(chip), "chip",
+    object_property_set_int(OBJECT(&chip9->xive), "ic-bar",
+                            PNV9_XIVE_IC_BASE(chip), &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), "vc-bar",
+                            PNV9_XIVE_VC_BASE(chip), &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), "pc-bar",
+                            PNV9_XIVE_PC_BASE(chip), &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), "tm-bar",
+                            PNV9_XIVE_TM_BASE(chip), &error_fatal);
+    object_property_set_link(OBJECT(&chip9->xive), "chip", OBJECT(chip),
                              &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), errp)) {
         return;
@@ -1460,8 +1461,8 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                             &chip9->xive.xscom_regs);
 
     /* Processor Service Interface (PSI) Host Bridge */
-    object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
-                            "bar", &error_fatal);
+    object_property_set_int(OBJECT(&chip9->psi), "bar", PNV9_PSIHB_BASE(chip),
+                            &error_fatal);
     if (!qdev_realize(DEVICE(&chip9->psi), NULL, errp)) {
         return;
     }
@@ -1469,7 +1470,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                             &PNV_PSI(psi9)->xscom_regs);
 
     /* LPC */
-    object_property_set_link(OBJECT(&chip9->lpc), OBJECT(&chip9->psi), "psi",
+    object_property_set_link(OBJECT(&chip9->lpc), "psi", OBJECT(&chip9->psi),
                              &error_abort);
     if (!qdev_realize(DEVICE(&chip9->lpc), NULL, errp)) {
         return;
@@ -1481,7 +1482,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                                             (uint64_t) PNV9_LPCM_BASE(chip));
 
     /* Create the simplified OCC model */
-    object_property_set_link(OBJECT(&chip9->occ), OBJECT(&chip9->psi), "psi",
+    object_property_set_link(OBJECT(&chip9->occ), "psi", OBJECT(&chip9->psi),
                              &error_abort);
     if (!qdev_realize(DEVICE(&chip9->occ), NULL, errp)) {
         return;
@@ -1493,7 +1494,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
                                 &chip9->occ.sram_regs);
 
     /* HOMER */
-    object_property_set_link(OBJECT(&chip9->homer), OBJECT(chip), "chip",
+    object_property_set_link(OBJECT(&chip9->homer), "chip", OBJECT(chip),
                              &error_abort);
     if (!qdev_realize(DEVICE(&chip9->homer), NULL, errp)) {
         return;
@@ -1573,8 +1574,8 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
     }
 
     /* Processor Service Interface (PSI) Host Bridge */
-    object_property_set_int(OBJECT(&chip10->psi), PNV10_PSIHB_BASE(chip),
-                            "bar", &error_fatal);
+    object_property_set_int(OBJECT(&chip10->psi), "bar",
+                            PNV10_PSIHB_BASE(chip), &error_fatal);
     if (!qdev_realize(DEVICE(&chip10->psi), NULL, errp)) {
         return;
     }
@@ -1582,8 +1583,8 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
                             &PNV_PSI(&chip10->psi)->xscom_regs);
 
     /* LPC */
-    object_property_set_link(OBJECT(&chip10->lpc), OBJECT(&chip10->psi), "psi",
-                             &error_abort);
+    object_property_set_link(OBJECT(&chip10->lpc), "psi",
+                             OBJECT(&chip10->psi), &error_abort);
     if (!qdev_realize(DEVICE(&chip10->lpc), NULL, errp)) {
         return;
     }
@@ -1690,16 +1691,15 @@ static void pnv_chip_core_realize(PnvChip *chip, Error **errp)
         snprintf(core_name, sizeof(core_name), "core[%d]", core_hwid);
         object_property_add_child(OBJECT(chip), core_name, OBJECT(pnv_core));
         chip->cores[i] = pnv_core;
-        object_property_set_int(OBJECT(pnv_core), chip->nr_threads,
-                                "nr-threads", &error_fatal);
-        object_property_set_int(OBJECT(pnv_core), core_hwid,
-                                CPU_CORE_PROP_CORE_ID, &error_fatal);
-        object_property_set_int(OBJECT(pnv_core),
-                                pcc->core_pir(chip, core_hwid),
-                                "pir", &error_fatal);
-        object_property_set_int(OBJECT(pnv_core), pnv->fw_load_addr,
-                                "hrmor", &error_fatal);
-        object_property_set_link(OBJECT(pnv_core), OBJECT(chip), "chip",
+        object_property_set_int(OBJECT(pnv_core), "nr-threads",
+                                chip->nr_threads, &error_fatal);
+        object_property_set_int(OBJECT(pnv_core), CPU_CORE_PROP_CORE_ID,
+                                core_hwid, &error_fatal);
+        object_property_set_int(OBJECT(pnv_core), "pir",
+                                pcc->core_pir(chip, core_hwid), &error_fatal);
+        object_property_set_int(OBJECT(pnv_core), "hrmor", pnv->fw_load_addr,
+                                &error_fatal);
+        object_property_set_link(OBJECT(pnv_core), "chip", OBJECT(chip),
                                  &error_abort);
         qdev_realize(DEVICE(pnv_core), NULL, &error_fatal);
 
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 08756a79cd..88ec4cbe5f 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -505,7 +505,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
     unsigned int i;
 
     /* Create PSI interrupt control source */
-    object_property_set_int(OBJECT(ics), PSI_NUM_INTERRUPTS, "nr-irqs", &err);
+    object_property_set_int(OBJECT(ics), "nr-irqs", PSI_NUM_INTERRUPTS, &err);
     if (err) {
         error_propagate(errp, err);
         return;
@@ -843,11 +843,10 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
     int i;
 
     /* This is the only device with 4k ESB pages */
-    object_property_set_int(OBJECT(xsrc), XIVE_ESB_4K, "shift",
+    object_property_set_int(OBJECT(xsrc), "shift", XIVE_ESB_4K, &error_fatal);
+    object_property_set_int(OBJECT(xsrc), "nr-irqs", PSIHB9_NUM_IRQS,
                             &error_fatal);
-    object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
-                            &error_fatal);
-    object_property_set_link(OBJECT(xsrc), OBJECT(psi), "xive", &error_abort);
+    object_property_set_link(OBJECT(xsrc), "xive", OBJECT(psi), &error_abort);
     if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
         return;
     }
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index bcd094ba3b..8621f7d656 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2620,9 +2620,9 @@ static void spapr_init_cpus(SpaprMachineState *spapr)
                 nr_threads = smp_cpus - i * smp_threads;
             }
 
-            object_property_set_int(core, nr_threads, "nr-threads",
+            object_property_set_int(core, "nr-threads", nr_threads,
                                     &error_fatal);
-            object_property_set_int(core, core_id, CPU_CORE_PROP_CORE_ID,
+            object_property_set_int(core, CPU_CORE_PROP_CORE_ID, core_id,
                                     &error_fatal);
             qdev_realize(DEVICE(core), NULL, &error_fatal);
 
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index a61d39ad71..2f8f7d62f8 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -307,9 +307,9 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
         obj = object_new(TYPE_ICS_SPAPR);
 
         object_property_add_child(OBJECT(spapr), "ics", obj);
-        object_property_set_link(obj, OBJECT(spapr), ICS_PROP_XICS,
+        object_property_set_link(obj, ICS_PROP_XICS, OBJECT(spapr),
                                  &error_abort);
-        object_property_set_int(obj, smc->nr_xirqs, "nr-irqs", &error_abort);
+        object_property_set_int(obj, "nr-irqs", smc->nr_xirqs, &error_abort);
         if (!qdev_realize(DEVICE(obj), NULL, errp)) {
             return;
         }
@@ -329,7 +329,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
          * priority
          */
         qdev_prop_set_uint32(dev, "nr-ends", nr_servers << 3);
-        object_property_set_link(OBJECT(dev), OBJECT(spapr), "xive-fabric",
+        object_property_set_link(OBJECT(dev), "xive-fabric", OBJECT(spapr),
                                  &error_abort);
         sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
 
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index c475d0c6ee..2a6a48744a 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -2416,7 +2416,7 @@ static int spapr_switch_one_vga(DeviceState *dev, void *opaque)
 
     if (object_dynamic_cast(OBJECT(dev), "VGA")
         || object_dynamic_cast(OBJECT(dev), "secondary-vga")) {
-        object_property_set_bool(OBJECT(dev), be, "big-endian-framebuffer",
+        object_property_set_bool(OBJECT(dev), "big-endian-framebuffer", be,
                                  &error_abort);
     }
     return 0;
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
index d40f065a6a..a8f0039e51 100644
--- a/hw/riscv/opentitan.c
+++ b/hw/riscv/opentitan.c
@@ -107,9 +107,9 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
     LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
     MemoryRegion *sys_mem = get_system_memory();
 
-    object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->cpus), ms->smp.cpus, "num-harts",
+    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
                             &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->cpus), &error_abort);
 
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 416adfcce0..7bb97b463d 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -175,7 +175,7 @@ static void sifive_e_soc_init(Object *obj)
     SiFiveESoCState *s = RISCV_E_SOC(obj);
 
     object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
-    object_property_set_int(OBJECT(&s->cpus), ms->smp.cpus, "num-harts",
+    object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
                             &error_abort);
     object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
                             TYPE_SIFIVE_GPIO);
@@ -188,7 +188,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
     SiFiveESoCState *s = RISCV_E_SOC(dev);
     MemoryRegion *sys_mem = get_system_memory();
 
-    object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->cpus), "cpu-type", ms->cpu_type,
                             &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->cpus), &error_abort);
 
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
index 12cd91b227..7851326988 100644
--- a/hw/riscv/sifive_u.c
+++ b/hw/riscv/sifive_u.c
@@ -383,8 +383,8 @@ static void sifive_u_machine_init(MachineState *machine)
 
     /* Initialize SoC */
     object_initialize_child(OBJECT(machine), "soc", &s->soc, TYPE_RISCV_U_SOC);
-    object_property_set_uint(OBJECT(&s->soc), s->serial, "serial",
-                            &error_abort);
+    object_property_set_uint(OBJECT(&s->soc), "serial", s->serial,
+                             &error_abort);
     qdev_realize(DEVICE(&s->soc), NULL, &error_abort);
 
     /* register RAM */
@@ -707,7 +707,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
         qemu_check_nic_model(nd, TYPE_CADENCE_GEM);
         qdev_set_nic_properties(DEVICE(&s->gem), nd);
     }
-    object_property_set_int(OBJECT(&s->gem), GEM_REVISION, "revision",
+    object_property_set_int(OBJECT(&s->gem), "revision", GEM_REVISION,
                             &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem), errp)) {
         return;
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
index 3c87e04fdc..c107bf3ba1 100644
--- a/hw/riscv/spike.c
+++ b/hw/riscv/spike.c
@@ -171,9 +171,9 @@ static void spike_board_init(MachineState *machine)
     /* Initialize SOC */
     object_initialize_child(OBJECT(machine), "soc", &s->soc,
                             TYPE_RISCV_HART_ARRAY);
-    object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->soc), "cpu-type", machine->cpu_type,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->soc), smp_cpus, "num-harts",
+    object_property_set_int(OBJECT(&s->soc), "num-harts", smp_cpus,
                             &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_abort);
 
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
index 616db6f5ac..f7630c8a89 100644
--- a/hw/riscv/virt.c
+++ b/hw/riscv/virt.c
@@ -487,9 +487,9 @@ static void virt_machine_init(MachineState *machine)
     /* Initialize SOC */
     object_initialize_child(OBJECT(machine), "soc", &s->soc,
                             TYPE_RISCV_HART_ARRAY);
-    object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
+    object_property_set_str(OBJECT(&s->soc), "cpu-type", machine->cpu_type,
                             &error_abort);
-    object_property_set_int(OBJECT(&s->soc), smp_cpus, "num-harts",
+    object_property_set_int(OBJECT(&s->soc), "num-harts", smp_cpus,
                             &error_abort);
     sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_abort);
 
diff --git a/hw/rx/rx-gdbsim.c b/hw/rx/rx-gdbsim.c
index dba09ba689..6d6b8d102c 100644
--- a/hw/rx/rx-gdbsim.c
+++ b/hw/rx/rx-gdbsim.c
@@ -102,12 +102,12 @@ static void rx_gdbsim_init(MachineState *machine)
 
     /* Initialize MCU */
     object_initialize_child(OBJECT(machine), "mcu", &s->mcu, rxc->mcu_name);
-    object_property_set_link(OBJECT(&s->mcu), OBJECT(sysmem),
-                             "main-bus", &error_abort);
-    object_property_set_uint(OBJECT(&s->mcu), rxc->xtal_freq_hz,
-                             "xtal-frequency-hz", &error_abort);
-    object_property_set_bool(OBJECT(&s->mcu), kernel_filename != NULL,
-                             "load-kernel", &error_abort);
+    object_property_set_link(OBJECT(&s->mcu), "main-bus", OBJECT(sysmem),
+                             &error_abort);
+    object_property_set_uint(OBJECT(&s->mcu), "xtal-frequency-hz",
+                             rxc->xtal_freq_hz, &error_abort);
+    object_property_set_bool(OBJECT(&s->mcu), "load-kernel",
+                             kernel_filename != NULL, &error_abort);
     qdev_realize(DEVICE(&s->mcu), NULL, &error_abort);
 
     /* Load kernel and dtb */
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index df5b4b311a..d46b1f094f 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -552,9 +552,9 @@ static void update_machine_ipl_properties(IplParameterBlock *iplb)
             ascii_loadparm[i] = ebcdic2ascii[(uint8_t) ebcdic_loadparm[i]];
         }
         ascii_loadparm[i] = 0;
-        object_property_set_str(machine, ascii_loadparm, "loadparm", &err);
+        object_property_set_str(machine, "loadparm", ascii_loadparm, &err);
     } else {
-        object_property_set_str(machine, "", "loadparm", &err);
+        object_property_set_str(machine, "loadparm", "", &err);
     }
     if (err) {
         warn_report_err(err);
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 2e0eab1c69..053944be15 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -820,7 +820,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
         return NULL;
     }
 
-    object_property_set_str(OBJECT(dev), target, "target", &local_err);
+    object_property_set_str(OBJECT(dev), "target", target, &local_err);
     if (local_err) {
         object_unparent(OBJECT(dev));
         error_propagate_prepend(errp, local_err,
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index 1e036cc602..db2f49cb27 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -401,7 +401,7 @@ static void s390_skeys_instance_init(Object *obj)
     object_property_add_bool(obj, "migration-enabled",
                              s390_skeys_get_migration_enabled,
                              s390_skeys_set_migration_enabled);
-    object_property_set_bool(obj, true, "migration-enabled", NULL);
+    object_property_set_bool(obj, "migration-enabled", true, NULL);
 }
 
 static void s390_skeys_class_init(ObjectClass *oc, void *data)
diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
index 0144b9021c..4441e1d331 100644
--- a/hw/s390x/s390-stattrib.c
+++ b/hw/s390x/s390-stattrib.c
@@ -388,7 +388,7 @@ static void s390_stattrib_instance_init(Object *obj)
     object_property_add_bool(obj, "migration-enabled",
                              s390_stattrib_get_migration_enabled,
                              s390_stattrib_set_migration_enabled);
-    object_property_set_bool(obj, true, "migration-enabled", NULL);
+    object_property_set_bool(obj, "migration-enabled", true, NULL);
     sas->migration_cur_gfn = 0;
 }
 
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index b111406d56..be4859fa49 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -71,7 +71,7 @@ static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
     S390CPU *cpu = S390_CPU(object_new(typename));
     Error *err = NULL;
 
-    object_property_set_int(OBJECT(cpu), core_id, "core-id", &err);
+    object_property_set_int(OBJECT(cpu), "core-id", core_id, &err);
     if (err != NULL) {
         goto out;
     }
@@ -732,14 +732,14 @@ static inline void s390_machine_initfn(Object *obj)
                              machine_set_aes_key_wrap);
     object_property_set_description(obj, "aes-key-wrap",
             "enable/disable AES key wrapping using the CPACF wrapping key");
-    object_property_set_bool(obj, true, "aes-key-wrap", NULL);
+    object_property_set_bool(obj, "aes-key-wrap", true, NULL);
 
     object_property_add_bool(obj, "dea-key-wrap",
                              machine_get_dea_key_wrap,
                              machine_set_dea_key_wrap);
     object_property_set_description(obj, "dea-key-wrap",
             "enable/disable DEA key wrapping using the CPACF wrapping key");
-    object_property_set_bool(obj, true, "dea-key-wrap", NULL);
+    object_property_set_bool(obj, "dea-key-wrap", true, NULL);
     object_property_add_str(obj, "loadparm",
             machine_get_loadparm, machine_set_loadparm);
     object_property_set_description(obj, "loadparm",
diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
index 438626cf37..570c0333fc 100644
--- a/hw/s390x/virtio-ccw-crypto.c
+++ b/hw/s390x/virtio-ccw-crypto.c
@@ -24,9 +24,8 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
         return;
     }
 
-    object_property_set_link(OBJECT(vdev),
-                             OBJECT(dev->vdev.conf.cryptodev), "cryptodev",
-                             NULL);
+    object_property_set_link(OBJECT(vdev), "cryptodev",
+                             OBJECT(dev->vdev.conf.cryptodev), NULL);
 }
 
 static void virtio_ccw_crypto_instance_init(Object *obj)
diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
index aefe6b1b51..4bb8c16d79 100644
--- a/hw/s390x/virtio-ccw-rng.c
+++ b/hw/s390x/virtio-ccw-rng.c
@@ -25,8 +25,7 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
         return;
     }
 
-    object_property_set_link(OBJECT(dev),
-                             OBJECT(dev->vdev.conf.rng), "rng",
+    object_property_set_link(OBJECT(dev), "rng", OBJECT(dev->vdev.conf.rng),
                              NULL);
 }
 
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index f3d2d63de8..9951c2bca7 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -268,7 +268,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
 
     qdev_prop_set_uint32(dev, "scsi-id", unit);
     if (bootindex >= 0) {
-        object_property_set_int(OBJECT(dev), bootindex, "bootindex",
+        object_property_set_int(OBJECT(dev), "bootindex", bootindex,
                                 &error_abort);
     }
     if (object_property_find(OBJECT(dev), "removable", NULL)) {
@@ -283,7 +283,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
         object_unparent(OBJECT(dev));
         return NULL;
     }
-    object_property_set_bool(OBJECT(dev), share_rw, "share-rw", &err);
+    object_property_set_bool(OBJECT(dev), "share-rw", share_rw, &err);
     if (err != NULL) {
         error_propagate(errp, err);
         object_unparent(OBJECT(dev));
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
index ad0bb6fdb4..562795cfdb 100644
--- a/hw/sd/aspeed_sdhci.c
+++ b/hw/sd/aspeed_sdhci.c
@@ -132,14 +132,14 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
         Object *sdhci_slot = OBJECT(&sdhci->slots[i]);
         SysBusDevice *sbd_slot = SYS_BUS_DEVICE(&sdhci->slots[i]);
 
-        object_property_set_int(sdhci_slot, 2, "sd-spec-version", &err);
+        object_property_set_int(sdhci_slot, "sd-spec-version", 2, &err);
         if (err) {
             error_propagate(errp, err);
             return;
         }
 
-        object_property_set_uint(sdhci_slot, ASPEED_SDHCI_CAPABILITIES,
-                                 "capareg", &err);
+        object_property_set_uint(sdhci_slot, "capareg",
+                                 ASPEED_SDHCI_CAPABILITIES, &err);
         if (err) {
             error_propagate(errp, err);
             return;
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index 0df0edb51d..cf17568f76 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -261,7 +261,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
         }
     }
 
-    object_property_set_bool(OBJECT(carddev), true, "spi", &err);
+    object_property_set_bool(OBJECT(carddev), "spi", true, &err);
     if (err) {
         goto fail;
     }
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index ee52b5cbbc..9be930415f 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -878,7 +878,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
 
     /* Create and map RAM frontend */
     dev = qdev_new("memory");
-    object_property_set_link(OBJECT(dev), ram_memdev, "memdev", &error_fatal);
+    object_property_set_link(OBJECT(dev), "memdev", ram_memdev, &error_fatal);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
 
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 9c8655cffc..9e30203dcc 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -579,7 +579,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
     sabre = SABRE_DEVICE(qdev_new(TYPE_SABRE));
     qdev_prop_set_uint64(DEVICE(sabre), "special-base", PBM_SPECIAL_BASE);
     qdev_prop_set_uint64(DEVICE(sabre), "mem-base", PBM_MEM_BASE);
-    object_property_set_link(OBJECT(sabre), OBJECT(iommu), "iommu",
+    object_property_set_link(OBJECT(sabre), "iommu", OBJECT(iommu),
                              &error_abort);
     sysbus_realize_and_unref(SYS_BUS_DEVICE(sabre), &error_fatal);
 
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 721665191e..2ed6a8df24 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -748,7 +748,7 @@ static void usb_msd_set_bootindex(Object *obj, Visitor *v, const char *name,
     s->conf.bootindex = boot_index;
 
     if (s->scsi_dev) {
-        object_property_set_int(OBJECT(s->scsi_dev), boot_index, "bootindex",
+        object_property_set_int(OBJECT(s->scsi_dev), "bootindex", boot_index,
                                 &error_abort);
     }
 
@@ -769,7 +769,7 @@ static void usb_msd_instance_init(Object *obj)
     object_property_add(obj, "bootindex", "int32",
                         usb_msd_get_bootindex,
                         usb_msd_set_bootindex, NULL, NULL);
-    object_property_set_int(obj, -1, "bootindex", NULL);
+    object_property_set_int(obj, "bootindex", -1, NULL);
 }
 
 static void usb_msd_class_bot_initfn(ObjectClass *klass, void *data)
diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
index 0755722288..f1cc979d33 100644
--- a/hw/virtio/virtio-crypto-pci.c
+++ b/hw/virtio/virtio-crypto-pci.c
@@ -57,9 +57,8 @@ static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
     if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
         return;
     }
-    object_property_set_link(OBJECT(vcrypto),
-                 OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
-                 NULL);
+    object_property_set_link(OBJECT(vcrypto), "cryptodev",
+                             OBJECT(vcrypto->vdev.conf.cryptodev), NULL);
 }
 
 static void virtio_crypto_pci_class_init(ObjectClass *klass, void *data)
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
index bd61d6e2f8..b6d029e271 100644
--- a/hw/virtio/virtio-iommu-pci.c
+++ b/hw/virtio/virtio-iommu-pci.c
@@ -54,9 +54,9 @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
                           "-no-acpi\n");
         return;
     }
-    object_property_set_link(OBJECT(dev),
+    object_property_set_link(OBJECT(dev), "primary-bus",
                              OBJECT(pci_get_bus(&vpci_dev->pci_dev)),
-                             "primary-bus", &error_abort);
+                              &error_abort);
     qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
 }
 
diff --git a/hw/virtio/virtio-pmem-pci.c b/hw/virtio/virtio-pmem-pci.c
index 11d0c8ebc6..21a457d151 100644
--- a/hw/virtio/virtio-pmem-pci.c
+++ b/hw/virtio/virtio-pmem-pci.c
@@ -28,7 +28,7 @@ static void virtio_pmem_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
 static void virtio_pmem_pci_set_addr(MemoryDeviceState *md, uint64_t addr,
                                      Error **errp)
 {
-    object_property_set_uint(OBJECT(md), addr, VIRTIO_PMEM_ADDR_PROP, errp);
+    object_property_set_uint(OBJECT(md), VIRTIO_PMEM_ADDR_PROP, addr, errp);
 }
 
 static uint64_t virtio_pmem_pci_get_addr(const MemoryDeviceState *md)
diff --git a/hw/virtio/virtio-rng-pci.c b/hw/virtio/virtio-rng-pci.c
index b6cb0199a3..2f0b529b62 100644
--- a/hw/virtio/virtio-rng-pci.c
+++ b/hw/virtio/virtio-rng-pci.c
@@ -39,8 +39,7 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
         return;
     }
 
-    object_property_set_link(OBJECT(vrng),
-                             OBJECT(vrng->vdev.conf.rng), "rng",
+    object_property_set_link(OBJECT(vrng), "rng", OBJECT(vrng->vdev.conf.rng),
                              NULL);
 }
 
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index a8df41b11b..85f7163e2d 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -208,8 +208,8 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
         /* The child property took a reference, we can safely drop ours now */
         object_unref(default_backend);
 
-        object_property_set_link(OBJECT(dev), default_backend,
-                                 "rng", &error_abort);
+        object_property_set_link(OBJECT(dev), "rng", default_backend,
+                                 &error_abort);
     }
 
     vrng->rng = vrng->conf.rng;
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 97de9fb5c9..2f04ff1b8a 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7658,7 +7658,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
         if (CPU_NEXT(first_cpu)) {
             TaskState *ts = cpu->opaque;
 
-            object_property_set_bool(OBJECT(cpu), false, "realized", NULL);
+            object_property_set_bool(OBJECT(cpu), "realized", false, NULL);
             object_unref(OBJECT(cpu));
             /*
              * At this point the CPU should be unrealized and removed
diff --git a/net/filter.c b/net/filter.c
index caf6443655..eac8ba1e9c 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -338,7 +338,7 @@ static void default_handle_event(NetFilterState *nf, int event, Error **errp)
     case COLO_EVENT_CHECKPOINT:
         break;
     case COLO_EVENT_FAILOVER:
-        object_property_set_str(OBJECT(nf), "off", "status", errp);
+        object_property_set_str(OBJECT(nf), "status", "off", errp);
         break;
     default:
         break;
diff --git a/net/net.c b/net/net.c
index e1f45d3b36..ae71088c00 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1154,7 +1154,7 @@ static void netfilter_print_info(Monitor *mon, NetFilterState *nf)
             continue;
         }
         v = string_output_visitor_new(false, &str);
-        object_property_get(OBJECT(nf), v, prop->name, NULL);
+        object_property_get(OBJECT(nf), prop->name, v, NULL);
         visit_complete(v, &str);
         visit_free(v);
         monitor_printf(mon, ",%s=%s", prop->name, str);
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 3143dd2afb..f3b5660c84 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -183,7 +183,7 @@ static int set_property(void *opaque, const char *name, const char *value,
     if (strcmp(name, "bus") == 0)
         return 0;
 
-    object_property_parse(obj, value, name, &err);
+    object_property_parse(obj, name, value, &err);
     if (err != NULL) {
         error_propagate(errp, err);
         return -1;
diff --git a/qom/object.c b/qom/object.c
index 326a8de91e..f1c95503e6 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -404,7 +404,7 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
             continue;
         }
         p->used = true;
-        object_property_parse(obj, p->value, p->property, &err);
+        object_property_parse(obj, p->property, p->value, &err);
         if (err != NULL) {
             error_prepend(&err, "can't apply global %s.%s=%s: ",
                           p->driver, p->property, p->value);
@@ -798,7 +798,7 @@ int object_set_propv(Object *obj,
         const char *value = va_arg(vargs, char *);
 
         g_assert(value != NULL);
-        object_property_parse(obj, value, propname, &local_err);
+        object_property_parse(obj, propname, value, &local_err);
         if (local_err) {
             error_propagate(errp, local_err);
             return -1;
@@ -1298,7 +1298,7 @@ void object_property_del(Object *obj, const char *name)
     g_hash_table_remove(obj->properties, name);
 }
 
-void object_property_get(Object *obj, Visitor *v, const char *name,
+void object_property_get(Object *obj, const char *name, Visitor *v,
                          Error **errp)
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
@@ -1313,7 +1313,7 @@ void object_property_get(Object *obj, Visitor *v, const char *name,
     }
 }
 
-void object_property_set(Object *obj, Visitor *v, const char *name,
+void object_property_set(Object *obj, const char *name, Visitor *v,
                          Error **errp)
 {
     ObjectProperty *prop = object_property_find(obj, name, errp);
@@ -1328,11 +1328,11 @@ void object_property_set(Object *obj, Visitor *v, const char *name,
     }
 }
 
-void object_property_set_str(Object *obj, const char *value,
-                             const char *name, Error **errp)
+void object_property_set_str(Object *obj, const char *name,
+                             const char *value, Error **errp)
 {
     QString *qstr = qstring_from_str(value);
-    object_property_set_qobject(obj, QOBJECT(qstr), name, errp);
+    object_property_set_qobject(obj, name, QOBJECT(qstr), errp);
 
     qobject_unref(qstr);
 }
@@ -1356,15 +1356,15 @@ char *object_property_get_str(Object *obj, const char *name,
     return retval;
 }
 
-void object_property_set_link(Object *obj, Object *value,
-                              const char *name, Error **errp)
+void object_property_set_link(Object *obj, const char *name, Object *value,
+                              Error **errp)
 {
     if (value) {
         char *path = object_get_canonical_path(value);
-        object_property_set_str(obj, path, name, errp);
+        object_property_set_str(obj, name, path, errp);
         g_free(path);
     } else {
-        object_property_set_str(obj, "", name, errp);
+        object_property_set_str(obj, name, "", errp);
     }
 }
 
@@ -1386,11 +1386,11 @@ Object *object_property_get_link(Object *obj, const char *name,
     return target;
 }
 
-void object_property_set_bool(Object *obj, bool value,
-                              const char *name, Error **errp)
+void object_property_set_bool(Object *obj, const char *name, bool value,
+                              Error **errp)
 {
     QBool *qbool = qbool_from_bool(value);
-    object_property_set_qobject(obj, QOBJECT(qbool), name, errp);
+    object_property_set_qobject(obj, name, QOBJECT(qbool), errp);
 
     qobject_unref(qbool);
 }
@@ -1417,11 +1417,11 @@ bool object_property_get_bool(Object *obj, const char *name,
     return retval;
 }
 
-void object_property_set_int(Object *obj, int64_t value,
-                             const char *name, Error **errp)
+void object_property_set_int(Object *obj, const char *name, int64_t value,
+                             Error **errp)
 {
     QNum *qnum = qnum_from_int(value);
-    object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
+    object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
 
     qobject_unref(qnum);
 }
@@ -1486,12 +1486,12 @@ void object_property_set_default_uint(ObjectProperty *prop, uint64_t value)
     object_property_set_default(prop, QOBJECT(qnum_from_uint(value)));
 }
 
-void object_property_set_uint(Object *obj, uint64_t value,
-                              const char *name, Error **errp)
+void object_property_set_uint(Object *obj, const char *name, uint64_t value,
+                              Error **errp)
 {
     QNum *qnum = qnum_from_uint(value);
 
-    object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
+    object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
     qobject_unref(qnum);
 }
 
@@ -1553,11 +1553,12 @@ int object_property_get_enum(Object *obj, const char *name,
     return ret;
 }
 
-void object_property_parse(Object *obj, const char *string,
-                           const char *name, Error **errp)
+void object_property_parse(Object *obj, const char *name,
+                           const char *string, Error **errp)
 {
     Visitor *v = string_input_visitor_new(string);
-    object_property_set(obj, v, name, errp);
+
+    object_property_set(obj, name, v, errp);
     visit_free(v);
 }
 
@@ -1569,7 +1570,7 @@ char *object_property_print(Object *obj, const char *name, bool human,
     Error *local_err = NULL;
 
     v = string_output_visitor_new(human, &string);
-    object_property_get(obj, v, name, &local_err);
+    object_property_get(obj, name, v, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto out;
@@ -2612,7 +2613,7 @@ static void property_get_alias(Object *obj, Visitor *v, const char *name,
 {
     AliasProperty *prop = opaque;
 
-    object_property_get(prop->target_obj, v, prop->target_name, errp);
+    object_property_get(prop->target_obj, prop->target_name, v, errp);
 }
 
 static void property_set_alias(Object *obj, Visitor *v, const char *name,
@@ -2620,7 +2621,7 @@ static void property_set_alias(Object *obj, Visitor *v, const char *name,
 {
     AliasProperty *prop = opaque;
 
-    object_property_set(prop->target_obj, v, prop->target_name, errp);
+    object_property_set(prop->target_obj, prop->target_name, v, errp);
 }
 
 static Object *property_resolve_alias(Object *obj, void *opaque,
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 3085ae0b31..4c59ee56d5 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -67,7 +67,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
         goto out;
     }
     for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
-        object_property_set(obj, v, e->key, &local_err);
+        object_property_set(obj, e->key, v, &local_err);
         if (local_err) {
             break;
         }
diff --git a/qom/qom-hmp-cmds.c b/qom/qom-hmp-cmds.c
index b0abe84cb1..9ed8bb1c9f 100644
--- a/qom/qom-hmp-cmds.c
+++ b/qom/qom-hmp-cmds.c
@@ -57,7 +57,7 @@ void hmp_qom_set(Monitor *mon, const QDict *qdict)
             error_set(&err, ERROR_CLASS_DEVICE_NOT_FOUND,
                       "Device '%s' not found", path);
         } else {
-            object_property_parse(obj, value, property, &err);
+            object_property_parse(obj, property, value, &err);
         }
     } else {
         QObject *obj = qobject_from_json(value, &err);
diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
index c5249e44d0..8eefb87ad4 100644
--- a/qom/qom-qmp-cmds.c
+++ b/qom/qom-qmp-cmds.c
@@ -71,7 +71,7 @@ void qmp_qom_set(const char *path, const char *property, QObject *value,
         return;
     }
 
-    object_property_set_qobject(obj, value, property, errp);
+    object_property_set_qobject(obj, property, value, errp);
 }
 
 QObject *qmp_qom_get(const char *path, const char *property, Error **errp)
diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c
index c3b95aa354..f949572d8a 100644
--- a/qom/qom-qobject.c
+++ b/qom/qom-qobject.c
@@ -17,13 +17,14 @@
 #include "qapi/qobject-input-visitor.h"
 #include "qapi/qobject-output-visitor.h"
 
-void object_property_set_qobject(Object *obj, QObject *value,
-                                 const char *name, Error **errp)
+void object_property_set_qobject(Object *obj,
+                                 const char *name, QObject *value,
+                                 Error **errp)
 {
     Visitor *v;
 
     v = qobject_input_visitor_new(value);
-    object_property_set(obj, v, name, errp);
+    object_property_set(obj, name, v, errp);
     visit_free(v);
 }
 
@@ -35,7 +36,7 @@ QObject *object_property_get_qobject(Object *obj, const char *name,
     Visitor *v;
 
     v = qobject_output_visitor_new(&ret);
-    object_property_get(obj, v, name, &local_err);
+    object_property_get(obj, name, v, &local_err);
     if (!local_err) {
         visit_complete(v, &ret);
     }
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 3e15ee2435..4903129867 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2450,7 +2450,7 @@ static int object_parse_property_opt(Object *obj,
         return 0;
     }
 
-    object_property_parse(obj, value, name, &local_err);
+    object_property_parse(obj, name, value, &local_err);
 
     if (local_err) {
         error_propagate(errp, local_err);
@@ -2798,17 +2798,17 @@ static void create_default_memdev(MachineState *ms, const char *path)
 
     obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
     if (path) {
-        object_property_set_str(obj, path, "mem-path", &error_fatal);
+        object_property_set_str(obj, "mem-path", path, &error_fatal);
     }
-    object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
+    object_property_set_int(obj, "size", ms->ram_size, &error_fatal);
     object_property_add_child(object_get_objects_root(), mc->default_ram_id,
                               obj);
     /* Ensure backend's memory region name is equal to mc->default_ram_id */
-    object_property_set_bool(obj, false, "x-use-canonical-path-for-ramblock-id",
-                             &error_fatal);
+    object_property_set_bool(obj, "x-use-canonical-path-for-ramblock-id",
+                             false, &error_fatal);
     user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
     object_unref(obj);
-    object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
+    object_property_set_str(OBJECT(ms), "memory-backend", mc->default_ram_id,
                             &error_fatal);
 }
 
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
index fdab052acd..7f0cc21e6d 100644
--- a/target/arm/monitor.c
+++ b/target/arm/monitor.c
@@ -183,7 +183,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
         i = 0;
         while ((name = cpu_model_advertised_features[i++]) != NULL) {
             if (qdict_get(qdict_in, name)) {
-                object_property_set(obj, visitor, name, &err);
+                object_property_set(obj, name, visitor, &err);
                 if (err) {
                     break;
                 }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index ef5cf587b6..de59d96db5 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -4251,12 +4251,12 @@ static void max_x86_cpu_initfn(Object *obj)
         host_vendor_fms(vendor, &family, &model, &stepping);
         cpu_x86_fill_model_id(model_id);
 
-        object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort);
-        object_property_set_int(OBJECT(cpu), family, "family", &error_abort);
-        object_property_set_int(OBJECT(cpu), model, "model", &error_abort);
-        object_property_set_int(OBJECT(cpu), stepping, "stepping",
+        object_property_set_str(OBJECT(cpu), "vendor", vendor, &error_abort);
+        object_property_set_int(OBJECT(cpu), "family", family, &error_abort);
+        object_property_set_int(OBJECT(cpu), "model", model, &error_abort);
+        object_property_set_int(OBJECT(cpu), "stepping", stepping,
                                 &error_abort);
-        object_property_set_str(OBJECT(cpu), model_id, "model-id",
+        object_property_set_str(OBJECT(cpu), "model-id", model_id,
                                 &error_abort);
 
         if (kvm_enabled()) {
@@ -4276,20 +4276,20 @@ static void max_x86_cpu_initfn(Object *obj)
         }
 
         if (lmce_supported()) {
-            object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
+            object_property_set_bool(OBJECT(cpu), "lmce", true, &error_abort);
         }
     } else {
-        object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD,
-                                "vendor", &error_abort);
-        object_property_set_int(OBJECT(cpu), 6, "family", &error_abort);
-        object_property_set_int(OBJECT(cpu), 6, "model", &error_abort);
-        object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort);
-        object_property_set_str(OBJECT(cpu),
+        object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
+                                &error_abort);
+        object_property_set_int(OBJECT(cpu), "family", 6, &error_abort);
+        object_property_set_int(OBJECT(cpu), "model", 6, &error_abort);
+        object_property_set_int(OBJECT(cpu), "stepping", 3, &error_abort);
+        object_property_set_str(OBJECT(cpu), "model-id",
                                 "QEMU TCG CPU version " QEMU_HW_VERSION,
-                                "model-id", &error_abort);
+                                &error_abort);
     }
 
-    object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
+    object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
 }
 
 static const TypeInfo max_x86_cpu_type_info = {
@@ -5050,7 +5050,7 @@ static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
         if (!pv->value) {
             continue;
         }
-        object_property_parse(OBJECT(cpu), pv->value, pv->prop,
+        object_property_parse(OBJECT(cpu), pv->prop, pv->value,
                               &error_abort);
     }
 }
@@ -5069,7 +5069,7 @@ static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
         PropValue *p;
 
         for (p = vdef->props; p && p->prop; p++) {
-            object_property_parse(OBJECT(cpu), p->value, p->prop,
+            object_property_parse(OBJECT(cpu), p->prop, p->value,
                                   &error_abort);
         }
 
@@ -5100,18 +5100,16 @@ static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
      */
 
     /* CPU models only set _minimum_ values for level/xlevel: */
-    object_property_set_uint(OBJECT(cpu), def->level, "min-level",
+    object_property_set_uint(OBJECT(cpu), "min-level", def->level,
                              &error_abort);
-    object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel",
+    object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
                              &error_abort);
 
-    object_property_set_int(OBJECT(cpu), def->family, "family",
+    object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
+    object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
+    object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
                             &error_abort);
-    object_property_set_int(OBJECT(cpu), def->model, "model",
-                            &error_abort);
-    object_property_set_int(OBJECT(cpu), def->stepping, "stepping",
-                            &error_abort);
-    object_property_set_str(OBJECT(cpu), def->model_id, "model-id",
+    object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
                             &error_abort);
     for (w = 0; w < FEATURE_WORDS; w++) {
         env->features[w] = def->features[w];
@@ -5149,8 +5147,7 @@ static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
         vendor = host_vendor;
     }
 
-    object_property_set_str(OBJECT(cpu), vendor, "vendor",
-                            &error_abort);
+    object_property_set_str(OBJECT(cpu), "vendor", vendor, &error_abort);
 
     x86_cpu_apply_version_props(cpu, model);
 }
@@ -5257,8 +5254,8 @@ static void object_apply_props(Object *obj, QDict *props, Error **errp)
     Error *err = NULL;
 
     for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
-        object_property_set_qobject(obj, qdict_entry_value(prop),
-                                         qdict_entry_key(prop), &err);
+        object_property_set_qobject(obj, qdict_entry_key(prop),
+                                    qdict_entry_value(prop), &err);
         if (err) {
             break;
         }
@@ -6326,7 +6323,7 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
 
     for (l = plus_features; l; l = l->next) {
         const char *prop = l->data;
-        object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
+        object_property_set_bool(OBJECT(cpu), prop, true, &local_err);
         if (local_err) {
             goto out;
         }
@@ -6334,7 +6331,7 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
 
     for (l = minus_features; l; l = l->next) {
         const char *prop = l->data;
-        object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
+        object_property_set_bool(OBJECT(cpu), prop, false, &local_err);
         if (local_err) {
             goto out;
         }
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index a40888411c..77ee032c71 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -10487,7 +10487,7 @@ static void ppc_cpu_parse_featurestr(const char *type, char *features,
 
         if (compat_str) {
             char *v = compat_str + strlen("compat=");
-            object_property_set_str(machine, v, "max-cpu-compat", &local_err);
+            object_property_set_str(machine, "max-cpu-compat", v, &local_err);
         }
         g_strfreev(inpieces);
         if (local_err) {
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index aadd92247f..4cd08621bd 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -516,7 +516,7 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
             return;
         }
         for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
-            object_property_set(obj, visitor, e->key, &err);
+            object_property_set(obj, e->key, visitor, &err);
             if (err) {
                 break;
             }
diff --git a/ui/console.c b/ui/console.c
index 865fa32635..08f75c9bf6 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1910,7 +1910,7 @@ QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
     }
     graphic_console_set_hwops(s, hw_ops, opaque);
     if (dev) {
-        object_property_set_link(OBJECT(s), OBJECT(dev), "device",
+        object_property_set_link(OBJECT(s), "device", OBJECT(dev),
                                  &error_abort);
     }
 
@@ -1937,7 +1937,7 @@ void graphic_console_close(QemuConsole *con)
     }
 
     trace_console_gfx_close(con->index);
-    object_property_set_link(OBJECT(con), NULL, "device", &error_abort);
+    object_property_set_link(OBJECT(con), "device", NULL, &error_abort);
     graphic_console_set_hwops(con, &unused_ops, NULL);
 
     if (con->gl) {
-- 
2.26.2



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

* [PATCH 37/46] qom: Make functions taking Error ** return bool, not void
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (35 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 36/46] qom: Put name parameter before value / visitor parameter Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:32   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 38/46] qom: Smooth error checking with Coccinelle Markus Armbruster
                   ` (9 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

See recent commit "error: Document Error API usage rules" for
rationale.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qom/object.h            | 42 ++++++++++++-----
 include/qom/object_interfaces.h | 12 +++--
 include/qom/qom-qobject.h       |  4 +-
 qom/object.c                    | 84 +++++++++++++++++++++------------
 qom/object_interfaces.c         | 21 +++++----
 qom/qom-qobject.c               |  6 ++-
 6 files changed, 113 insertions(+), 56 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 7ef9c8d0cc..b2d2558245 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -703,7 +703,7 @@ Object *object_new_with_propv(const char *typename,
                               Error **errp,
                               va_list vargs);
 
-void object_apply_global_props(Object *obj, const GPtrArray *props,
+bool object_apply_global_props(Object *obj, const GPtrArray *props,
                                Error **errp);
 void object_set_machine_compat_props(GPtrArray *compat_props);
 void object_set_accelerator_compat_props(GPtrArray *compat_props);
@@ -798,8 +798,10 @@ void object_initialize(void *obj, size_t size, const char *typename);
  * strings. The propname of %NULL indicates the end of the property list.
  * If the object implements the user creatable interface, the object will
  * be marked complete once all the properties have been processed.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_initialize_child_with_props(Object *parentobj,
+bool object_initialize_child_with_props(Object *parentobj,
                              const char *propname,
                              void *childobj, size_t size, const char *type,
                              Error **errp, ...) QEMU_SENTINEL;
@@ -815,8 +817,10 @@ void object_initialize_child_with_props(Object *parentobj,
  * @vargs: list of property names and values
  *
  * See object_initialize_child() for documentation.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_initialize_child_with_propsv(Object *parentobj,
+bool object_initialize_child_with_propsv(Object *parentobj,
                               const char *propname,
                               void *childobj, size_t size, const char *type,
                               Error **errp, va_list vargs);
@@ -1197,8 +1201,10 @@ void object_unparent(Object *obj);
  * @errp: returns an error if this function fails
  *
  * Reads a property from a object.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_get(Object *obj, const char *name, Visitor *v,
+bool object_property_get(Object *obj, const char *name, Visitor *v,
                          Error **errp);
 
 /**
@@ -1208,8 +1214,10 @@ void object_property_get(Object *obj, const char *name, Visitor *v,
  * @errp: returns an error if this function fails
  *
  * Writes a string value to a property.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_str(Object *obj,
+bool object_property_set_str(Object *obj,
                              const char *name, const char *value,
                              Error **errp);
 
@@ -1238,8 +1246,9 @@ char *object_property_get_str(Object *obj, const char *name,
  * <code>OBJ_PROP_LINK_STRONG</code> bit, the old target object is
  * unreferenced, and a reference is added to the new target object.
  *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_link(Object *obj, const char *name, Object *value,
+bool object_property_set_link(Object *obj, const char *name, Object *value,
                               Error **errp);
 
 /**
@@ -1262,8 +1271,10 @@ Object *object_property_get_link(Object *obj, const char *name,
  * @errp: returns an error if this function fails
  *
  * Writes a bool value to a property.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_bool(Object *obj, const char *name, bool value,
+bool object_property_set_bool(Object *obj, const char *name, bool value,
                               Error **errp);
 
 /**
@@ -1285,8 +1296,10 @@ bool object_property_get_bool(Object *obj, const char *name,
  * @errp: returns an error if this function fails
  *
  * Writes an integer value to a property.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_int(Object *obj, const char *name, int64_t value,
+bool object_property_set_int(Object *obj, const char *name, int64_t value,
                              Error **errp);
 
 /**
@@ -1308,8 +1321,10 @@ int64_t object_property_get_int(Object *obj, const char *name,
  * @errp: returns an error if this function fails
  *
  * Writes an unsigned integer value to a property.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_uint(Object *obj, const char *name, uint64_t value,
+bool object_property_set_uint(Object *obj, const char *name, uint64_t value,
                               Error **errp);
 
 /**
@@ -1348,8 +1363,10 @@ int object_property_get_enum(Object *obj, const char *name,
  * @errp: returns an error if this function fails
  *
  * Writes a property to a object.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set(Object *obj, const char *name, Visitor *v,
+bool object_property_set(Object *obj, const char *name, Visitor *v,
                          Error **errp);
 
 /**
@@ -1360,8 +1377,10 @@ void object_property_set(Object *obj, const char *name, Visitor *v,
  * @errp: returns an error if this function fails
  *
  * Parses a string and writes the result into a property of an object.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_parse(Object *obj, const char *name,
+bool object_property_parse(Object *obj, const char *name,
                            const char *string, Error **errp);
 
 /**
@@ -1804,6 +1823,7 @@ ObjectProperty *object_property_add_const_link(Object *obj, const char *name,
  *
  * Set an object property's description.
  *
+ * Returns: %true on success, %false on failure.
  */
 void object_property_set_description(Object *obj, const char *name,
                                      const char *description);
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 65172120fa..7035829337 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -57,8 +57,10 @@ typedef struct UserCreatableClass {
  * Wrapper to call complete() method if one of types it's inherited
  * from implements USER_CREATABLE interface, otherwise the call does
  * nothing.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void user_creatable_complete(UserCreatable *uc, Error **errp);
+bool user_creatable_complete(UserCreatable *uc, Error **errp);
 
 /**
  * user_creatable_can_be_deleted:
@@ -100,8 +102,10 @@ Object *user_creatable_add_type(const char *type, const char *id,
  * @qdict.  The object type is taken from the QDict key 'qom-type', its
  * ID from the key 'id'. The remaining entries in @qdict are used to
  * initialize the object properties.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp);
+bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp);
 
 /**
  * user_creatable_add_opts:
@@ -167,8 +171,10 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts);
  *
  * Delete an instance of the user creatable object identified
  * by @id.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void user_creatable_del(const char *id, Error **errp);
+bool user_creatable_del(const char *id, Error **errp);
 
 /**
  * user_creatable_cleanup:
diff --git a/include/qom/qom-qobject.h b/include/qom/qom-qobject.h
index ad9a98dd62..73e4e0e474 100644
--- a/include/qom/qom-qobject.h
+++ b/include/qom/qom-qobject.h
@@ -33,8 +33,10 @@ struct QObject *object_property_get_qobject(Object *obj, const char *name,
  * @errp: returns an error if this function fails
  *
  * Writes a property to a object.
+ *
+ * Returns: %true on success, %false on failure.
  */
-void object_property_set_qobject(Object *obj,
+bool object_property_set_qobject(Object *obj,
                                  const char *name, struct QObject *value,
                                  struct Error **errp);
 
diff --git a/qom/object.c b/qom/object.c
index f1c95503e6..46406ba84a 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -385,12 +385,13 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
     }
 }
 
-void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
+bool object_apply_global_props(Object *obj, const GPtrArray *props,
+                               Error **errp)
 {
     int i;
 
     if (!props) {
-        return;
+        return true;
     }
 
     for (i = 0; i < props->len; i++) {
@@ -415,12 +416,14 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
              */
             if (errp) {
                 error_propagate(errp, err);
-                return;
+                return false;
             } else {
                 warn_report_err(err);
             }
         }
     }
+
+    return true;
 }
 
 /*
@@ -524,25 +527,29 @@ void object_initialize(void *data, size_t size, const char *typename)
     object_initialize_with_type(data, size, type);
 }
 
-void object_initialize_child_with_props(Object *parentobj,
+bool object_initialize_child_with_props(Object *parentobj,
                              const char *propname,
                              void *childobj, size_t size, const char *type,
                              Error **errp, ...)
 {
     va_list vargs;
+    bool ok;
 
     va_start(vargs, errp);
-    object_initialize_child_with_propsv(parentobj, propname,
-                                        childobj, size, type, errp, vargs);
+    ok = object_initialize_child_with_propsv(parentobj, propname,
+                                             childobj, size, type, errp,
+                                             vargs);
     va_end(vargs);
+    return ok;
 }
 
-void object_initialize_child_with_propsv(Object *parentobj,
+bool object_initialize_child_with_propsv(Object *parentobj,
                               const char *propname,
                               void *childobj, size_t size, const char *type,
                               Error **errp, va_list vargs)
 {
     Error *local_err = NULL;
+    bool ok = false;
     Object *obj;
     UserCreatable *uc;
 
@@ -564,6 +571,8 @@ void object_initialize_child_with_propsv(Object *parentobj,
         }
     }
 
+    ok = true;
+
 out:
     /*
      * We want @obj's reference to be 1 on success, 0 on failure.
@@ -576,6 +585,7 @@ out:
     object_unref(obj);
 
     error_propagate(errp, local_err);
+    return ok;
 }
 
 void object_initialize_child_internal(Object *parent,
@@ -1298,43 +1308,52 @@ void object_property_del(Object *obj, const char *name)
     g_hash_table_remove(obj->properties, name);
 }
 
-void object_property_get(Object *obj, const char *name, Visitor *v,
+bool object_property_get(Object *obj, const char *name, Visitor *v,
                          Error **errp)
 {
+    Error *err = NULL;
     ObjectProperty *prop = object_property_find(obj, name, errp);
+
     if (prop == NULL) {
-        return;
+        return false;
     }
 
     if (!prop->get) {
         error_setg(errp, QERR_PERMISSION_DENIED);
-    } else {
-        prop->get(obj, v, name, prop->opaque, errp);
+        return false;
     }
+    prop->get(obj, v, name, prop->opaque, &err);
+    error_propagate(errp, err);
+    return !err;
 }
 
-void object_property_set(Object *obj, const char *name, Visitor *v,
+bool object_property_set(Object *obj, const char *name, Visitor *v,
                          Error **errp)
 {
+    Error *err = NULL;
     ObjectProperty *prop = object_property_find(obj, name, errp);
+
     if (prop == NULL) {
-        return;
+        return false;
     }
 
     if (!prop->set) {
         error_setg(errp, QERR_PERMISSION_DENIED);
-    } else {
-        prop->set(obj, v, name, prop->opaque, errp);
+        return false;
     }
+    prop->set(obj, v, name, prop->opaque, &err);
+    error_propagate(errp, err);
+    return !err;
 }
 
-void object_property_set_str(Object *obj, const char *name,
+bool object_property_set_str(Object *obj, const char *name,
                              const char *value, Error **errp)
 {
     QString *qstr = qstring_from_str(value);
-    object_property_set_qobject(obj, name, QOBJECT(qstr), errp);
+    bool ok = object_property_set_qobject(obj, name, QOBJECT(qstr), errp);
 
     qobject_unref(qstr);
+    return ok;
 }
 
 char *object_property_get_str(Object *obj, const char *name,
@@ -1356,16 +1375,15 @@ char *object_property_get_str(Object *obj, const char *name,
     return retval;
 }
 
-void object_property_set_link(Object *obj, const char *name, Object *value,
+bool object_property_set_link(Object *obj, const char *name, Object *value,
                               Error **errp)
 {
+    g_autofree char *path = NULL;
+
     if (value) {
-        char *path = object_get_canonical_path(value);
-        object_property_set_str(obj, name, path, errp);
-        g_free(path);
-    } else {
-        object_property_set_str(obj, name, "", errp);
+        path = object_get_canonical_path(value);
     }
+    return object_property_set_str(obj, name, path ?: "", errp);
 }
 
 Object *object_property_get_link(Object *obj, const char *name,
@@ -1386,13 +1404,14 @@ Object *object_property_get_link(Object *obj, const char *name,
     return target;
 }
 
-void object_property_set_bool(Object *obj, const char *name, bool value,
+bool object_property_set_bool(Object *obj, const char *name, bool value,
                               Error **errp)
 {
     QBool *qbool = qbool_from_bool(value);
-    object_property_set_qobject(obj, name, QOBJECT(qbool), errp);
+    bool ok = object_property_set_qobject(obj, name, QOBJECT(qbool), errp);
 
     qobject_unref(qbool);
+    return ok;
 }
 
 bool object_property_get_bool(Object *obj, const char *name,
@@ -1417,13 +1436,14 @@ bool object_property_get_bool(Object *obj, const char *name,
     return retval;
 }
 
-void object_property_set_int(Object *obj, const char *name, int64_t value,
+bool object_property_set_int(Object *obj, const char *name, int64_t value,
                              Error **errp)
 {
     QNum *qnum = qnum_from_int(value);
-    object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
+    bool ok = object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
 
     qobject_unref(qnum);
+    return ok;
 }
 
 int64_t object_property_get_int(Object *obj, const char *name,
@@ -1486,13 +1506,14 @@ void object_property_set_default_uint(ObjectProperty *prop, uint64_t value)
     object_property_set_default(prop, QOBJECT(qnum_from_uint(value)));
 }
 
-void object_property_set_uint(Object *obj, const char *name, uint64_t value,
+bool object_property_set_uint(Object *obj, const char *name, uint64_t value,
                               Error **errp)
 {
     QNum *qnum = qnum_from_uint(value);
+    bool ok = object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
 
-    object_property_set_qobject(obj, name, QOBJECT(qnum), errp);
     qobject_unref(qnum);
+    return ok;
 }
 
 uint64_t object_property_get_uint(Object *obj, const char *name,
@@ -1553,13 +1574,14 @@ int object_property_get_enum(Object *obj, const char *name,
     return ret;
 }
 
-void object_property_parse(Object *obj, const char *name,
+bool object_property_parse(Object *obj, const char *name,
                            const char *string, Error **errp)
 {
     Visitor *v = string_input_visitor_new(string);
+    bool ok = object_property_set(obj, name, v, errp);
 
-    object_property_set(obj, name, v, errp);
     visit_free(v);
+    return ok;
 }
 
 char *object_property_print(Object *obj, const char *name, bool human,
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 4c59ee56d5..382198504c 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -14,13 +14,16 @@
 #include "qapi/opts-visitor.h"
 #include "qemu/config-file.h"
 
-void user_creatable_complete(UserCreatable *uc, Error **errp)
+bool user_creatable_complete(UserCreatable *uc, Error **errp)
 {
     UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
+    Error *err = NULL;
 
     if (ucc->complete) {
-        ucc->complete(uc, errp);
+        ucc->complete(uc, &err);
+        error_propagate(errp, err);
     }
+    return !err;
 }
 
 bool user_creatable_can_be_deleted(UserCreatable *uc)
@@ -101,7 +104,7 @@ out:
     return obj;
 }
 
-void user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp)
+bool user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp)
 {
     Visitor *v;
     Object *obj;
@@ -111,14 +114,14 @@ void user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp)
     type = g_strdup(qdict_get_try_str(qdict, "qom-type"));
     if (!type) {
         error_setg(errp, QERR_MISSING_PARAMETER, "qom-type");
-        return;
+        return false;
     }
     qdict_del(qdict, "qom-type");
 
     id = g_strdup(qdict_get_try_str(qdict, "id"));
     if (!id) {
         error_setg(errp, QERR_MISSING_PARAMETER, "id");
-        return;
+        return false;
     }
     qdict_del(qdict, "id");
 
@@ -130,6 +133,7 @@ void user_creatable_add_dict(QDict *qdict, bool keyval, Error **errp)
     obj = user_creatable_add_type(type, id, qdict, v, errp);
     visit_free(v);
     object_unref(obj);
+    return !!obj;
 }
 
 Object *user_creatable_add_opts(QemuOpts *opts, Error **errp)
@@ -260,7 +264,7 @@ bool user_creatable_print_help(const char *type, QemuOpts *opts)
     return false;
 }
 
-void user_creatable_del(const char *id, Error **errp)
+bool user_creatable_del(const char *id, Error **errp)
 {
     Object *container;
     Object *obj;
@@ -269,12 +273,12 @@ void user_creatable_del(const char *id, Error **errp)
     obj = object_resolve_path_component(container, id);
     if (!obj) {
         error_setg(errp, "object '%s' not found", id);
-        return;
+        return false;
     }
 
     if (!user_creatable_can_be_deleted(USER_CREATABLE(obj))) {
         error_setg(errp, "object '%s' is in use, can not be deleted", id);
-        return;
+        return false;
     }
 
     /*
@@ -285,6 +289,7 @@ void user_creatable_del(const char *id, Error **errp)
                                  id));
 
     object_unparent(obj);
+    return true;
 }
 
 void user_creatable_cleanup(void)
diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c
index f949572d8a..62ac5e07ac 100644
--- a/qom/qom-qobject.c
+++ b/qom/qom-qobject.c
@@ -17,15 +17,17 @@
 #include "qapi/qobject-input-visitor.h"
 #include "qapi/qobject-output-visitor.h"
 
-void object_property_set_qobject(Object *obj,
+bool object_property_set_qobject(Object *obj,
                                  const char *name, QObject *value,
                                  Error **errp)
 {
     Visitor *v;
+    bool ok;
 
     v = qobject_input_visitor_new(value);
-    object_property_set(obj, name, v, errp);
+    ok = object_property_set(obj, name, v, errp);
     visit_free(v);
+    return ok;
 }
 
 QObject *object_property_get_qobject(Object *obj, const char *name,
-- 
2.26.2



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

* [PATCH 38/46] qom: Smooth error checking with Coccinelle
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (36 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 37/46] qom: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:35   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 39/46] qom: Smooth error checking manually Markus Armbruster
                   ` (8 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The previous commit enables conversion of

    foo(..., &err);
    if (err) {
	...
    }

to

    if (!foo(..., errp)) {
	...
    }

for QOM functions that now return true / false on success / error.
Coccinelle script:

    @@
    identifier fun = {object_apply_global_props, object_initialize_child_with_props, object_initialize_child_with_propsv, object_property_get, object_property_get_bool, object_property_parse, object_property_set, object_property_set_bool, object_property_set_int, object_property_set_link, object_property_set_qobject, object_property_set_str, object_property_set_uint, object_set_props, object_set_propv, user_creatable_add_dict, user_creatable_complete, user_creatable_del};
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun = {object_apply_global_props, object_initialize_child_with_props, object_initialize_child_with_propsv, object_property_get, object_property_get_bool, object_property_parse, object_property_set, object_property_set_bool, object_property_set_int, object_property_set_link, object_property_set_qobject, object_property_set_str, object_property_set_uint, object_set_props, object_set_propv, user_creatable_add_dict, user_creatable_complete, user_creatable_del};
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
ARMSSE being used both as typedef and function-like macro there.
Convert manually.

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Tidy up line breaks and whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/arm/armsse.c              | 64 +++++++++++++-----------------------
 hw/arm/armv7m.c              | 25 +++++---------
 hw/arm/aspeed_ast2600.c      |  6 ++--
 hw/arm/aspeed_soc.c          |  6 ++--
 hw/arm/bcm2835_peripherals.c |  6 ++--
 hw/arm/bcm2836.c             | 15 ++++-----
 hw/arm/cubieboard.c          | 11 +++----
 hw/arm/digic.c               |  6 ++--
 hw/arm/nrf51_soc.c           | 10 ++----
 hw/arm/stm32f405_soc.c       |  8 ++---
 hw/arm/xlnx-zynqmp.c         | 18 ++++------
 hw/block/xen-block.c         | 15 ++++-----
 hw/core/qdev.c               |  8 +----
 hw/ppc/pnv_psi.c             |  6 ++--
 hw/s390x/s390-pci-bus.c      |  3 +-
 hw/s390x/s390-virtio-ccw.c   |  3 +-
 hw/scsi/scsi-bus.c           |  4 +--
 hw/sd/aspeed_sdhci.c         | 11 ++-----
 hw/sd/ssi-sd.c               |  3 +-
 hw/virtio/virtio-rng.c       |  6 +---
 qdev-monitor.c               |  5 +--
 qom/object.c                 | 19 +++--------
 qom/object_interfaces.c      |  6 ++--
 softmmu/vl.c                 |  7 +---
 target/arm/monitor.c         |  3 +-
 target/i386/cpu.c            | 11 +++----
 target/s390x/cpu_models.c    |  3 +-
 27 files changed, 94 insertions(+), 194 deletions(-)

diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index 8af599cb13..3f12b7130b 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -535,23 +535,18 @@ static void armsse_realize(DeviceState *dev, Error **errp)
          * later if necessary.
          */
         if (extract32(info->cpuwait_rst, i, 1)) {
-            object_property_set_bool(cpuobj, "start-powered-off", true, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!object_property_set_bool(cpuobj, "start-powered-off", true,
+                                          errp)) {
                 return;
             }
         }
         if (!s->cpu_fpu[i]) {
-            object_property_set_bool(cpuobj, "vfp", false, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!object_property_set_bool(cpuobj, "vfp", false, errp)) {
                 return;
             }
         }
         if (!s->cpu_dsp[i]) {
-            object_property_set_bool(cpuobj, "dsp", false, &err);
-            if (err) {
-                error_propagate(errp, err);
+            if (!object_property_set_bool(cpuobj, "dsp", false, errp)) {
                 return;
             }
         }
@@ -603,10 +598,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                 DeviceState *devs = DEVICE(splitter);
                 int cpunum;
 
-                object_property_set_int(splitter, "num-lines", info->num_cpus,
-                                        &err);
-                if (err) {
-                    error_propagate(errp, err);
+                if (!object_property_set_int(splitter, "num-lines",
+                                             info->num_cpus, errp)) {
                     return;
                 }
                 if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
@@ -655,10 +648,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * multiple lines, one for each of the PPCs within the ARMSSE and one
      * that will be an output from the ARMSSE to the system.
      */
-    object_property_set_int(OBJECT(&s->sec_resp_splitter), "num-lines", 3,
-                            &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->sec_resp_splitter),
+                                 "num-lines", 3, errp)) {
         return;
     }
     if (!qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, errp)) {
@@ -697,10 +688,9 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* We must OR together lines from the MPC splitters to go to the NVIC */
-    object_property_set_int(OBJECT(&s->mpc_irq_orgate), "num-lines",
-                            IOTS_NUM_EXP_MPC + info->sram_banks, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->mpc_irq_orgate), "num-lines",
+                                 IOTS_NUM_EXP_MPC + info->sram_banks,
+                                 errp)) {
         return;
     }
     if (!qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, errp)) {
@@ -830,10 +820,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
      * ones) are sent individually to the security controller, and also
      * ORed together to give a single combined PPC interrupt to the NVIC.
      */
-    object_property_set_int(OBJECT(&s->ppc_irq_orgate), "num-lines", NUM_PPCS,
-                            &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->ppc_irq_orgate),
+                                 "num-lines", NUM_PPCS, errp)) {
         return;
     }
     if (!qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, errp)) {
@@ -932,16 +920,12 @@ static void armsse_realize(DeviceState *dev, Error **errp)
                           qdev_get_gpio_in_named(dev_apb_ppc1,
                                                  "cfg_sec_resp", 0));
 
-    object_property_set_int(OBJECT(&s->sysinfo), "SYS_VERSION",
-                            info->sys_version, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->sysinfo), "SYS_VERSION",
+                                 info->sys_version, errp)) {
         return;
     }
-    object_property_set_int(OBJECT(&s->sysinfo), "SYS_CONFIG",
-                            armsse_sys_config_value(s, info), &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->sysinfo), "SYS_CONFIG",
+                                 armsse_sys_config_value(s, info), errp)) {
         return;
     }
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), errp)) {
@@ -986,9 +970,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* This OR gate wires together outputs from the secure watchdogs to NMI */
-    object_property_set_int(OBJECT(&s->nmi_orgate), "num-lines", 2, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->nmi_orgate), "num-lines", 2,
+                                 errp)) {
         return;
     }
     if (!qdev_realize(DEVICE(&s->nmi_orgate), NULL, errp)) {
@@ -1026,9 +1009,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
     for (i = 0; i < ARRAY_SIZE(s->ppc_irq_splitter); i++) {
         Object *splitter = OBJECT(&s->ppc_irq_splitter[i]);
 
-        object_property_set_int(splitter, "num-lines", 2, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_int(splitter, "num-lines", 2, errp)) {
             return;
         }
         if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
@@ -1071,9 +1052,8 @@ static void armsse_realize(DeviceState *dev, Error **errp)
         SplitIRQ *splitter = &s->mpc_irq_splitter[i];
         DeviceState *dev_splitter = DEVICE(splitter);
 
-        object_property_set_int(OBJECT(splitter), "num-lines", 2, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_int(OBJECT(splitter), "num-lines", 2,
+                                     errp)) {
             return;
         }
         if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index c42baeecbb..aa831d6653 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -174,32 +174,24 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
                                  &error_abort);
     }
     if (object_property_find(OBJECT(s->cpu), "init-svtor", NULL)) {
-        object_property_set_uint(OBJECT(s->cpu), "init-svtor", s->init_svtor,
-                                 &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(OBJECT(s->cpu), "init-svtor",
+                                      s->init_svtor, errp)) {
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "start-powered-off", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), "start-powered-off",
-                                 s->start_powered_off, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!object_property_set_bool(OBJECT(s->cpu), "start-powered-off",
+                                      s->start_powered_off, errp)) {
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "vfp", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), "vfp", s->vfp, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!object_property_set_bool(OBJECT(s->cpu), "vfp", s->vfp, errp)) {
             return;
         }
     }
     if (object_property_find(OBJECT(s->cpu), "dsp", NULL)) {
-        object_property_set_bool(OBJECT(s->cpu), "dsp", s->dsp, &err);
-        if (err != NULL) {
-            error_propagate(errp, err);
+        if (!object_property_set_bool(OBJECT(s->cpu), "dsp", s->dsp, errp)) {
             return;
         }
     }
@@ -241,9 +233,8 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
             Object *obj = OBJECT(&s->bitband[i]);
             SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]);
 
-            object_property_set_int(obj, "base", bitband_input_addr[i], &err);
-            if (err != NULL) {
-                error_propagate(errp, err);
+            if (!object_property_set_int(obj, "base",
+                                         bitband_input_addr[i], errp)) {
                 return;
             }
             object_property_set_link(obj, "source-memory",
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index 4d25d550c5..3767f7d8d0 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -351,10 +351,8 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     /* FMC, The number of CS is set at the board level */
     object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(s->dram_mr),
                              &error_abort);
-    object_property_set_int(OBJECT(&s->fmc), "sdram-base",
-                            sc->memmap[ASPEED_SDRAM], &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->fmc), "sdram-base",
+                                 sc->memmap[ASPEED_SDRAM], errp)) {
         return;
     }
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 8d2cbf3715..a1a8684216 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -302,10 +302,8 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     /* FMC, The number of CS is set at the board level */
     object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(s->dram_mr),
                              &error_abort);
-    object_property_set_int(OBJECT(&s->fmc), "sdram-base",
-                            sc->memmap[ASPEED_SDRAM], &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(&s->fmc), "sdram-base",
+                                 sc->memmap[ASPEED_SDRAM], errp)) {
         return;
     }
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index b2a939a100..a9d7f53f6e 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -217,10 +217,8 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    object_property_set_uint(OBJECT(&s->fb), "vcram-base",
-                             ram_size - vcram_size, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_uint(OBJECT(&s->fb), "vcram-base",
+                                  ram_size - vcram_size, errp)) {
         return;
     }
 
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 5008037395..f15cc3b405 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -72,7 +72,6 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
     BCM283XClass *bc = BCM283X_GET_CLASS(dev);
     const BCM283XInfo *info = bc->info;
     Object *obj;
-    Error *err = NULL;
     int n;
 
     /* common peripherals from bcm2835 */
@@ -108,18 +107,16 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
         s->cpu[n].core.mp_affinity = (info->clusterid << 8) | n;
 
         /* set periphbase/CBAR value for CPU-local registers */
-        object_property_set_int(OBJECT(&s->cpu[n].core), "reset-cbar",
-                                info->peri_base, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_int(OBJECT(&s->cpu[n].core), "reset-cbar",
+                                     info->peri_base, errp)) {
             return;
         }
 
         /* start powered off if not enabled */
-        object_property_set_bool(OBJECT(&s->cpu[n].core), "start-powered-off",
-                                 n >= s->enabled_cpus, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_bool(OBJECT(&s->cpu[n].core),
+                                      "start-powered-off",
+                                      n >= s->enabled_cpus,
+                                      errp)) {
             return;
         }
 
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 302919246b..1c6c792eb6 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -62,20 +62,19 @@ static void cubieboard_init(MachineState *machine)
     object_property_add_child(OBJECT(machine), "soc", OBJECT(a10));
     object_unref(OBJECT(a10));
 
-    object_property_set_int(OBJECT(&a10->emac), "phy-addr", 1, &err);
-    if (err != NULL) {
+    if (!object_property_set_int(OBJECT(&a10->emac), "phy-addr", 1, &err)) {
         error_reportf_err(err, "Couldn't set phy address: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&a10->timer), "clk0-freq", 32768, &err);
-    if (err != NULL) {
+    if (!object_property_set_int(OBJECT(&a10->timer), "clk0-freq", 32768,
+                                 &err)) {
         error_reportf_err(err, "Couldn't set clk0 frequency: ");
         exit(1);
     }
 
-    object_property_set_int(OBJECT(&a10->timer), "clk1-freq", 24000000, &err);
-    if (err != NULL) {
+    if (!object_property_set_int(OBJECT(&a10->timer), "clk1-freq", 24000000,
+                                 &err)) {
         error_reportf_err(err, "Couldn't set clk1 frequency: ");
         exit(1);
     }
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index d5109ab938..614232165c 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -52,13 +52,11 @@ static void digic_init(Object *obj)
 static void digic_realize(DeviceState *dev, Error **errp)
 {
     DigicState *s = DIGIC(dev);
-    Error *err = NULL;
     SysBusDevice *sbd;
     int i;
 
-    object_property_set_bool(OBJECT(&s->cpu), "reset-hivecs", true, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!object_property_set_bool(OBJECT(&s->cpu), "reset-hivecs", true,
+                                  errp)) {
         return;
     }
 
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
index a5f8806577..45e6cc97d7 100644
--- a/hw/arm/nrf51_soc.c
+++ b/hw/arm/nrf51_soc.c
@@ -103,10 +103,8 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
                        BASE_TO_IRQ(NRF51_RNG_BASE)));
 
     /* UICR, FICR, NVMC, FLASH */
-    object_property_set_uint(OBJECT(&s->nvm), "flash-size", s->flash_size,
-                             &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_uint(OBJECT(&s->nvm), "flash-size",
+                                  s->flash_size, errp)) {
         return;
     }
 
@@ -136,9 +134,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
 
     /* TIMER */
     for (i = 0; i < NRF51_NUM_TIMERS; i++) {
-        object_property_set_uint(OBJECT(&s->timer[i]), "id", i, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(OBJECT(&s->timer[i]), "id", i, errp)) {
             return;
         }
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
index 282bc6f36c..cb04c11198 100644
--- a/hw/arm/stm32f405_soc.c
+++ b/hw/arm/stm32f405_soc.c
@@ -156,11 +156,9 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
     }
 
     /* ADC device, the IRQs are ORed together */
-    object_initialize_child_with_props(OBJECT(s), "adc-orirq", &s->adc_irqs,
-                                       sizeof(s->adc_irqs), TYPE_OR_IRQ, &err,
-                                       NULL);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!object_initialize_child_with_props(OBJECT(s), "adc-orirq",
+                                            &s->adc_irqs, sizeof(s->adc_irqs),
+                                            TYPE_OR_IRQ, errp, NULL)) {
         return;
     }
     object_property_set_int(OBJECT(&s->adc_irqs), "num-lines", STM_NUM_ADCS,
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
index 48bbb5066e..772cfa3771 100644
--- a/hw/arm/xlnx-zynqmp.c
+++ b/hw/arm/xlnx-zynqmp.c
@@ -500,19 +500,14 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
          * - SDIO Specification Version 3.0
          * - eMMC Specification Version 4.51
          */
-        object_property_set_uint(sdhci, "sd-spec-version", 3, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(sdhci, "sd-spec-version", 3, errp)) {
             return;
         }
-        object_property_set_uint(sdhci, "capareg", SDHCI_CAPABILITIES, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(sdhci, "capareg", SDHCI_CAPABILITIES,
+                                      errp)) {
             return;
         }
-        object_property_set_uint(sdhci, "uhs", UHS_I, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(sdhci, "uhs", UHS_I, errp)) {
             return;
         }
         if (!sysbus_realize(SYS_BUS_DEVICE(sdhci), errp)) {
@@ -592,9 +587,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
     sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0, gic_spi[RTC_IRQ]);
 
     for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
-        object_property_set_uint(OBJECT(&s->gdma[i]), "bus-width", 128, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(OBJECT(&s->gdma[i]), "bus-width", 128,
+                                      errp)) {
             return;
         }
         if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
index 1b323b44d9..a775fba7c0 100644
--- a/hw/block/xen-block.c
+++ b/hw/block/xen-block.c
@@ -931,22 +931,21 @@ static void xen_block_device_create(XenBackendInstance *backend,
     xendev = XEN_DEVICE(qdev_new(type));
     blockdev = XEN_BLOCK_DEVICE(xendev);
 
-    object_property_set_str(OBJECT(xendev), "vdev", vdev, &local_err);
-    if (local_err) {
+    if (!object_property_set_str(OBJECT(xendev), "vdev", vdev,
+                                 &local_err)) {
         error_propagate_prepend(errp, local_err, "failed to set 'vdev': ");
         goto fail;
     }
 
-    object_property_set_str(OBJECT(xendev), "drive",
-                            xen_block_drive_get_node_name(drive), &local_err);
-    if (local_err) {
+    if (!object_property_set_str(OBJECT(xendev), "drive",
+                                 xen_block_drive_get_node_name(drive),
+                                 &local_err)) {
         error_propagate_prepend(errp, local_err, "failed to set 'drive': ");
         goto fail;
     }
 
-    object_property_set_str(OBJECT(xendev), "iothread", iothread->id,
-                            &local_err);
-    if (local_err) {
+    if (!object_property_set_str(OBJECT(xendev), "iothread", iothread->id,
+                                 &local_err)) {
         error_propagate_prepend(errp, local_err,
                                 "failed to set 'iothread': ");
         goto fail;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 8de99f6ba5..17bd8fc2ec 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -386,8 +386,6 @@ void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
  */
 bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
 {
-    Error *err = NULL;
-
     assert(!dev->realized && !dev->parent_bus);
 
     if (bus) {
@@ -396,11 +394,7 @@ bool qdev_realize(DeviceState *dev, BusState *bus, Error **errp)
         assert(!DEVICE_GET_CLASS(dev)->bus_type);
     }
 
-    object_property_set_bool(OBJECT(dev), "realized", true, &err);
-    if (err) {
-        error_propagate(errp, err);
-    }
-    return !err;
+    return object_property_set_bool(OBJECT(dev), "realized", true, errp);
 }
 
 /*
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 88ec4cbe5f..5bdeec700e 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -501,13 +501,11 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
 {
     PnvPsi *psi = PNV_PSI(dev);
     ICSState *ics = &PNV8_PSI(psi)->ics;
-    Error *err = NULL;
     unsigned int i;
 
     /* Create PSI interrupt control source */
-    object_property_set_int(OBJECT(ics), "nr-irqs", PSI_NUM_INTERRUPTS, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!object_property_set_int(OBJECT(ics), "nr-irqs", PSI_NUM_INTERRUPTS,
+                                 errp)) {
         return;
     }
     if (!qdev_realize(DEVICE(ics), NULL, errp)) {
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index 053944be15..b23956b42e 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -820,8 +820,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
         return NULL;
     }
 
-    object_property_set_str(OBJECT(dev), "target", target, &local_err);
-    if (local_err) {
+    if (!object_property_set_str(OBJECT(dev), "target", target, &local_err)) {
         object_unparent(OBJECT(dev));
         error_propagate_prepend(errp, local_err,
                                 "zPCI device could not be created: ");
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index be4859fa49..62af349c31 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -71,8 +71,7 @@ static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
     S390CPU *cpu = S390_CPU(object_new(typename));
     Error *err = NULL;
 
-    object_property_set_int(OBJECT(cpu), "core-id", core_id, &err);
-    if (err != NULL) {
+    if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, &err)) {
         goto out;
     }
     qdev_realize(DEVICE(cpu), NULL, &err);
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 9951c2bca7..b937df16bc 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -283,9 +283,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
         object_unparent(OBJECT(dev));
         return NULL;
     }
-    object_property_set_bool(OBJECT(dev), "share-rw", share_rw, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!object_property_set_bool(OBJECT(dev), "share-rw", share_rw, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
index 562795cfdb..22cafce0fb 100644
--- a/hw/sd/aspeed_sdhci.c
+++ b/hw/sd/aspeed_sdhci.c
@@ -115,7 +115,6 @@ static void aspeed_sdhci_set_irq(void *opaque, int n, int level)
 
 static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
 {
-    Error *err = NULL;
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
 
@@ -132,16 +131,12 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
         Object *sdhci_slot = OBJECT(&sdhci->slots[i]);
         SysBusDevice *sbd_slot = SYS_BUS_DEVICE(&sdhci->slots[i]);
 
-        object_property_set_int(sdhci_slot, "sd-spec-version", 2, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_int(sdhci_slot, "sd-spec-version", 2, errp)) {
             return;
         }
 
-        object_property_set_uint(sdhci_slot, "capareg",
-                                 ASPEED_SDHCI_CAPABILITIES, &err);
-        if (err) {
-            error_propagate(errp, err);
+        if (!object_property_set_uint(sdhci_slot, "capareg",
+                                      ASPEED_SDHCI_CAPABILITIES, errp)) {
             return;
         }
 
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index cf17568f76..4d91f603fa 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -261,8 +261,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
         }
     }
 
-    object_property_set_bool(OBJECT(carddev), "spi", true, &err);
-    if (err) {
+    if (!object_property_set_bool(OBJECT(carddev), "spi", true, &err)) {
         goto fail;
     }
 
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
index 85f7163e2d..5721c8ebfb 100644
--- a/hw/virtio/virtio-rng.c
+++ b/hw/virtio/virtio-rng.c
@@ -176,7 +176,6 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIORNG *vrng = VIRTIO_RNG(dev);
-    Error *local_err = NULL;
 
     if (vrng->conf.period_ms <= 0) {
         error_setg(errp, "'period' parameter expects a positive integer");
@@ -194,10 +193,7 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
     if (vrng->conf.rng == NULL) {
         Object *default_backend = object_new(TYPE_RNG_BUILTIN);
 
-        user_creatable_complete(USER_CREATABLE(default_backend),
-                                &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!user_creatable_complete(USER_CREATABLE(default_backend), errp)) {
             object_unref(default_backend);
             return;
         }
diff --git a/qdev-monitor.c b/qdev-monitor.c
index f3b5660c84..2db38b18af 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -176,16 +176,13 @@ static int set_property(void *opaque, const char *name, const char *value,
                         Error **errp)
 {
     Object *obj = opaque;
-    Error *err = NULL;
 
     if (strcmp(name, "driver") == 0)
         return 0;
     if (strcmp(name, "bus") == 0)
         return 0;
 
-    object_property_parse(obj, name, value, &err);
-    if (err != NULL) {
-        error_propagate(errp, err);
+    if (!object_property_parse(obj, name, value, errp)) {
         return -1;
     }
     return 0;
diff --git a/qom/object.c b/qom/object.c
index 46406ba84a..eb814e41be 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -405,8 +405,7 @@ bool object_apply_global_props(Object *obj, const GPtrArray *props,
             continue;
         }
         p->used = true;
-        object_property_parse(obj, p->property, p->value, &err);
-        if (err != NULL) {
+        if (!object_property_parse(obj, p->property, p->value, &err)) {
             error_prepend(&err, "can't apply global %s.%s=%s: ",
                           p->driver, p->property, p->value);
             /*
@@ -564,8 +563,7 @@ bool object_initialize_child_with_propsv(Object *parentobj,
 
     uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
     if (uc) {
-        user_creatable_complete(uc, &local_err);
-        if (local_err) {
+        if (!user_creatable_complete(uc, &local_err)) {
             object_unparent(obj);
             goto out;
         }
@@ -762,8 +760,7 @@ Object *object_new_with_propv(const char *typename,
 
     uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
     if (uc) {
-        user_creatable_complete(uc, &local_err);
-        if (local_err) {
+        if (!user_creatable_complete(uc, &local_err)) {
             if (id != NULL) {
                 object_unparent(obj);
             }
@@ -801,16 +798,13 @@ int object_set_propv(Object *obj,
                      va_list vargs)
 {
     const char *propname;
-    Error *local_err = NULL;
 
     propname = va_arg(vargs, char *);
     while (propname != NULL) {
         const char *value = va_arg(vargs, char *);
 
         g_assert(value != NULL);
-        object_property_parse(obj, propname, value, &local_err);
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!object_property_parse(obj, propname, value, errp)) {
             return -1;
         }
         propname = va_arg(vargs, char *);
@@ -1589,12 +1583,9 @@ char *object_property_print(Object *obj, const char *name, bool human,
 {
     Visitor *v;
     char *string = NULL;
-    Error *local_err = NULL;
 
     v = string_output_visitor_new(human, &string);
-    object_property_get(obj, name, v, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!object_property_get(obj, name, v, errp)) {
         goto out;
     }
 
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 382198504c..15fff66c3c 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -70,8 +70,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
         goto out;
     }
     for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
-        object_property_set(obj, e->key, v, &local_err);
-        if (local_err) {
+        if (!object_property_set(obj, e->key, v, &local_err)) {
             break;
         }
     }
@@ -88,8 +87,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
                                   id, obj);
     }
 
-    user_creatable_complete(USER_CREATABLE(obj), &local_err);
-    if (local_err) {
+    if (!user_creatable_complete(USER_CREATABLE(obj), &local_err)) {
         if (id != NULL) {
             object_property_del(object_get_objects_root(), id);
         }
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 4903129867..df0b895ea7 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2444,16 +2444,11 @@ static int object_parse_property_opt(Object *obj,
                                      const char *name, const char *value,
                                      const char *skip, Error **errp)
 {
-    Error *local_err = NULL;
-
     if (g_str_equal(name, skip)) {
         return 0;
     }
 
-    object_property_parse(obj, name, value, &local_err);
-
-    if (local_err) {
-        error_propagate(errp, local_err);
+    if (!object_property_parse(obj, name, value, errp)) {
         return -1;
     }
 
diff --git a/target/arm/monitor.c b/target/arm/monitor.c
index 7f0cc21e6d..ba6e01abd0 100644
--- a/target/arm/monitor.c
+++ b/target/arm/monitor.c
@@ -183,8 +183,7 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
         i = 0;
         while ((name = cpu_model_advertised_features[i++]) != NULL) {
             if (qdict_get(qdict_in, name)) {
-                object_property_set(obj, name, visitor, &err);
-                if (err) {
+                if (!object_property_set(obj, name, visitor, &err)) {
                     break;
                 }
             }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index de59d96db5..26ba40656d 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -5254,9 +5254,8 @@ static void object_apply_props(Object *obj, QDict *props, Error **errp)
     Error *err = NULL;
 
     for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
-        object_property_set_qobject(obj, qdict_entry_key(prop),
-                                    qdict_entry_value(prop), &err);
-        if (err) {
+        if (!object_property_set_qobject(obj, qdict_entry_key(prop),
+                                         qdict_entry_value(prop), &err)) {
             break;
         }
     }
@@ -6323,16 +6322,14 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
 
     for (l = plus_features; l; l = l->next) {
         const char *prop = l->data;
-        object_property_set_bool(OBJECT(cpu), prop, true, &local_err);
-        if (local_err) {
+        if (!object_property_set_bool(OBJECT(cpu), prop, true, &local_err)) {
             goto out;
         }
     }
 
     for (l = minus_features; l; l = l->next) {
         const char *prop = l->data;
-        object_property_set_bool(OBJECT(cpu), prop, false, &local_err);
-        if (local_err) {
+        if (!object_property_set_bool(OBJECT(cpu), prop, false, &local_err)) {
             goto out;
         }
     }
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 4cd08621bd..c2af226174 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -516,8 +516,7 @@ static void cpu_model_from_info(S390CPUModel *model, const CpuModelInfo *info,
             return;
         }
         for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
-            object_property_set(obj, e->key, visitor, &err);
-            if (err) {
+            if (!object_property_set(obj, e->key, visitor, &err)) {
                 break;
             }
         }
-- 
2.26.2



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

* [PATCH 39/46] qom: Smooth error checking manually
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (37 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 38/46] qom: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:38   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1 Markus Armbruster
                   ` (7 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When foo(..., &err) is followed by error_propagate(errp, err), we can
often just as well do foo(..., errp).  The previous commit did that
for simple cases with Coccinelle.  Do it for a few more manually.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/core/bus.c              |  6 +-----
 hw/s390x/s390-virtio-ccw.c | 15 +++++++--------
 qom/object.c               |  9 ++-------
 qom/qom-qobject.c          |  5 +----
 target/i386/cpu.c          | 19 +++++--------------
 5 files changed, 16 insertions(+), 38 deletions(-)

diff --git a/hw/core/bus.c b/hw/core/bus.c
index 00d1d31762..6b987b6946 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -166,11 +166,7 @@ BusState *qbus_create(const char *typename, DeviceState *parent, const char *nam
 
 bool qbus_realize(BusState *bus, Error **errp)
 {
-    Error *err = NULL;
-
-    object_property_set_bool(OBJECT(bus), "realized", true, &err);
-    error_propagate(errp, err);
-    return !err;
+    return object_property_set_bool(OBJECT(bus), "realized", true, errp);
 }
 
 void qbus_unrealize(BusState *bus)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 62af349c31..877ea2af9d 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -69,20 +69,19 @@ static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
                               Error **errp)
 {
     S390CPU *cpu = S390_CPU(object_new(typename));
-    Error *err = NULL;
+    S390CPU *ret = NULL;
 
-    if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, &err)) {
+    if (!object_property_set_int(OBJECT(cpu), "core-id", core_id, errp)) {
         goto out;
     }
-    qdev_realize(DEVICE(cpu), NULL, &err);
+    if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
+        goto out;
+    }
+    ret = cpu;
 
 out:
     object_unref(OBJECT(cpu));
-    if (err) {
-        error_propagate(errp, err);
-        cpu = NULL;
-    }
-    return cpu;
+    return ret;
 }
 
 static void s390_init_cpus(MachineState *machine)
diff --git a/qom/object.c b/qom/object.c
index eb814e41be..684540a09f 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -547,7 +547,6 @@ bool object_initialize_child_with_propsv(Object *parentobj,
                               void *childobj, size_t size, const char *type,
                               Error **errp, va_list vargs)
 {
-    Error *local_err = NULL;
     bool ok = false;
     Object *obj;
     UserCreatable *uc;
@@ -563,7 +562,7 @@ bool object_initialize_child_with_propsv(Object *parentobj,
 
     uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
     if (uc) {
-        if (!user_creatable_complete(uc, &local_err)) {
+        if (!user_creatable_complete(uc, errp)) {
             object_unparent(obj);
             goto out;
         }
@@ -581,8 +580,6 @@ out:
      * the reference taken by object_property_add_child().
      */
     object_unref(obj);
-
-    error_propagate(errp, local_err);
     return ok;
 }
 
@@ -735,7 +732,6 @@ Object *object_new_with_propv(const char *typename,
 {
     Object *obj;
     ObjectClass *klass;
-    Error *local_err = NULL;
     UserCreatable *uc;
 
     klass = object_class_by_name(typename);
@@ -760,7 +756,7 @@ Object *object_new_with_propv(const char *typename,
 
     uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
     if (uc) {
-        if (!user_creatable_complete(uc, &local_err)) {
+        if (!user_creatable_complete(uc, errp)) {
             if (id != NULL) {
                 object_unparent(obj);
             }
@@ -772,7 +768,6 @@ Object *object_new_with_propv(const char *typename,
     return obj;
 
  error:
-    error_propagate(errp, local_err);
     object_unref(obj);
     return NULL;
 }
diff --git a/qom/qom-qobject.c b/qom/qom-qobject.c
index 62ac5e07ac..21ce22de94 100644
--- a/qom/qom-qobject.c
+++ b/qom/qom-qobject.c
@@ -34,15 +34,12 @@ QObject *object_property_get_qobject(Object *obj, const char *name,
                                      Error **errp)
 {
     QObject *ret = NULL;
-    Error *local_err = NULL;
     Visitor *v;
 
     v = qobject_output_visitor_new(&ret);
-    object_property_get(obj, name, v, &local_err);
-    if (!local_err) {
+    if (object_property_get(obj, name, v, errp)) {
         visit_complete(v, &ret);
     }
-    error_propagate(errp, local_err);
     visit_free(v);
     return ret;
 }
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 26ba40656d..b7c9f0fa72 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -5251,16 +5251,13 @@ static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
 static void object_apply_props(Object *obj, QDict *props, Error **errp)
 {
     const QDictEntry *prop;
-    Error *err = NULL;
 
     for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
         if (!object_property_set_qobject(obj, qdict_entry_key(prop),
-                                         qdict_entry_value(prop), &err)) {
+                                         qdict_entry_value(prop), errp)) {
             break;
         }
     }
-
-    error_propagate(errp, err);
 }
 
 /* Create X86CPU object according to model+props specification */
@@ -6318,19 +6315,18 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
     FeatureWord w;
     int i;
     GList *l;
-    Error *local_err = NULL;
 
     for (l = plus_features; l; l = l->next) {
         const char *prop = l->data;
-        if (!object_property_set_bool(OBJECT(cpu), prop, true, &local_err)) {
-            goto out;
+        if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
+            return;
         }
     }
 
     for (l = minus_features; l; l = l->next) {
         const char *prop = l->data;
-        if (!object_property_set_bool(OBJECT(cpu), prop, false, &local_err)) {
-            goto out;
+        if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
+            return;
         }
     }
 
@@ -6428,11 +6424,6 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
     if (env->cpuid_xlevel2 == UINT32_MAX) {
         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
     }
-
-out:
-    if (local_err != NULL) {
-        error_propagate(errp, local_err);
-    }
 }
 
 /*
-- 
2.26.2



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

* [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (38 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 39/46] qom: Smooth error checking manually Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:40   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void Markus Armbruster
                   ` (6 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Just for consistency.  Also fix the example in object_set_props()'s
documentation.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qom/object.h | 28 +++++++++++-----------------
 qom/object.c         | 14 +++++++-------
 2 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index b2d2558245..d74ede4eac 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -729,15 +729,13 @@ void object_apply_compat_props(Object *obj);
  *   Error *err = NULL;
  *   Object *obj = ...get / create object...;
  *
- *   obj = object_set_props(obj,
- *                          &err,
- *                          "share", "yes",
- *                          "mem-path", "/dev/shm/somefile",
- *                          "prealloc", "yes",
- *                          "size", "1048576",
- *                          NULL);
- *
- *   if (!obj) {
+ *   if (!object_set_props(obj,
+ *                         &err,
+ *                         "share", "yes",
+ *                         "mem-path", "/dev/shm/somefile",
+ *                         "prealloc", "yes",
+ *                         "size", "1048576",
+ *                         NULL)) {
  *     error_reportf_err(err, "Cannot set properties: ");
  *   }
  *   </programlisting>
@@ -746,11 +744,9 @@ void object_apply_compat_props(Object *obj);
  * The returned object will have one stable reference maintained
  * for as long as it is present in the object hierarchy.
  *
- * Returns: -1 on error, 0 on success
+ * Returns: %true on success, %false on error.
  */
-int object_set_props(Object *obj,
-                     Error **errp,
-                     ...) QEMU_SENTINEL;
+bool object_set_props(Object *obj, Error **errp, ...) QEMU_SENTINEL;
 
 /**
  * object_set_propv:
@@ -760,11 +756,9 @@ int object_set_props(Object *obj,
  *
  * See object_set_props() for documentation.
  *
- * Returns: -1 on error, 0 on success
+ * Returns: %true on success, %false on error.
  */
-int object_set_propv(Object *obj,
-                     Error **errp,
-                     va_list vargs);
+bool object_set_propv(Object *obj, Error **errp, va_list vargs);
 
 /**
  * object_initialize:
diff --git a/qom/object.c b/qom/object.c
index 684540a09f..9b479621e4 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -554,7 +554,7 @@ bool object_initialize_child_with_propsv(Object *parentobj,
     object_initialize(childobj, size, type);
     obj = OBJECT(childobj);
 
-    if (object_set_propv(obj, errp, vargs) < 0) {
+    if (!object_set_propv(obj, errp, vargs)) {
         goto out;
     }
 
@@ -746,7 +746,7 @@ Object *object_new_with_propv(const char *typename,
     }
     obj = object_new_with_type(klass->type);
 
-    if (object_set_propv(obj, errp, vargs) < 0) {
+    if (!object_set_propv(obj, errp, vargs)) {
         goto error;
     }
 
@@ -773,12 +773,12 @@ Object *object_new_with_propv(const char *typename,
 }
 
 
-int object_set_props(Object *obj,
+bool object_set_props(Object *obj,
                      Error **errp,
                      ...)
 {
     va_list vargs;
-    int ret;
+    bool ret;
 
     va_start(vargs, errp);
     ret = object_set_propv(obj, errp, vargs);
@@ -788,7 +788,7 @@ int object_set_props(Object *obj,
 }
 
 
-int object_set_propv(Object *obj,
+bool object_set_propv(Object *obj,
                      Error **errp,
                      va_list vargs)
 {
@@ -800,12 +800,12 @@ int object_set_propv(Object *obj,
 
         g_assert(value != NULL);
         if (!object_property_parse(obj, propname, value, errp)) {
-            return -1;
+            return false;
         }
         propname = va_arg(vargs, char *);
     }
 
-    return 0;
+    return true;
 }
 
 
-- 
2.26.2



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

* [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (39 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1 Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:40   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 42/46] qdev: Smooth error checking with Coccinelle Markus Armbruster
                   ` (5 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

See recent commit "error: Document Error API usage rules" for
rationale.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/hw/qdev-properties.h     | 4 ++--
 hw/core/qdev-properties-system.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index 49c6cd2460..f12ab9e6bc 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -236,8 +236,8 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
 /*
  * Set properties between creation and realization.
  */
-void qdev_prop_set_drive_err(DeviceState *dev, const char *name,
-                         BlockBackend *value, Error **errp);
+bool qdev_prop_set_drive_err(DeviceState *dev, const char *name,
+                             BlockBackend *value, Error **errp);
 
 /*
  * Set properties between creation and realization.
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index abd851656f..3e4f16fc21 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -413,7 +413,7 @@ const PropertyInfo qdev_prop_audiodev = {
     .set = set_audiodev,
 };
 
-void qdev_prop_set_drive_err(DeviceState *dev, const char *name,
+bool qdev_prop_set_drive_err(DeviceState *dev, const char *name,
                              BlockBackend *value, Error **errp)
 {
     const char *ref = "";
@@ -428,7 +428,7 @@ void qdev_prop_set_drive_err(DeviceState *dev, const char *name,
         }
     }
 
-    object_property_set_str(OBJECT(dev), name, ref, errp);
+    return object_property_set_str(OBJECT(dev), name, ref, errp);
 }
 
 void qdev_prop_set_drive(DeviceState *dev, const char *name,
-- 
2.26.2



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

* [PATCH 42/46] qdev: Smooth error checking with Coccinelle
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (40 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:41   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 43/46] qdev: Smooth error checking manually Markus Armbruster
                   ` (4 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

The previous commit enables conversion of

    qdev_prop_set_drive_err(..., &err);
    if (err) {
    ...
    }

to

    if (!qdev_prop_set_drive_err(..., errp)) {
    ...
    }

Coccinelle script:

    @@
    identifier fun = qdev_prop_set_drive_err;
    expression list args, args2;
    typedef Error;
    Error *err;
    identifier errp;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, errp, args2)) {
	       ... when != err
    -	   error_propagate(errp, err);
	       ...
	   }

    @@
    identifier fun = qdev_prop_set_drive_err;
    expression list args, args2;
    typedef Error;
    Error *err;
    @@
    -      fun(args, &err, args2);
    -      if (err) {
    +      if (!fun(args, &err, args2)) {
	       ...
	   }

Eliminate error_propagate() that are now unnecessary.  Delete @err
that are now unused.  Tidy up line breaks and whitespace.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/scsi/scsi-bus.c | 5 +----
 hw/sd/sd.c         | 3 +--
 hw/sd/ssi-sd.c     | 5 ++---
 3 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index b937df16bc..df65cc2223 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -248,7 +248,6 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     const char *driver;
     char *name;
     DeviceState *dev;
-    Error *err = NULL;
     DriveInfo *dinfo;
 
     if (blk_is_sg(blk)) {
@@ -277,9 +276,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
     if (serial && object_property_find(OBJECT(dev), "serial", NULL)) {
         qdev_prop_set_string(dev, "serial", serial);
     }
-    qdev_prop_set_drive_err(dev, "drive", blk, &err);
-    if (err) {
-        error_propagate(errp, err);
+    if (!qdev_prop_set_drive_err(dev, "drive", blk, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 97a9d32964..5137168d66 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -706,8 +706,7 @@ SDState *sd_init(BlockBackend *blk, bool is_spi)
 
     obj = object_new(TYPE_SD_CARD);
     dev = DEVICE(obj);
-    qdev_prop_set_drive_err(dev, "drive", blk, &err);
-    if (err) {
+    if (!qdev_prop_set_drive_err(dev, "drive", blk, &err)) {
         error_reportf_err(err, "sd_init failed: ");
         return NULL;
     }
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
index 4d91f603fa..e0fb9f3093 100644
--- a/hw/sd/ssi-sd.c
+++ b/hw/sd/ssi-sd.c
@@ -254,9 +254,8 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
     dinfo = drive_get_next(IF_SD);
     carddev = qdev_new(TYPE_SD_CARD);
     if (dinfo) {
-        qdev_prop_set_drive_err(carddev, "drive", blk_by_legacy_dinfo(dinfo),
-                                &err);
-        if (err) {
+        if (!qdev_prop_set_drive_err(carddev, "drive",
+                                     blk_by_legacy_dinfo(dinfo), &err)) {
             goto fail;
         }
     }
-- 
2.26.2



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

* [PATCH 43/46] qdev: Smooth error checking manually
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (41 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 42/46] qdev: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:42   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices Markus Armbruster
                   ` (3 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

When foo(..., &err) is followed by error_propagate(errp, err), we can
often just as well do foo(..., errp).  The previous commit did that
for simple cases with Coccinelle.  Do it for one more manually.

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

diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index fe0ae2d146..a0670c0aa0 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -2527,7 +2527,7 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
     FDrive *drive;
     DeviceState *dev;
     BlockBackend *blk;
-    Error *local_err = NULL;
+    bool ok;
     const char *fdc_name, *drive_suffix;
 
     for (i = 0; i < MAX_FD; i++) {
@@ -2566,11 +2566,9 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
         blk_ref(blk);
         blk_detach_dev(blk, fdc_dev);
         fdctrl->qdev_for_drives[i].blk = NULL;
-        qdev_prop_set_drive_err(dev, "drive", blk, &local_err);
+        ok = qdev_prop_set_drive_err(dev, "drive", blk, errp);
         blk_unref(blk);
-
-        if (local_err) {
-            error_propagate(errp, local_err);
+        if (!ok) {
             return;
         }
 
-- 
2.26.2



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

* [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (42 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 43/46] qdev: Smooth error checking manually Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:49   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 45/46] qdev: " Markus Armbruster
                   ` (2 subsequent siblings)
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

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

diff --git a/qemu-img.c b/qemu-img.c
index 27bf94e7ae..c11bfe0268 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -464,22 +464,18 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
                                  const char *base_filename,
                                  const char *base_fmt)
 {
-    Error *err = NULL;
-
     if (base_filename) {
         if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
-                          &err)) {
+                          NULL)) {
             error_report("Backing file not supported for file format '%s'",
                          fmt);
-            error_free(err);
             return -1;
         }
     }
     if (base_fmt) {
-        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err)) {
+        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, NULL)) {
             error_report("Backing file format not supported for file "
                          "format '%s'", fmt);
-            error_free(err);
             return -1;
         }
     }
-- 
2.26.2



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

* [PATCH 45/46] qdev: Ignore Error objects where the return value suffices
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (43 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:50   ` Eric Blake
  2020-06-24 16:43 ` [PATCH 46/46] hmp: " Markus Armbruster
  2020-06-24 16:58 ` [PATCH 00/46] Less clumsy error checking Paolo Bonzini
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/core/qdev-properties.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index e1ad147339..8eb4283a56 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -653,7 +653,6 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
     Property *prop = opaque;
     int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
     unsigned int slot, fn, n;
-    Error *local_err = NULL;
     char *str;
 
     if (dev->realized) {
@@ -661,9 +660,7 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
         return;
     }
 
-    if (!visit_type_str(v, name, &str, &local_err)) {
-        error_free(local_err);
-        local_err = NULL;
+    if (!visit_type_str(v, name, &str, NULL)) {
         if (!visit_type_int32(v, name, &value, errp)) {
             return;
         }
-- 
2.26.2



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

* [PATCH 46/46] hmp: Ignore Error objects where the return value suffices
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (44 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 45/46] qdev: " Markus Armbruster
@ 2020-06-24 16:43 ` Markus Armbruster
  2020-06-24 21:51   ` Eric Blake
  2020-06-24 16:58 ` [PATCH 00/46] Less clumsy error checking Paolo Bonzini
  46 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-24 16:43 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

qdev_print_props() receives and throws away Error objects just to
check for object_property_get_str() and object_property_print()
failure.  Unnecessary, both return suitable values, so use those
instead.

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

diff --git a/qdev-monitor.c b/qdev-monitor.c
index 2db38b18af..7ebb97cf0d 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -695,22 +695,22 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
     if (!props)
         return;
     for (; props->name; props++) {
-        Error *err = NULL;
         char *value;
         char *legacy_name = g_strdup_printf("legacy-%s", props->name);
+
         if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) {
-            value = object_property_get_str(OBJECT(dev), legacy_name, &err);
+            value = object_property_get_str(OBJECT(dev), legacy_name, NULL);
         } else {
-            value = object_property_print(OBJECT(dev), props->name, true, &err);
+            value = object_property_print(OBJECT(dev), props->name, true,
+                                          NULL);
         }
         g_free(legacy_name);
 
-        if (err) {
-            error_free(err);
+        if (!value) {
             continue;
         }
         qdev_printf("%s = %s\n", props->name,
-                    value && *value ? value : "<null>");
+                    *value ? value : "<null>");
         g_free(value);
     }
 }
-- 
2.26.2



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

* Re: [PATCH 00/46] Less clumsy error checking
  2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
                   ` (45 preceding siblings ...)
  2020-06-24 16:43 ` [PATCH 46/46] hmp: " Markus Armbruster
@ 2020-06-24 16:58 ` Paolo Bonzini
  46 siblings, 0 replies; 157+ messages in thread
From: Paolo Bonzini @ 2020-06-24 16:58 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block

On 24/06/20 18:42, Markus Armbruster wrote:
> When the Error API was created, we adopted the (unwritten) rule to
> return void when the function returns no useful value on success,
> unlike GError, which recommends to return true on success and false on
> error then.

I was actually never aware of the GError rule, but I, for one, welcome
our new bool overlords.

Paolo



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

* Re: [PATCH 01/46] error: Improve examples in error.h's big comment
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
@ 2020-06-24 16:59   ` Eric Blake
  2020-06-25 14:43   ` Vladimir Sementsov-Ogievskiy
  2020-06-25 14:44   ` Greg Kurz
  2 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 16:59 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:42 AM, Markus Armbruster wrote:
> Show errp instead of &err where &err is actually unusual.  Add a
> missing declaration.  Add a second error pileup example.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qapi/error.h | 19 +++++++++++++++----
>   1 file changed, 15 insertions(+), 4 deletions(-)
> 
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
@ 2020-06-24 17:51   ` Eric Blake
  2020-06-25  7:16   ` Vladimir Sementsov-Ogievskiy
  2020-06-25 15:17   ` Greg Kurz
  2 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 17:51 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> This merely codifies existing practice, with one exception: the rule
> advising against returning void, where existing practice is mixed.
> 
> When the Error API was created, we adopted the (unwritten) rule to
> return void when the function returns no useful value on success,
> unlike GError, which recommends to return true on success and false on
> error then.
> 

> 
> Not only is this more verbose, it also creates an Error object even
> when @errp is null, &error_abort or &error_fatal.
> 
> People got tired of the additional boilerplate, and started to ignore
> the unwritten rule.  The result is confusion among developers about
> the preferred usage.
> 
> The written rule will hopefully reduce the confusion.
> 
> The remainder of this series will update a substantial amount of code
> to honor the rule.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qapi/error.h | 26 ++++++++++++++++++++++++++
>   1 file changed, 26 insertions(+)
> 

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

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



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
@ 2020-06-24 18:03   ` Eric Blake
  2020-06-25 11:36     ` Markus Armbruster
  2020-06-25 12:39   ` Markus Armbruster
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 18:03 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Convert
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:

Automated patching is so much easier than manual :)

> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.

Well, so there's still some manual stuff.  But that's okay; hopefully we 
don't have too many stragglers reintroduced via pending patches.

> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

>   65 files changed, 248 insertions(+), 768 deletions(-)

Quite a big trim.  But I didn't spot any obvious problems.

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

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



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

* Re: [PATCH 06/46] error: Avoid error_propagate() when error is not used here
  2020-06-24 16:43 ` [PATCH 06/46] error: Avoid error_propagate() when error is not used here Markus Armbruster
@ 2020-06-24 18:17   ` Eric Blake
  2020-06-25 12:39     ` Markus Armbruster
  2020-06-26 14:36   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 18:17 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When all we do with an Error we receive into a local variable is
> propagating to somewhere else, we can just as well receive it there
> right away.  Coccinelle script:

This seems to be a recurring cleanup (witness commit 06592d7e, c0e90679, 
6b62d961).  In fact, shouldn't you just update that script with your 
enhancements here, and then run it directly, instead of embedding your 
tweaks in the commit message?

> 
>      @@
>      identifier fun, err, errp;
>      expression list args;
>      @@
>      -    fun(args, &err);
>      +    fun(args, errp);
>           ... when != err
>               when strict
>      -    error_propagate(errp, err);

What does the 'when strict' accomplish?  The existing coccinelle script 
uses 'when != errp', which may be enough to address...

> 
> The first two rules are prone to fail with "error_propagate(...)
> ... reachable by inconsistent control-flow paths".  Script without
> them re-run where that happens.

...the control-flow failures you hit?

> 
> Manually double-check @err is not used afterwards.  Dereferencing it
> would be use after free, but checking whether it's null would be
> legitimate.  One such change to qbus_realize() backed out.
> 
> Suboptimal line breaks tweaked manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

>   22 files changed, 31 insertions(+), 73 deletions(-)

At any rate, it's small enough to ensure all the changes remaining are 
still valid.

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

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



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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-24 16:43 ` [PATCH 07/46] error: Avoid more " Markus Armbruster
@ 2020-06-24 18:21   ` Eric Blake
  2020-06-25 12:50     ` Markus Armbruster
  2020-06-26 17:21   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 18:21 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When all we do with an Error we receive into a local variable is
> propagating to somewhere else, we can just as well receive it there
> right away.  The previous commit did that for simple cases with
> Coccinelle.  Do it for a few more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   blockdev.c     |  5 +----
>   hw/core/numa.c | 44 ++++++++++++++------------------------------
>   qdev-monitor.c | 11 ++++-------
>   3 files changed, 19 insertions(+), 41 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index b66863c42a..73736a4eaf 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
>       }
>   
>       /* Actual block device init: Functionality shared with blockdev-add */
> -    blk = blockdev_init(filename, bs_opts, &local_err);
> +    blk = blockdev_init(filename, bs_opts, errp);
>       bs_opts = NULL;
>       if (!blk) {
> -        error_propagate(errp, local_err);
>           goto fail;
> -    } else {
> -        assert(!local_err);

Loses an assertion that blockdev_init() doesn't mis-use errp, but I 
think the goal of your cleanup work has been to make it easier to prove 
any function follows the rules, so the assertion doesn't add much at 
this point.

> +++ b/qdev-monitor.c
> @@ -600,7 +600,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>       const char *driver, *path;
>       DeviceState *dev = NULL;
>       BusState *bus = NULL;
> -    Error *err = NULL;
>       bool hide;
>   
>       driver = qemu_opt_get(opts, "driver");
> @@ -655,15 +654,14 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>       dev = qdev_new(driver);
>   
>       /* Check whether the hotplug is allowed by the machine */
> -    if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
> +    if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
>           /* Error must be set in the machine hook */
> -        assert(err);

Another such case.

>           goto err_del_dev;
>       }
>   
>       if (!bus && qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) {
>           /* No bus, no machine hotplug handler --> device is not hotpluggable */
> -        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
> +        error_setg(errp, "Device '%s' can not be hotplugged on this machine",

Should we s/can not/cannot/ while touching this?

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

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



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

* Re: [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:43 ` [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 18:32   ` Eric Blake
  2020-06-25 13:05     ` Markus Armbruster
  2020-06-26 18:22   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 18:32 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Replace
> 
>      error_setg(&err, ...);
>      error_propagate(errp, err);
> 
> by
> 
>      error_setg(errp, ...);
> 
> Related pattern:

Nice explanation.

> Bonus: the elimination of gotos will make later patches in this series
> easier to review.
> 
> Candidates for conversion tracked down with this Coccinelle script:
> 
>      @@
>      identifier err, errp;
>      expression list args;
>      @@
>      -    error_setg(&err, args);
>      +    error_setg(errp, args);
> 	 ... when != err
> 	 error_propagate(errp, err);
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   backends/cryptodev.c        | 11 +++---
>   backends/hostmem-file.c     | 19 +++-------
>   backends/hostmem-memfd.c    | 15 ++++----
>   backends/hostmem.c          | 27 ++++++--------
>   block/throttle-groups.c     | 22 +++++------
>   hw/hyperv/vmbus.c           |  5 +--
>   hw/i386/pc.c                | 35 ++++++------------
>   hw/mem/nvdimm.c             | 17 ++++-----
>   hw/mem/pc-dimm.c            | 14 +++----
>   hw/misc/aspeed_sdmc.c       |  3 +-
>   hw/ppc/rs6000_mc.c          |  9 ++---
>   hw/ppc/spapr.c              | 73 ++++++++++++++++---------------------
>   hw/ppc/spapr_pci.c          | 14 +++----
>   hw/s390x/ipl.c              | 23 +++++-------
>   hw/s390x/sclp.c             | 12 ++----
>   hw/xen/xen_pt_config_init.c |  3 +-
>   iothread.c                  | 12 +++---
>   net/colo-compare.c          | 20 ++++------
>   net/dump.c                  | 10 ++---
>   net/filter-buffer.c         | 10 ++---
>   qga/commands-win32.c        | 16 +++-----
>   21 files changed, 151 insertions(+), 219 deletions(-)

A bit bigger, and starts to be too complex to ask Coccinelle to directly 
fix it (but at least using it for identification is nice).  But the 
patch is still manageable, and hopefully not too many instances creep 
back in during the meantime while waiting for this series to land.

> @@ -140,7 +138,6 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
>       HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
>   
>       if (host_memory_backend_mr_inited(backend)) {
> -
>           error_setg(errp, "cannot change property 'pmem' of %s.",
>                      object_get_typename(o));
>           return;

Unrelated cleanup.  Does it belong in a different patch?

> @@ -148,13 +145,9 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
>   
>   #ifndef CONFIG_LIBPMEM
>       if (value) {
> -        Error *local_err = NULL;
> -
> -        error_setg(&local_err,
> -                   "Lack of libpmem support while setting the 'pmem=on'"
> +        error_setg(errp, "Lack of libpmem support while setting the 'pmem=on'"
>                      " of %s. We can't ensure data persistence.",

Pre-existing - doesn't follow our usual error message content 
conventions regarding trailing '.'.

> +++ b/hw/ppc/spapr_pci.c
> @@ -1517,15 +1517,16 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
>        */
>       if (plugged_dev->hotplugged && bus->devices[PCI_DEVFN(slotnr, 0)] &&
>           PCI_FUNC(pdev->devfn) != 0) {
> -        error_setg(&local_err, "PCI: slot %d function 0 already ocuppied by %s,"
> +        error_setg(errp, "PCI: slot %d function 0 already ocuppied by %s,"
>                      " additional functions can no longer be exposed to guest.",

Another one.  Also, s/ocuppied/occupied/ while touching it.

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

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



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

* Re: [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter
  2020-06-24 16:43 ` [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter Markus Armbruster
@ 2020-06-24 19:31   ` Matthew Rosato
  2020-06-25  7:03   ` Cornelia Huck
  1 sibling, 0 replies; 157+ messages in thread
From: Matthew Rosato @ 2020-06-24 19:31 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Cornelia Huck, pbonzini

On 6/24/20 12:43 PM, Markus Armbruster wrote:
> s390_pci_set_fid() sets zpci->fid_defined to true even when
> visit_type_uint32() failed.  Reproducer: "-device zpci,fid=junk".
> Harmless in practice, because qdev_device_add() then fails, throwing
> away @zpci.  Fix it anyway.
> 
> Cc: Matthew Rosato <mjrosato@linux.ibm.com>
> Cc: Cornelia Huck <cohuck@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/s390x/s390-pci-bus.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index be8535304e..2e0eab1c69 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -1265,7 +1265,9 @@ static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
>           return;
>       }
>   
> -    visit_type_uint32(v, name, ptr, errp);
> +    if (!visit_type_uint32(v, name, ptr, errp)) {
> +        return;
> +    }
>       zpci->fid_defined = true;
>   }
>   
> 

Assuming no major overhaul of patch #22:

Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>


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

* Re: [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker()
  2020-06-24 16:43 ` [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker() Markus Armbruster
@ 2020-06-24 19:34   ` Eric Blake
  2020-06-29  8:29   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:34 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When migrate_add_blocker(blocker, &errp) is followed by
> error_propagate(errp, err), we can often just as well do
> migrate_add_blocker(..., errp).
> 
> Do that with this Coccinelle script:

> 
> Double-check @err is not used afterwards.  Dereferencing it would be
> use after free, but checking whether it's null would be legitimate.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 10/46] qemu-option: Check return value instead of @err where convenient
  2020-06-24 16:43 ` [PATCH 10/46] qemu-option: Check return value instead of @err where convenient Markus Armbruster
@ 2020-06-24 19:36   ` Eric Blake
  2020-06-29  9:11   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:36 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Convert uses like
> 
>      opts = qemu_opts_create(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      opts = qemu_opts_create(..., &err);
>      if (!opts) {
>          ...
>      }
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.
> 
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
@ 2020-06-24 19:37   ` Eric Blake
  2020-06-29  9:25   ` Vladimir Sementsov-Ogievskiy
  2020-06-29  9:36   ` Vladimir Sementsov-Ogievskiy
  2 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:37 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> This is to make the next commit easier to review.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 32 ++++++++++++++++++--------------
>   1 file changed, 18 insertions(+), 14 deletions(-)
> 

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

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



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

* Re: [PATCH 12/46] qemu-option: Factor out helper find_default_by_name()
  2020-06-24 16:43 ` [PATCH 12/46] qemu-option: Factor out helper find_default_by_name() Markus Armbruster
@ 2020-06-24 19:38   ` Eric Blake
  2020-06-29  9:46   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:38 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 47 ++++++++++++++++++++++++++--------------------
>   1 file changed, 27 insertions(+), 20 deletions(-)
> 

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

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



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

* Re: [PATCH 13/46] qemu-option: Simplify around find_default_by_name()
  2020-06-24 16:43 ` [PATCH 13/46] qemu-option: Simplify around find_default_by_name() Markus Armbruster
@ 2020-06-24 19:46   ` Eric Blake
  2020-06-25 13:12     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:46 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 13 ++++---------
>   1 file changed, 4 insertions(+), 9 deletions(-)
> 
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index ddcf3072c5..d9293814b4 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -286,11 +286,9 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
>       opt = qemu_opt_find(opts, name);
>       if (!opt) {
>           def_val = find_default_by_name(opts, name);
> -        if (def_val) {
> -            return def_val;
> -        }
> +        return def_val;
>       }
> -    return opt ? opt->str : NULL;
> +    return opt->str;
>   }

You could go with even fewer lines and variables by inverting the logic:

if (opt) {
     return opt->str;
}
return find_default_by_name(opts, name);


>   
>   void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts, const char *name)
> @@ -320,7 +318,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>   {
>       QemuOpt *opt;
>       const char *def_val;
> -    char *str = NULL;
> +    char *str;
>   
>       if (opts == NULL) {
>           return NULL;
> @@ -329,10 +327,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>       opt = qemu_opt_find(opts, name);
>       if (!opt) {
>           def_val = find_default_by_name(opts, name);
> -        if (def_val) {
> -            str = g_strdup(def_val);
> -        }
> -        return str;
> +        return g_strdup(def_val);

Similarly, you could drop def_val with:
  return g_strdup(find_default_by_name(opts, name));

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

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



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

* Re: [PATCH 14/46] qemu-option: Factor out helper opt_create()
  2020-06-24 16:43 ` [PATCH 14/46] qemu-option: Factor out helper opt_create() Markus Armbruster
@ 2020-06-24 19:47   ` Eric Blake
  2020-06-29 10:09   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:47 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> There is just one use so far.  The next commit will add more.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 27 ++++++++++++++++++---------
>   1 file changed, 18 insertions(+), 9 deletions(-)
> 

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

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



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

* Re: [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure
  2020-06-24 16:43 ` [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure Markus Armbruster
@ 2020-06-24 19:50   ` Eric Blake
  2020-06-29 10:37   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:50 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> opt_set() frees its argument @value on failure.  Slightly unclean;
> functions ideally do nothing on failure.
> 
> To tidy this up, move opt_create() from opt_set() into its callers,
> along with the cleanup.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 33 ++++++++++++++++++---------------
>   1 file changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index 3cdf0c0800..14946e81f2 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -519,36 +519,39 @@ static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value,
>       return opt;
>   }
>   

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

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



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

* Re: [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void
  2020-06-24 16:43 ` [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 19:55   ` Eric Blake
  2020-06-29 11:15   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 19:55 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> See recent commit "error: Document Error API usage rules" for
> rationale.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qemu/option.h | 16 ++++----
>   blockdev.c            |  5 ++-
>   util/qemu-option.c    | 92 +++++++++++++++++++++++++------------------
>   3 files changed, 64 insertions(+), 49 deletions(-)
> 

> -static void qemu_opts_from_qdict_entry(QemuOpts *opts,
> +static bool qemu_opts_from_qdict_entry(QemuOpts *opts,
>                                          const QDictEntry *entry,
>                                          Error **errp)
>   {
>       const char *key = qdict_entry_key(entry);
>       QObject *obj = qdict_entry_value(entry);
> -    char buf[32], *tmp = NULL;
> +    char buf[32];
> +    g_autofree char *tmp = NULL;

A bit fancier than a straight mechanical conversion here, but it works.

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

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



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

* Re: [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle
  2020-06-24 16:43 ` [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 20:08   ` Eric Blake
  2020-06-25 13:33     ` Markus Armbruster
  2020-06-29 13:58   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:08 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The previous commit enables conversion of
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for QemuOpts functions that now return true / false on success /
> error.  Coccinelle script:
> 

> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Tidy up line breaks and whitespace.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

>   32 files changed, 70 insertions(+), 192 deletions(-)

Another decent chunk of cleanups.

> 
> diff --git a/block.c b/block.c
> index 30a72bc4c2..77e85f13db 100644
> --- a/block.c
> +++ b/block.c

> @@ -6091,8 +6086,8 @@ void bdrv_img_create(const char *filename, const char *fmt,
>       }
>   
>       if (base_filename) {
> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
> -        if (local_err) {
> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
> +                          &local_err)) {
>               error_setg(errp, "Backing file not supported for file format '%s'",
>                          fmt);

Pre-existing - it is odd that we collect a message into local_err, then 
write something else into errp; the out: label does 
error_propagate(errp, local_err) which ensures there is no leak but 
discards the original err.  You could pass NULL instead.  But as it is 
pre-existing, passing NULL should be a separate patch.

>               goto out;
> @@ -6100,8 +6095,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
>       }
>   
>       if (base_fmt) {
> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
> -        if (local_err) {
> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err)) {
>               error_setg(errp, "Backing file format not supported for file "
>                                "format '%s'", fmt);

Ditto.

> +++ b/qemu-img.c
> @@ -467,8 +467,8 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
>       Error *err = NULL;
>   
>       if (base_filename) {
> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &err);
> -        if (err) {
> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
> +                          &err)) {
>               error_report("Backing file not supported for file format '%s'",
>                            fmt);
>               error_free(err);
> @@ -476,8 +476,7 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
>           }
>       }
>       if (base_fmt) {
> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err);
> -        if (err) {
> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err)) {
>               error_report("Backing file format not supported for file "
>                            "format '%s'", fmt);
>               error_free(err);

Ditto.

But the conversion here is sane.
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 18/46] qemu-option: Smooth error checking manually
  2020-06-24 16:43 ` [PATCH 18/46] qemu-option: Smooth error checking manually Markus Armbruster
@ 2020-06-24 20:10   ` Eric Blake
  2020-06-25 13:46     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:10 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When foo(..., &err) is followed by error_propagate(errp, err), we can
> often just as well do foo(..., errp).  The previous commit did that
> for simple cases with Coccinelle.  Do it for a few more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block.c             | 2 +-
>   block/gluster.c     | 8 ++++----
>   block/parallels.c   | 2 +-
>   block/quorum.c      | 2 +-
>   block/replication.c | 2 +-
>   block/vxhs.c        | 4 ++--
>   hw/net/virtio-net.c | 4 ++--
>   7 files changed, 12 insertions(+), 12 deletions(-)
> 

> +++ b/block/gluster.c
> @@ -523,7 +523,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>   
>       /* create opts info from runtime_json_opts list */
>       opts = qemu_opts_create(&runtime_json_opts, NULL, 0, &error_abort);
> -    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
> +    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
>           goto out;
>       }

This function also has a few error_setg(&local_err) that could be 
cleaned up to error_setg(errp); but the ones that use 
error_append_hint() immediately after (and thus the 
error_propagate(errp, local_err) in the out: label) still have to 
remain, until we have Vladimir's macro in place.

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

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



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

* Re: [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:43 ` [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 20:12   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:12 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The previous commit enables another round of the transformation from
> recent commit "error: Avoid unnecessary error_propagate() after
> error_setg()".
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block/quorum.c      | 16 +++++++---------
>   block/replication.c | 12 +++++-------
>   block/vxhs.c        | 10 ++++------
>   3 files changed, 16 insertions(+), 22 deletions(-)
> 

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

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



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

* Re: [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create()
  2020-06-24 16:43 ` [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create() Markus Armbruster
@ 2020-06-24 20:14   ` Eric Blake
  2020-06-25 13:47     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:14 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When creating an image fails because the format doesn't support option
> "backing_file" or "backing_fmt", bdrv_img_create() first has
> qemu_opt_set() put a generic error into @local_err, then puts the real
> error into @errp with error_setg(), and then propagates the former to
> the latter, which throws away the generic error.  A bit complicated,
> but works.

Hmm - may interact with my series to deprecate -b without -F.  We'll 
deal with the fallout based on whatever lands first.

> 
> Not that qemu_opt_set() returns a useful value, we can simply ignore

s/Not/Now/

> the generic error instead.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)

Aha - you fixed 2 of the 4 cases that I noticed in 17/46.

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

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



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

* Re: [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter()
  2020-06-24 16:43 ` [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter() Markus Armbruster
@ 2020-06-24 20:15   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:15 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   monitor/hmp-cmds.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 

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

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



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

* Re: [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void
  2020-06-24 16:43 ` [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 20:43   ` Eric Blake
  2020-06-25 14:56     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:43 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> See recent commit "error: Document Error API usage rules" for
> rationale.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   docs/devel/qapi-code-gen.txt  |  51 +++++------
>   include/qapi/clone-visitor.h  |   8 +-
>   include/qapi/visitor-impl.h   |  26 +++---
>   include/qapi/visitor.h        | 102 ++++++++++++---------
>   audio/audio_legacy.c          |  15 ++--
>   qapi/opts-visitor.c           |  58 +++++++-----
>   qapi/qapi-clone-visitor.c     |  33 ++++---
>   qapi/qapi-dealloc-visitor.c   |  27 ++++--
>   qapi/qapi-visit-core.c        | 165 ++++++++++++++++++----------------
>   qapi/qobject-input-visitor.c  | 109 +++++++++++++---------
>   qapi/qobject-output-visitor.c |  27 ++++--
>   qapi/string-input-visitor.c   |  62 +++++++------
>   qapi/string-output-visitor.c  |  32 ++++---
>   scripts/qapi/visit.py         |  58 +++++-------
>   14 files changed, 435 insertions(+), 338 deletions(-)

Hefty, but I don't see a sane way to split it further.

> 
> diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
> index a7794ef658..9bfc57063c 100644
> --- a/docs/devel/qapi-code-gen.txt
> +++ b/docs/devel/qapi-code-gen.txt

> -    void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
> +    bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
>       {
>           Error *err = NULL;
>   
> -        visit_type_int(v, "integer", &obj->integer, &err);
> -        if (err) {
> -            goto out;
> +        if (!visit_type_int(v, "integer", &obj->integer, errp)) {
> +            return false;
>           }
>           if (visit_optional(v, "string", &obj->has_string)) {
> -            visit_type_str(v, "string", &obj->string, &err);
> -            if (err) {
> -                goto out;
> +            if (!visit_type_str(v, "string", &obj->string, errp)) {
> +                return false;
>               }
>           }

Is this worth compressing two 'if's into one:

if (visit_optional(...) &&
     !visit_type_str(...)) {
     return false;
}

> -
> -    out:
>           error_propagate(errp, err);
> +        return !err;

Now that 'err' is never anything but NULL, why aren't you dropping the 
error_propagate() and merely using 'return true;'?

>       }
>   
> -    void visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
> +    bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
>       {
>           Error *err = NULL;
>   
> -        visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), &err);
> -        if (err) {
> -            goto out;
> +        if (!visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), errp)) {
> +            return false;
>           }
>           if (!*obj) {
>               /* incomplete */
> @@ -1461,19 +1457,18 @@ Example:

Adding context:

>             assert(visit_is_dealloc(v));
>             goto out_obj;
>         }
>         visit_type_UserDefOne_members(v, *obj, &err);
>         if (err) {
>             goto out_obj;

Should this be:

> if (!visit_type_UserDefOne_members(v, *obj, &err)) {
>     goto out_obj;
> 
>         }
>         visit_check_struct(v, &err);
>     out_obj:
>         visit_end_struct(v, (void **)obj);
>         if (err && visit_is_input(v)) {


>               qapi_free_UserDefOne(*obj);
>               *obj = NULL;
>           }
> -    out:
>           error_propagate(errp, err);
> +        return !err;

Here, err is still used by out_obj:, so this one is fine.

>       }
>   
> -    void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
> +    bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
>       {
>           Error *err = NULL;
>           UserDefOneList *tail;
>           size_t size = sizeof(**obj);
>   
> -        visit_start_list(v, name, (GenericList **)obj, size, &err);
> -        if (err) {
> -            goto out;
> +        if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) {
> +            return false;
>           }
>   
>           for (tail = *obj; tail;
> @@ -1492,21 +1487,19 @@ Example:

Adding context:

>              tail = (UserDefOneList *)visit_next_list(v, (GenericList *)tail, size)) {
>             visit_type_UserDefOne(v, NULL, &tail->value, &err);
>             if (err) {
>                 break;
>             }

Should this be:
if (visit_type_UserDefOne(...)) {
     break;

>         }
> 
>         if (!err) {
>             visit_check_list(v, &err);
>         }
>         visit_end_list(v, (void **)obj);
>         if (err && visit_is_input(v)) {


>               qapi_free_UserDefOneList(*obj);
>               *obj = NULL;
>           }
> -    out:
>           error_propagate(errp, err);
> +        return !err;
>       }

Again, err is still used, so this one is fine.

>   
> -    void visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
> +    bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
>       {
>           Error *err = NULL;
>   
> -        visit_type_UserDefOneList(v, "arg1", &obj->arg1, &err);
> -        if (err) {
> -            goto out;
> +        if (!visit_type_UserDefOneList(v, "arg1", &obj->arg1, errp)) {
> +            return false;
>           }
> -
> -    out:
>           error_propagate(errp, err);
> +        return !err;
>       }

But this is another one where err is unused.

>   
>   [Uninteresting stuff omitted...]
> diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
> index 5b665ee38c..adf9a788e2 100644
> --- a/include/qapi/clone-visitor.h

> +++ b/include/qapi/visitor.h
> @@ -286,6 +284,8 @@ void visit_free(Visitor *v);
>    * On failure, set *@obj to NULL and store an error through @errp.
>    * Can happen only when @v is an input visitor.
>    *
> + * Return true on succes, false on failure.

success

(copied several times in this file)

> +++ b/qapi/qapi-clone-visitor.c

> -static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
> +static bool qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
>                                      Error **errp)

Pre-existing indentation glitch that you could fix while here.

>   {
>       QapiCloneVisitor *qcv = to_qcv(v);
>   
>       assert(qcv->depth);
>       /* Value was already cloned by g_memdup() */
> +    return true;
>   }
>   
> -static void qapi_clone_type_uint64(Visitor *v, const char *name,
> +static bool qapi_clone_type_uint64(Visitor *v, const char *name,
>                                       uint64_t *obj, Error **errp)

Ditto for several more functions in this file.


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



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

* Re: [PATCH 23/46] qapi: Smooth error checking with Coccinelle
  2020-06-24 16:43 ` [PATCH 23/46] qapi: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 20:50   ` Eric Blake
  2020-06-25 15:03     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:50 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The previous commit enables conversion of
> 
>      visit_foo(..., &err);
>      if (err) {
> 	...
>      }
> 
> to
> 
>      if (!visit_foo(..., errp)) {
> 	...
>      }
> 
> for visitor functions that now return true / false on success / error.
> Coccinelle script:
> 
>      @@
>      identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";

Long line. Does coccinelle understand \-newline wrapping?

>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      identifier errp;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>      -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>      @@
>      identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";

The same list twice.  Is there a way to write it only once, then refer 
to it by reference in the two halves of the script?

>   46 files changed, 95 insertions(+), 331 deletions(-)

Nice to see the size reduction.

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

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

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

* Re: [PATCH 24/46] qapi: Smooth error checking manually
  2020-06-24 16:43 ` [PATCH 24/46] qapi: Smooth error checking manually Markus Armbruster
@ 2020-06-24 20:53   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:53 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When foo(..., &err) is followed by error_propagate(errp, err), we can
> often just as well do foo(..., errp).  The previous commit did that
> for simple cases with Coccinelle.  Do it for a few more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

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



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

* Re: [PATCH 25/46] qapi: Smooth visitor error checking in generated code
  2020-06-24 16:43 ` [PATCH 25/46] qapi: Smooth visitor error checking in generated code Markus Armbruster
@ 2020-06-24 20:58   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 20:58 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Use visitor functions' return values to check for failure.  Eliminate
> error_propagate() that are now unnecessary.  Delete @err that are now
> unused.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   docs/devel/qapi-code-gen.txt | 60 ++++++++++++++----------------------
>   scripts/qapi/commands.py     | 22 ++++++-------
>   scripts/qapi/visit.py        | 57 ++++++++++++++--------------------
>   3 files changed, 55 insertions(+), 84 deletions(-)

Aha - you resolved some of my comments in 22/46.

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

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



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

* Re: [PATCH 26/46] qapi: Smooth another visitor error checking pattern
  2020-06-24 16:43 ` [PATCH 26/46] qapi: Smooth another visitor error checking pattern Markus Armbruster
@ 2020-06-24 21:02   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:02 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Convert
> 
>      visit_type_FOO(v, ..., &ptr, &err);
>      ...
>      if (err) {
> 	...
>      }
> 
> to
> 
>      visit_type_FOO(v, ..., &ptr, errp);
>      ...
>      if (!ptr) {
> 	...
>      }
> 
> for functions that set @ptr to non-null / null on success / error.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 27/46] qapi: Purge error_propagate() from QAPI core
  2020-06-24 16:43 ` [PATCH 27/46] qapi: Purge error_propagate() from QAPI core Markus Armbruster
@ 2020-06-24 21:03   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:03 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qapi/qapi-visit-core.c | 40 +++++++++++++++++++---------------------
>   1 file changed, 19 insertions(+), 21 deletions(-)
> 

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

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



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

* Re: [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit
  2020-06-24 16:43 ` [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit Markus Armbruster
@ 2020-06-24 21:03   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:03 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block/parallels.c | 7 ++-----
>   1 file changed, 2 insertions(+), 5 deletions(-)
> 

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

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



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

* Re: [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:43 ` [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
@ 2020-06-24 21:04   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:04 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The commit before previous enables another round of the transformation
> from recent commit "error: Avoid unnecessary error_propagate() after
> error_setg()".
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/acpi/core.c | 15 ++++++---------
>   1 file changed, 6 insertions(+), 9 deletions(-)
> 

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

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



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

* Re: [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples
  2020-06-24 16:43 ` [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples Markus Armbruster
@ 2020-06-24 21:05   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:05 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qom/object.h | 6 ++----
>   1 file changed, 2 insertions(+), 4 deletions(-)
> 

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

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



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

* Re: [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type()
  2020-06-24 16:43 ` [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type() Markus Armbruster
@ 2020-06-24 21:06   ` Eric Blake
  2020-06-25  6:33   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:06 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Commit 2f262e06f0 lifted qdev_get_type() from qdev to object without
> renaming it accordingly.  Do that now.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qom/object.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)

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

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



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

* Re: [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure
  2020-06-24 16:43 ` [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure Markus Armbruster
@ 2020-06-24 21:07   ` Eric Blake
  2020-06-25 15:05     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:07 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Pass &error_abort instead of NULL where the returned value is
> dereferenced or asserted to be non-null.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

> @@ -63,8 +64,8 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
>           return -1;
>       }
>   
> -    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container", NULL);
> -
> +    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container",
> +                                         &error_abort);
>       assert(parent_mr);

Do we still need to keep the assert?

> +++ b/hw/ppc/spapr_pci_nvlink2.c
> @@ -141,9 +141,10 @@ static void spapr_phb_pci_collect_nvgpu(PCIBus *bus, PCIDevice *pdev,
>       if (tgt) {
>           Error *local_err = NULL;
>           SpaprPhbPciNvGpuConfig *nvgpus = opaque;
> -        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]", NULL);
> +        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]",
> +                                                  &error_abort);
>           Object *mr_npu = object_property_get_link(po, "nvlink2-atsd-mr[0]",
> -                                                  NULL);
> +                                                  &error_abort);
>   
>           g_assert(mr_gpu || mr_npu);

Likewise.

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



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

* Re: [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-24 16:43 ` [PATCH 34/46] qom: Don't handle impossible " Markus Armbruster
@ 2020-06-24 21:13   ` Eric Blake
  2020-06-25  6:36   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:13 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Don't handle object_property_get_link() failure that can't happen
> unless the programmer screwed up, pass &error_abort.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

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



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

* Re: [PATCH 35/46] qom: Use return values to check for error where that's simpler
  2020-06-24 16:43 ` [PATCH 35/46] qom: Use return values to check for error where that's simpler Markus Armbruster
@ 2020-06-24 21:24   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:24 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When using the Error object to check for error, we need to receive it
> into a local variable, then propagate() it to @errp.
> 
> Using the return value permits allows receiving it straight to @errp.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qom/object.c | 10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
> 

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

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



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

* Re: [PATCH 36/46] qom: Put name parameter before value / visitor parameter
  2020-06-24 16:43 ` [PATCH 36/46] qom: Put name parameter before value / visitor parameter Markus Armbruster
@ 2020-06-24 21:27   ` Eric Blake
  2020-06-25 15:14     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:27 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The object_property_set_FOO() setters take property name and value in
> an unusual order:
> 
>      void object_property_set_FOO(Object *obj, FOO_TYPE value,
>                                   const char *name, Error **errp)
> 
> Having to pass value before name feels grating.  Swap them.
> 
> Same for object_property_set(), object_property_get(), and
> object_property_parse().
> 
> Convert callers with this Coccinelle script:
> 
>      @@
>      identifier fun = {object_property_get, object_property_parse, object_property_set_str, object_property_set_link, object_property_set_bool, object_property_set_int, object_property_set_uint, object_property_set, object_property_set_qobject};
>      expression obj, v, name, errp;
>      @@
>      -    fun(obj, v, name, errp)
>      +    fun(obj, name, v, errp)
> 
> Chokes on hw/arm/musicpal.c's lcd_refresh() with the unhelpful error
> message "no position information".  Convert that one manually.
> 
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Fails to convert hw/rx/rx-gdbsim.c, because Coccinelle gets confused
> by RXCPU being used both as typedef and function-like macro there.
> Convert manually.  Convert that one manually.  The other files using
> RXCPU that way don't need conversion.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

>   136 files changed, 702 insertions(+), 729 deletions(-)

Big but mechanical.

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

This one might be a semantic conflict magnet with patches written in the 
meantime; I guess the trick is to check that 'git grep' finds as many 
calls to any of the functions listed as conversions.

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



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

* Re: [PATCH 37/46] qom: Make functions taking Error ** return bool, not void
  2020-06-24 16:43 ` [PATCH 37/46] qom: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 21:32   ` Eric Blake
  2020-06-25 15:14     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:32 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> See recent commit "error: Document Error API usage rules" for
> rationale.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

> @@ -524,25 +527,29 @@ void object_initialize(void *data, size_t size, const char *typename)
>       object_initialize_with_type(data, size, type);
>   }
>   
> -void object_initialize_child_with_props(Object *parentobj,
> +bool object_initialize_child_with_props(Object *parentobj,
>                                const char *propname,
>                                void *childobj, size_t size, const char *type,
>                                Error **errp, ...)

Is it worth tweaking indentation while here?

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

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



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

* Re: [PATCH 38/46] qom: Smooth error checking with Coccinelle
  2020-06-24 16:43 ` [PATCH 38/46] qom: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 21:35   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:35 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The previous commit enables conversion of
> 
>      foo(..., &err);
>      if (err) {
> 	...
>      }
> 
> to
> 
>      if (!foo(..., errp)) {
> 	...
>      }
> 
> for QOM functions that now return true / false on success / error.
> Coccinelle script:
> 

> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 39/46] qom: Smooth error checking manually
  2020-06-24 16:43 ` [PATCH 39/46] qom: Smooth error checking manually Markus Armbruster
@ 2020-06-24 21:38   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:38 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When foo(..., &err) is followed by error_propagate(errp, err), we can
> often just as well do foo(..., errp).  The previous commit did that
> for simple cases with Coccinelle.  Do it for a few more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

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



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

* Re: [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1
  2020-06-24 16:43 ` [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1 Markus Armbruster
@ 2020-06-24 21:40   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:40 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Just for consistency.  Also fix the example in object_set_props()'s
> documentation.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qom/object.h | 28 +++++++++++-----------------
>   qom/object.c         | 14 +++++++-------
>   2 files changed, 18 insertions(+), 24 deletions(-)
> 

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

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



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

* Re: [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void
  2020-06-24 16:43 ` [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void Markus Armbruster
@ 2020-06-24 21:40   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:40 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> See recent commit "error: Document Error API usage rules" for
> rationale.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

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



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

* Re: [PATCH 42/46] qdev: Smooth error checking with Coccinelle
  2020-06-24 16:43 ` [PATCH 42/46] qdev: Smooth error checking with Coccinelle Markus Armbruster
@ 2020-06-24 21:41   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:41 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> The previous commit enables conversion of
> 
>      qdev_prop_set_drive_err(..., &err);
>      if (err) {
>      ...
>      }
> 
> to
> 
>      if (!qdev_prop_set_drive_err(..., errp)) {
>      ...
>      }
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Tidy up line breaks and whitespace.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
Reviewed-by: Eric Blake <eblake@redhat.com>

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



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

* Re: [PATCH 43/46] qdev: Smooth error checking manually
  2020-06-24 16:43 ` [PATCH 43/46] qdev: Smooth error checking manually Markus Armbruster
@ 2020-06-24 21:42   ` Eric Blake
  2020-06-25 15:15     ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:42 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> When foo(..., &err) is followed by error_propagate(errp, err), we can
> often just as well do foo(..., errp).  The previous commit did that
> for simple cases with Coccinelle.  Do it for one more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/block/fdc.c | 8 +++-----
>   1 file changed, 3 insertions(+), 5 deletions(-)
> 

> @@ -2566,11 +2566,9 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
>           blk_ref(blk);
>           blk_detach_dev(blk, fdc_dev);
>           fdctrl->qdev_for_drives[i].blk = NULL;
> -        qdev_prop_set_drive_err(dev, "drive", blk, &local_err);
> +        ok = qdev_prop_set_drive_err(dev, "drive", blk, errp);
>           blk_unref(blk);

Perhaps some glib g_auto* magic could make this even easier (to mark a 
variable to be blk_unref'd when it goes out of scope).  But for now, 
your pattern is fine.

> -
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!ok) {
>               return;
>           }
>   

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

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



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

* Re: [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices
  2020-06-24 16:43 ` [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices Markus Armbruster
@ 2020-06-24 21:49   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:49 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qemu-img.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 

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

Another case where you already wrote the followup patch for something I 
spotted earlier in the series ;)

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



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

* Re: [PATCH 45/46] qdev: Ignore Error objects where the return value suffices
  2020-06-24 16:43 ` [PATCH 45/46] qdev: " Markus Armbruster
@ 2020-06-24 21:50   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:50 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/core/qdev-properties.c | 5 +----
>   1 file changed, 1 insertion(+), 4 deletions(-)

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


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



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

* Re: [PATCH 46/46] hmp: Ignore Error objects where the return value suffices
  2020-06-24 16:43 ` [PATCH 46/46] hmp: " Markus Armbruster
@ 2020-06-24 21:51   ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:51 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> qdev_print_props() receives and throws away Error objects just to
> check for object_property_get_str() and object_property_print()
> failure.  Unnecessary, both return suitable values, so use those
> instead.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   qdev-monitor.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 

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

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



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

* Re: [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize()
  2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
@ 2020-06-24 21:52   ` Eric Blake
  2020-06-24 23:54   ` David Gibson
  2020-06-25 19:09   ` Vladimir Sementsov-Ogievskiy
  2 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:52 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Mark Cave-Ayland, pbonzini, David Gibson

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> macio_newworld_realize() effectively ignores ns->gpio realization
> errors, leaking the Error object.  Fortunately, macio_gpio_realize()
> can't actually fail.  Tidy up.
> 
> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/misc/macio/macio.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 

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

> diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
> index 7cfe357cc4..bedf10e77b 100644
> --- a/hw/misc/macio/macio.c
> +++ b/hw/misc/macio/macio.c
> @@ -329,7 +329,9 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>                                    &error_abort);
>           memory_region_add_subregion(&s->bar, 0x50,
>                                       sysbus_mmio_get_region(sysbus_dev, 0));
> -        qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), &err);
> +        if (!qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), errp)) {
> +            return;
> +        }
>   
>           /* PMU */
>           object_initialize_child(OBJECT(s), "pmu", &s->pmu, TYPE_VIA_PMU);
> 

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



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

* Re: [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
  2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
@ 2020-06-24 21:52   ` Eric Blake
  2020-06-25 19:12   ` Vladimir Sementsov-Ogievskiy
  2020-06-28  0:50   ` Gonglei (Arei)
  2 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-24 21:52 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Michael S . Tsirkin, Gonglei (Arei),
	pbonzini

On 6/24/20 11:43 AM, Markus Armbruster wrote:
> virtio_crypto_pci_realize() continues after realization of its
> "virtio-crypto-device" fails.  Only an object_property_set_link()
> follows; looks harmless to me.  Tidy up anyway: return after failure,
> just like virtio_rng_pci_realize() does.
> 
> Cc: "Gonglei (Arei)" <arei.gonglei@huawei.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   hw/virtio/virtio-crypto-pci.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)

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

> 
> diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c
> index 72be531c95..0755722288 100644
> --- a/hw/virtio/virtio-crypto-pci.c
> +++ b/hw/virtio/virtio-crypto-pci.c
> @@ -54,7 +54,9 @@ static void virtio_crypto_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>       }
>   
>       virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
> +        return;
> +    }
>       object_property_set_link(OBJECT(vcrypto),
>                    OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
>                    NULL);
> 

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



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

* Re: [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize()
  2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
@ 2020-06-24 23:54   ` David Gibson
  2020-06-25 19:09   ` Vladimir Sementsov-Ogievskiy
  2 siblings, 0 replies; 157+ messages in thread
From: David Gibson @ 2020-06-24 23:54 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Mark Cave-Ayland, qemu-devel, pbonzini

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

On Wed, Jun 24, 2020 at 06:43:02PM +0200, Markus Armbruster wrote:
> macio_newworld_realize() effectively ignores ns->gpio realization
> errors, leaking the Error object.  Fortunately, macio_gpio_realize()
> can't actually fail.  Tidy up.
> 
> Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Cc: David Gibson <david@gibson.dropbear.id.au>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

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

> ---
>  hw/misc/macio/macio.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
> index 7cfe357cc4..bedf10e77b 100644
> --- a/hw/misc/macio/macio.c
> +++ b/hw/misc/macio/macio.c
> @@ -329,7 +329,9 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>                                   &error_abort);
>          memory_region_add_subregion(&s->bar, 0x50,
>                                      sysbus_mmio_get_region(sysbus_dev, 0));
> -        qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), &err);
> +        if (!qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), errp)) {
> +            return;
> +        }
>  
>          /* PMU */
>          object_initialize_child(OBJECT(s), "pmu", &s->pmu, TYPE_VIA_PMU);

-- 
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] 157+ messages in thread

* Re: [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type()
  2020-06-24 16:43 ` [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type() Markus Armbruster
  2020-06-24 21:06   ` Eric Blake
@ 2020-06-25  6:33   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 157+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-25  6:33 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 6:43 PM, Markus Armbruster wrote:
> Commit 2f262e06f0 lifted qdev_get_type() from qdev to object without
> renaming it accordingly.  Do that now.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qom/object.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/qom/object.c b/qom/object.c
> index b8aac074c2..f6e9f0e413 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -2359,7 +2359,7 @@ object_class_property_add_tm(ObjectClass *klass, const char *name,
>                                       NULL, NULL, prop);
>  }
>  
> -static char *qdev_get_type(Object *obj, Error **errp)
> +static char *object_get_type(Object *obj, Error **errp)
>  {
>      return g_strdup(object_get_typename(obj));
>  }
> @@ -2702,7 +2702,7 @@ void object_class_property_set_description(ObjectClass *klass,
>  
>  static void object_class_init(ObjectClass *klass, void *data)
>  {
> -    object_class_property_add_str(klass, "type", qdev_get_type,
> +    object_class_property_add_str(klass, "type", object_get_type,
>                                    NULL);
>  }
>  
> 

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



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

* Re: [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-24 16:43 ` [PATCH 34/46] qom: Don't handle impossible " Markus Armbruster
  2020-06-24 21:13   ` Eric Blake
@ 2020-06-25  6:36   ` Philippe Mathieu-Daudé
  2020-06-25 15:09     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-25  6:36 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

On 6/24/20 6:43 PM, Markus Armbruster wrote:
> Don't handle object_property_get_link() failure that can't happen
> unless the programmer screwed up, pass &error_abort.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/arm/bcm2835_peripherals.c |  7 +------
>  hw/arm/bcm2836.c             |  7 +------
>  hw/display/bcm2835_fb.c      |  8 +-------
>  hw/dma/bcm2835_dma.c         |  9 +--------
>  hw/gpio/bcm2835_gpio.c       | 15 ++-------------
>  hw/intc/nios2_iic.c          |  8 +-------
>  hw/misc/bcm2835_mbox.c       |  9 +--------
>  hw/misc/bcm2835_property.c   | 17 ++---------------
>  hw/usb/hcd-dwc2.c            |  9 +--------
>  9 files changed, 11 insertions(+), 78 deletions(-)
> 
> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
> index 8313410ffe..3c40bda91e 100644
> --- a/hw/arm/bcm2835_peripherals.c
> +++ b/hw/arm/bcm2835_peripherals.c
> @@ -134,12 +134,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      uint64_t ram_size, vcram_size;
>      int n;
>  
> -    obj = object_property_get_link(OBJECT(dev), "ram", &err);
> -    if (obj == NULL) {
> -        error_setg(errp, "%s: required ram link not found: %s",
> -                   __func__, error_get_pretty(err));
> -        return;
> -    }
> +    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
[...]

Should we now add an assert(errp) in object_property_get_link()?
Basically this would force forks to adapt their code when
rebasing.

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



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

* Re: [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter
  2020-06-24 16:43 ` [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter Markus Armbruster
  2020-06-24 19:31   ` Matthew Rosato
@ 2020-06-25  7:03   ` Cornelia Huck
  1 sibling, 0 replies; 157+ messages in thread
From: Cornelia Huck @ 2020-06-25  7:03 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini, Matthew Rosato

On Wed, 24 Jun 2020 18:43:28 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> s390_pci_set_fid() sets zpci->fid_defined to true even when
> visit_type_uint32() failed.  Reproducer: "-device zpci,fid=junk".
> Harmless in practice, because qdev_device_add() then fails, throwing
> away @zpci.  Fix it anyway.
> 
> Cc: Matthew Rosato <mjrosato@linux.ibm.com>
> Cc: Cornelia Huck <cohuck@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/s390x/s390-pci-bus.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)

Reviewed-by: Cornelia Huck <cohuck@redhat.com>



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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
  2020-06-24 17:51   ` Eric Blake
@ 2020-06-25  7:16   ` Vladimir Sementsov-Ogievskiy
  2020-06-25 11:23     ` Markus Armbruster
  2020-06-25 15:17   ` Greg Kurz
  2 siblings, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25  7:16 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> This merely codifies existing practice, with one exception: the rule
> advising against returning void, where existing practice is mixed.
> 
> When the Error API was created, we adopted the (unwritten) rule to
> return void when the function returns no useful value on success,
> unlike GError, which recommends to return true on success and false on
> error then.
> 
> When a function returns a distinct error value, say false, a checked
> call that passes the error up looks like
> 
>      if (!frobnicate(..., errp)) {
>          handle the error...
>      }
> 
> When it returns void, we need
> 
>      Error *err = NULL;
> 
>      frobnicate(..., &err);
>      if (err) {
>          handle the error...
>          error_propagate(errp, err);
>      }
> 
> Not only is this more verbose, it also creates an Error object even
> when @errp is null, &error_abort or &error_fatal.
> 
> People got tired of the additional boilerplate, and started to ignore
> the unwritten rule.  The result is confusion among developers about
> the preferred usage.
> 
> The written rule will hopefully reduce the confusion.
> 
> The remainder of this series will update a substantial amount of code
> to honor the rule.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   include/qapi/error.h | 26 ++++++++++++++++++++++++++
>   1 file changed, 26 insertions(+)
> 
> diff --git a/include/qapi/error.h b/include/qapi/error.h
> index 1a5ea25e12..c3d84d610a 100644
> --- a/include/qapi/error.h
> +++ b/include/qapi/error.h
> @@ -15,6 +15,32 @@
>   /*
>    * Error reporting system loosely patterned after Glib's GError.
>    *
> + * Rules:
> + *
> + * - Functions that use Error to report errors have an Error **errp
> + *   parameter.  It should be the last parameter, except for functions
> + *   taking variable arguments.
> + *
> + * - You may pass NULL to not receive the error, &error_abort to abort
> + *   on error, &error_fatal to exit(1) on error, or a pointer to a
> + *   variable containing NULL to receive the error.
> + *
> + * - The value of @errp should not affect control flow.

What do you mean? Incoming state of errp, or *errp after some call of another
function? Should we then update this paragraph, when introduce
ERRP_AUTO_PROPAGATE?

> + *
> + * - On success, the function should not use @errp.  On failure, it
> + *   should set a new error, e.g. with error_setg(errp, ...), or
> + *   propagate an existing one, e.g. with error_propagate(errp, ...).
> + *
> + * - Whenever practical, also return a value that indicates success /
> + *   failure.  This can make the error checking more concise, and can
> + *   avoid useless error object creation and destruction.  Note that
> + *   we still have many functions returning void.  We recommend
> + *   • bool-valued functions return true on success / false on failure,
> + *   • pointer-valued functions return non-null / null pointer, and
> + *   • integer-valued functions return non-negative / negative.
> + *
> + * How to:
> + *
>    * Create an error:
>    *     error_setg(errp, "situation normal, all fouled up");
>    *
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-25  7:16   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-25 11:23     ` Markus Armbruster
  2020-06-25 11:46       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 11:23 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> This merely codifies existing practice, with one exception: the rule
>> advising against returning void, where existing practice is mixed.
>>
>> When the Error API was created, we adopted the (unwritten) rule to
>> return void when the function returns no useful value on success,
>> unlike GError, which recommends to return true on success and false on
>> error then.
>>
>> When a function returns a distinct error value, say false, a checked
>> call that passes the error up looks like
>>
>>      if (!frobnicate(..., errp)) {
>>          handle the error...
>>      }
>>
>> When it returns void, we need
>>
>>      Error *err = NULL;
>>
>>      frobnicate(..., &err);
>>      if (err) {
>>          handle the error...
>>          error_propagate(errp, err);
>>      }
>>
>> Not only is this more verbose, it also creates an Error object even
>> when @errp is null, &error_abort or &error_fatal.
>>
>> People got tired of the additional boilerplate, and started to ignore
>> the unwritten rule.  The result is confusion among developers about
>> the preferred usage.
>>
>> The written rule will hopefully reduce the confusion.
>>
>> The remainder of this series will update a substantial amount of code
>> to honor the rule.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   include/qapi/error.h | 26 ++++++++++++++++++++++++++
>>   1 file changed, 26 insertions(+)
>>
>> diff --git a/include/qapi/error.h b/include/qapi/error.h
>> index 1a5ea25e12..c3d84d610a 100644
>> --- a/include/qapi/error.h
>> +++ b/include/qapi/error.h
>> @@ -15,6 +15,32 @@
>>   /*
>>    * Error reporting system loosely patterned after Glib's GError.
>>    *
>> + * Rules:
>> + *
>> + * - Functions that use Error to report errors have an Error **errp
>> + *   parameter.  It should be the last parameter, except for functions
>> + *   taking variable arguments.
>> + *
>> + * - You may pass NULL to not receive the error, &error_abort to abort
>> + *   on error, &error_fatal to exit(1) on error, or a pointer to a
>> + *   variable containing NULL to receive the error.
>> + *
>> + * - The value of @errp should not affect control flow.
>
> What do you mean? Incoming state of errp, or *errp after some call of another
> function? Should we then update this paragraph, when introduce
> ERRP_AUTO_PROPAGATE?

The argument value passed for parameter @errp.

What I'm trying to express is that the function should remain oblivious
of how the caller handles errors.  Do not check whether the argument is
NULL, &error_abort, &error_fatal, or any other value.  It's best to
treat @errp as write-only.

I'm trying to strike a balance between clarity and brevity, without
overspecifying what the function may do.  I tend to err on the side of
brevity in function contracts.  I always hope reviewers will flag my
errors :)  In short, I'm open to better ideas.

GLib documentation, for comparison:

    If NULL is passed for the GError** argument, then errors should not
    be returned to the caller, but your function should still abort and
    return if an error occurs. That is, control flow should not be
    affected by whether the caller wants to get a GError.

>
>> + *
>> + * - On success, the function should not use @errp.  On failure, it
>> + *   should set a new error, e.g. with error_setg(errp, ...), or
>> + *   propagate an existing one, e.g. with error_propagate(errp, ...).
>> + *
>> + * - Whenever practical, also return a value that indicates success /
>> + *   failure.  This can make the error checking more concise, and can
>> + *   avoid useless error object creation and destruction.  Note that
>> + *   we still have many functions returning void.  We recommend
>> + *   • bool-valued functions return true on success / false on failure,
>> + *   • pointer-valued functions return non-null / null pointer, and
>> + *   • integer-valued functions return non-negative / negative.
>> + *
>> + * How to:
>> + *
>>    * Create an error:
>>    *     error_setg(errp, "situation normal, all fouled up");
>>    *
>>



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 18:03   ` Eric Blake
@ 2020-06-25 11:36     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 11:36 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Automated patching is so much easier than manual :)

Except when Coccinelle dies with some weird error, or refuses to play
ball without any explanation at all :)

Coccinelle is both awesome and terrible!

>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>
> Well, so there's still some manual stuff.  But that's okay; hopefully
> we don't have too many stragglers reintroduced via pending patches.

The first sentence is a leftover from an earlier, more manual version.
I'll delete it.

The manual stuff is really just deleting unused variables to make the
compiler happy, tidying up whitespace and breaking long lines to make
checkpatch happy, and tweak line breaks a bit more to make my reviewers
happy.

>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>>   65 files changed, 248 insertions(+), 768 deletions(-)
>
> Quite a big trim.  But I didn't spot any obvious problems.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-25 11:23     ` Markus Armbruster
@ 2020-06-25 11:46       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25 11:46 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

25.06.2020 14:23, Markus Armbruster wrote:
> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
> 
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> This merely codifies existing practice, with one exception: the rule
>>> advising against returning void, where existing practice is mixed.
>>>
>>> When the Error API was created, we adopted the (unwritten) rule to
>>> return void when the function returns no useful value on success,
>>> unlike GError, which recommends to return true on success and false on
>>> error then.
>>>
>>> When a function returns a distinct error value, say false, a checked
>>> call that passes the error up looks like
>>>
>>>       if (!frobnicate(..., errp)) {
>>>           handle the error...
>>>       }
>>>
>>> When it returns void, we need
>>>
>>>       Error *err = NULL;
>>>
>>>       frobnicate(..., &err);
>>>       if (err) {
>>>           handle the error...
>>>           error_propagate(errp, err);
>>>       }
>>>
>>> Not only is this more verbose, it also creates an Error object even
>>> when @errp is null, &error_abort or &error_fatal.
>>>
>>> People got tired of the additional boilerplate, and started to ignore
>>> the unwritten rule.  The result is confusion among developers about
>>> the preferred usage.
>>>
>>> The written rule will hopefully reduce the confusion.
>>>
>>> The remainder of this series will update a substantial amount of code
>>> to honor the rule.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>    include/qapi/error.h | 26 ++++++++++++++++++++++++++
>>>    1 file changed, 26 insertions(+)
>>>
>>> diff --git a/include/qapi/error.h b/include/qapi/error.h
>>> index 1a5ea25e12..c3d84d610a 100644
>>> --- a/include/qapi/error.h
>>> +++ b/include/qapi/error.h
>>> @@ -15,6 +15,32 @@
>>>    /*
>>>     * Error reporting system loosely patterned after Glib's GError.
>>>     *
>>> + * Rules:
>>> + *
>>> + * - Functions that use Error to report errors have an Error **errp
>>> + *   parameter.  It should be the last parameter, except for functions
>>> + *   taking variable arguments.
>>> + *
>>> + * - You may pass NULL to not receive the error, &error_abort to abort
>>> + *   on error, &error_fatal to exit(1) on error, or a pointer to a
>>> + *   variable containing NULL to receive the error.
>>> + *
>>> + * - The value of @errp should not affect control flow.
>>
>> What do you mean? Incoming state of errp, or *errp after some call of another
>> function? Should we then update this paragraph, when introduce
>> ERRP_AUTO_PROPAGATE?
> 
> The argument value passed for parameter @errp.
> 
> What I'm trying to express is that the function should remain oblivious
> of how the caller handles errors.  Do not check whether the argument is
> NULL, &error_abort, &error_fatal, or any other value.  It's best to
> treat @errp as write-only.
> 
> I'm trying to strike a balance between clarity and brevity, without
> overspecifying what the function may do.  I tend to err on the side of
> brevity in function contracts.  I always hope reviewers will flag my
> errors :)  In short, I'm open to better ideas.
> 
> GLib documentation, for comparison:
> 
>      If NULL is passed for the GError** argument, then errors should not
>      be returned to the caller, but your function should still abort and
>      return if an error occurs. That is, control flow should not be
>      affected by whether the caller wants to get a GError.
> 

Ah, OK. I'm about the fact that ERRP_AUTO_PROPAGATE exactly do some things based on
the value of errp. Still it's not about general function code-flow, but special
error-reporting related magic. (as well as error_setg will rely on errp value too,
but it's not related to actual function code-flow).

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

>>
>>> + *
>>> + * - On success, the function should not use @errp.  On failure, it
>>> + *   should set a new error, e.g. with error_setg(errp, ...), or
>>> + *   propagate an existing one, e.g. with error_propagate(errp, ...).
>>> + *
>>> + * - Whenever practical, also return a value that indicates success /
>>> + *   failure.  This can make the error checking more concise, and can
>>> + *   avoid useless error object creation and destruction.  Note that
>>> + *   we still have many functions returning void.  We recommend
>>> + *   • bool-valued functions return true on success / false on failure,
>>> + *   • pointer-valued functions return non-null / null pointer, and
>>> + *   • integer-valued functions return non-negative / negative.
>>> + *
>>> + * How to:
>>> + *
>>>     * Create an error:
>>>     *     error_setg(errp, "situation normal, all fouled up");
>>>     *
>>>
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 06/46] error: Avoid error_propagate() when error is not used here
  2020-06-24 18:17   ` Eric Blake
@ 2020-06-25 12:39     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 12:39 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> When all we do with an Error we receive into a local variable is
>> propagating to somewhere else, we can just as well receive it there
>> right away.  Coccinelle script:
>
> This seems to be a recurring cleanup (witness commit 06592d7e,
> c0e90679, 6b62d961).  In fact, shouldn't you just update that script
> with your enhancements here, and then run it directly, instead of
> embedding your tweaks in the commit message?

I didn't remember scripts/coccinelle/remove_local_err.cocci.

remove_local_err.cocci transforms

    fun(..., &err);
    error_propagate(errp, err);

to

    fun(..., errp);

when the context permits that, using a conservative approximation of
"context permits".  In other words, the script is sound.

My script matches more, but is unsound: it *can* mess up things.  For
instance

    Error err = NULL;

    foo(1, 2, 3, &err);
    error_propagate(errp, err);
    return !err;

would become

    Error err = NULL;

    foo(1, 2, 3, errp);
    return !err;

Oops.  See "manually double-check" below.  For a one-shot cleanup,
manual checking is much, much easier for me than making the Coccinelle
script sound without sacrificing (too much) matching power.

>
>>
>>      @@
>>      identifier fun, err, errp;
>>      expression list args;
>>      @@
>>      -    fun(args, &err);
>>      +    fun(args, errp);
>>           ... when != err
>>               when strict
>>      -    error_propagate(errp, err);
>
> What does the 'when strict' accomplish?  The existing coccinelle
> script uses 'when != errp', which may be enough to address...

Magic!  Without it, I get

   diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
   index 8310c77ec0..2355999171 100644
   --- a/hw/vfio/pci.c
   +++ b/hw/vfio/pci.c
   @@ -1511,16 +1511,14 @@ static int vfio_msix_setup(VFIOPCIDevice *vdev, int pos, Error **errp)
        ret = msix_init(&vdev->pdev, vdev->msix->entries,
                        vdev->bars[vdev->msix->table_bar].mr,
                        vdev->msix->table_bar, vdev->msix->table_offset,
   -                    vdev->bars[vdev->msix->pba_bar].mr,
   -                    vdev->msix->pba_bar, vdev->msix->pba_offset, pos,
   -                    &err);
   +                    vdev->bars[vdev->msix->pba_bar].mr, vdev->msix->pba_bar,
   +                    vdev->msix->pba_offset, pos, errp);
        if (ret < 0) {
            if (ret == -ENOTSUP) {
WTF!?! --->     warn_report_err(err);
                return 0;
            }

   -        error_propagate(errp, err);
            return ret;
        }

Since Coccinelle's documentation is of no help whatsoever (again), I
went looking for possibly applicable ideas in existing scripts.  I found
"when strict" in the kernel's scripts/coccinelle/ directory.  I couldn't
find it in Coccinelle docs.  So I gave it a try, and here we are.

Did I mention Coccinelle is terrible?

>> The first two rules are prone to fail with "error_propagate(...)
>> ... reachable by inconsistent control-flow paths".  Script without
>> them re-run where that happens.
>
> ...the control-flow failures you hit?

This one I can actually explain, I think.  Consider this code snippet
from net.c:

 1      visit_type_Netdev(v, NULL, &object, &err);

 2      if (!err) {
 3          ret = net_client_init1(object, is_netdev, &err);
 4      }

 5      qapi_free_Netdev(object);

 6  out:
 7      error_propagate(errp, err);

There are two overlapping matches of rule 1: either line 1 and 7, or
line 3 and 7.  Which one is right?  Coccinelle can't decide, and
implodes:

    rule starting on line 10: node 96: error_propagate(...)[1,2,41,42] in net_client_init reachable by inconsistent control-flow paths

>>
>> Manually double-check @err is not used afterwards.  Dereferencing it
>> would be use after free, but checking whether it's null would be
>> legitimate.  One such change to qbus_realize() backed out.
>>
>> Suboptimal line breaks tweaked manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>>   22 files changed, 31 insertions(+), 73 deletions(-)
>
> At any rate, it's small enough to ensure all the changes remaining are
> still valid.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
  2020-06-24 18:03   ` Eric Blake
@ 2020-06-25 12:39   ` Markus Armbruster
  2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
  2020-06-29 10:40   ` Greg Kurz
  3 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 12:39 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block, pbonzini

Markus Armbruster <armbru@redhat.com> writes:

> Convert
>
>     foo(..., &err);
>     if (err) {
>         ...
>     }
>
> to
>
>     if (!foo(..., &err)) {
>         ...
>     }
>
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:
>
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     identifier errp;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>     -	   error_propagate(errp, err);
> 	       ...
> 	   }

Note that this rule is unsound: if err is read later on, we're screwed.
I checked manually it's not, but neglected to mention it in the commit
message.  I'll do that in v2.

The manual checking isn't that bad, most of the time we immediately
return.

>
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
>
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
>
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>



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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-24 18:21   ` Eric Blake
@ 2020-06-25 12:50     ` Markus Armbruster
  2020-06-25 14:41       ` Eric Blake
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 12:50 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> When all we do with an Error we receive into a local variable is
>> propagating to somewhere else, we can just as well receive it there
>> right away.  The previous commit did that for simple cases with
>> Coccinelle.  Do it for a few more manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   blockdev.c     |  5 +----
>>   hw/core/numa.c | 44 ++++++++++++++------------------------------
>>   qdev-monitor.c | 11 ++++-------
>>   3 files changed, 19 insertions(+), 41 deletions(-)
>>
>> diff --git a/blockdev.c b/blockdev.c
>> index b66863c42a..73736a4eaf 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
>>       }
>>         /* Actual block device init: Functionality shared with
>> blockdev-add */
>> -    blk = blockdev_init(filename, bs_opts, &local_err);
>> +    blk = blockdev_init(filename, bs_opts, errp);
>>       bs_opts = NULL;
>>       if (!blk) {
>> -        error_propagate(errp, local_err);
>>           goto fail;
>> -    } else {
>> -        assert(!local_err);
>
> Loses an assertion that blockdev_init() doesn't mis-use errp, but I
> think the goal of your cleanup work has been to make it easier to
> prove any function follows the rules, so the assertion doesn't add
> much at this point.

This is an early use of Error in the block layer.  Back then, we were
concerned about functions that are supposed to either return a value or
set an error doing both or none.  Since then, we've tacitly decided such
programming mistakes are too unlikely to be worth littering the code
with assertions.  Error handling is tediously verbose even without them.

Since this series is about making it somewhat less tediously verbose...

>> +++ b/qdev-monitor.c
>> @@ -600,7 +600,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>>       const char *driver, *path;
>>       DeviceState *dev = NULL;
>>       BusState *bus = NULL;
>> -    Error *err = NULL;
>>       bool hide;
>>         driver = qemu_opt_get(opts, "driver");
>> @@ -655,15 +654,14 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>>       dev = qdev_new(driver);
>>         /* Check whether the hotplug is allowed by the machine */
>> -    if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
>> +    if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
>>           /* Error must be set in the machine hook */
>> -        assert(err);
>
> Another such case.
>
>>           goto err_del_dev;
>>       }
>>         if (!bus && qdev_hotplug &&
>> !qdev_get_machine_hotplug_handler(dev)) {
>>           /* No bus, no machine hotplug handler --> device is not hotpluggable */
>> -        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
>> +        error_setg(errp, "Device '%s' can not be hotplugged on this machine",
>
> Should we s/can not/cannot/ while touching this?

The longer and the more mechanical the patch, the less willing I am to
include "while we're there" improvements.  This one may still be okay.
But you pointed out a few more error message improvements in later
reviews.  Perhaps collecting them all into an omnibus error message
patch would be better.

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

Thanks!



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

* Re: [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 18:32   ` Eric Blake
@ 2020-06-25 13:05     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 13:05 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> Replace
>>
>>      error_setg(&err, ...);
>>      error_propagate(errp, err);
>>
>> by
>>
>>      error_setg(errp, ...);
>>
>> Related pattern:
>
> Nice explanation.
>
>> Bonus: the elimination of gotos will make later patches in this series
>> easier to review.
>>
>> Candidates for conversion tracked down with this Coccinelle script:
>>
>>      @@
>>      identifier err, errp;
>>      expression list args;
>>      @@
>>      -    error_setg(&err, args);
>>      +    error_setg(errp, args);
>> 	 ... when != err
>> 	 error_propagate(errp, err);
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   backends/cryptodev.c        | 11 +++---
>>   backends/hostmem-file.c     | 19 +++-------
>>   backends/hostmem-memfd.c    | 15 ++++----
>>   backends/hostmem.c          | 27 ++++++--------
>>   block/throttle-groups.c     | 22 +++++------
>>   hw/hyperv/vmbus.c           |  5 +--
>>   hw/i386/pc.c                | 35 ++++++------------
>>   hw/mem/nvdimm.c             | 17 ++++-----
>>   hw/mem/pc-dimm.c            | 14 +++----
>>   hw/misc/aspeed_sdmc.c       |  3 +-
>>   hw/ppc/rs6000_mc.c          |  9 ++---
>>   hw/ppc/spapr.c              | 73 ++++++++++++++++---------------------
>>   hw/ppc/spapr_pci.c          | 14 +++----
>>   hw/s390x/ipl.c              | 23 +++++-------
>>   hw/s390x/sclp.c             | 12 ++----
>>   hw/xen/xen_pt_config_init.c |  3 +-
>>   iothread.c                  | 12 +++---
>>   net/colo-compare.c          | 20 ++++------
>>   net/dump.c                  | 10 ++---
>>   net/filter-buffer.c         | 10 ++---
>>   qga/commands-win32.c        | 16 +++-----
>>   21 files changed, 151 insertions(+), 219 deletions(-)
>
> A bit bigger, and starts to be too complex to ask Coccinelle to
> directly fix it (but at least using it for identification is nice).
> But the patch is still manageable, and hopefully not too many
> instances creep back in during the meantime while waiting for this
> series to land.
>
>> @@ -140,7 +138,6 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
>>       HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
>>         if (host_memory_backend_mr_inited(backend)) {
>> -
>>           error_setg(errp, "cannot change property 'pmem' of %s.",
>>                      object_get_typename(o));
>>           return;
>
> Unrelated cleanup.  Does it belong in a different patch?

I don't have a better one at hand.  The only other patch touching this
file is a worse choice: PATCH 23.

>> @@ -148,13 +145,9 @@ static void file_memory_backend_set_pmem(Object *o, bool value, Error **errp)
>>     #ifndef CONFIG_LIBPMEM
>>       if (value) {
>> -        Error *local_err = NULL;
>> -
>> -        error_setg(&local_err,
>> -                   "Lack of libpmem support while setting the 'pmem=on'"
>> +        error_setg(errp, "Lack of libpmem support while setting the 'pmem=on'"
>>                      " of %s. We can't ensure data persistence.",
>
> Pre-existing - doesn't follow our usual error message content
> conventions regarding trailing '.'.

Yes.  But this patch feels too big for me to also improve error
messages.  I can do it separately.

>> +++ b/hw/ppc/spapr_pci.c
>> @@ -1517,15 +1517,16 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
>>        */
>>       if (plugged_dev->hotplugged && bus->devices[PCI_DEVFN(slotnr, 0)] &&
>>           PCI_FUNC(pdev->devfn) != 0) {
>> -        error_setg(&local_err, "PCI: slot %d function 0 already ocuppied by %s,"
>> +        error_setg(errp, "PCI: slot %d function 0 already ocuppied by %s,"
>>                      " additional functions can no longer be exposed to guest.",
>
> Another one.  Also, s/ocuppied/occupied/ while touching it.

Likewise.

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

Thanks!



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

* Re: [PATCH 13/46] qemu-option: Simplify around find_default_by_name()
  2020-06-24 19:46   ` Eric Blake
@ 2020-06-25 13:12     ` Markus Armbruster
  2020-06-29 10:02       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 13:12 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   util/qemu-option.c | 13 ++++---------
>>   1 file changed, 4 insertions(+), 9 deletions(-)
>>
>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>> index ddcf3072c5..d9293814b4 100644
>> --- a/util/qemu-option.c
>> +++ b/util/qemu-option.c
>> @@ -286,11 +286,9 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
>>       opt = qemu_opt_find(opts, name);
>>       if (!opt) {
>>           def_val = find_default_by_name(opts, name);
>> -        if (def_val) {
>> -            return def_val;
>> -        }
>> +        return def_val;
>>       }
>> -    return opt ? opt->str : NULL;
>> +    return opt->str;
>>   }
>
> You could go with even fewer lines and variables by inverting the logic:
>
> if (opt) {
>     return opt->str;
> }
> return find_default_by_name(opts, name);

Yes, that's better.

>>     void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts,
>> const char *name)
>> @@ -320,7 +318,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>>   {
>>       QemuOpt *opt;
>>       const char *def_val;
>> -    char *str = NULL;
>> +    char *str;
>>         if (opts == NULL) {
>>           return NULL;
>> @@ -329,10 +327,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>>       opt = qemu_opt_find(opts, name);
>>       if (!opt) {
>>           def_val = find_default_by_name(opts, name);
>> -        if (def_val) {
>> -            str = g_strdup(def_val);
>> -        }
>> -        return str;
>> +        return g_strdup(def_val);
>
> Similarly, you could drop def_val with:
>  return g_strdup(find_default_by_name(opts, name));

Your contracted version is still readable; sold.

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

Thanks!



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

* Re: [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle
  2020-06-24 20:08   ` Eric Blake
@ 2020-06-25 13:33     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 13:33 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> The previous commit enables conversion of
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for QemuOpts functions that now return true / false on success /
>> error.  Coccinelle script:
>>
>
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Tidy up line breaks and whitespace.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>>   32 files changed, 70 insertions(+), 192 deletions(-)
>
> Another decent chunk of cleanups.
>
>>
>> diff --git a/block.c b/block.c
>> index 30a72bc4c2..77e85f13db 100644
>> --- a/block.c
>> +++ b/block.c
>
>> @@ -6091,8 +6086,8 @@ void bdrv_img_create(const char *filename, const char *fmt,
>>       }
>>         if (base_filename) {
>> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &local_err);
>> -        if (local_err) {
>> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
>> +                          &local_err)) {
>>               error_setg(errp, "Backing file not supported for file format '%s'",
>>                          fmt);
>
> Pre-existing - it is odd that we collect a message into local_err,
> then write something else into errp; the out: label does
> error_propagate(errp, local_err) which ensures there is no leak but
> discards the original err.  You could pass NULL instead.  But as it is
> pre-existing, passing NULL should be a separate patch.

PATCH 20.

>>               goto out;
>> @@ -6100,8 +6095,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
>>       }
>>         if (base_fmt) {
>> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err);
>> -        if (local_err) {
>> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &local_err)) {
>>               error_setg(errp, "Backing file format not supported for file "
>>                                "format '%s'", fmt);
>
> Ditto.

Likewise.

>> +++ b/qemu-img.c
>> @@ -467,8 +467,8 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
>>       Error *err = NULL;
>>         if (base_filename) {
>> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename, &err);
>> -        if (err) {
>> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename,
>> +                          &err)) {
>>               error_report("Backing file not supported for file format '%s'",
>>                            fmt);
>>               error_free(err);
>> @@ -476,8 +476,7 @@ static int add_old_style_options(const char *fmt, QemuOpts *opts,
>>           }
>>       }
>>       if (base_fmt) {
>> -        qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err);
>> -        if (err) {
>> +        if (!qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt, &err)) {
>>               error_report("Backing file format not supported for file "
>>                            "format '%s'", fmt);
>>               error_free(err);
>
> Ditto.

PATCH 44.

> But the conversion here is sane.
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 18/46] qemu-option: Smooth error checking manually
  2020-06-24 20:10   ` Eric Blake
@ 2020-06-25 13:46     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 13:46 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> When foo(..., &err) is followed by error_propagate(errp, err), we can
>> often just as well do foo(..., errp).  The previous commit did that
>> for simple cases with Coccinelle.  Do it for a few more manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   block.c             | 2 +-
>>   block/gluster.c     | 8 ++++----
>>   block/parallels.c   | 2 +-
>>   block/quorum.c      | 2 +-
>>   block/replication.c | 2 +-
>>   block/vxhs.c        | 4 ++--
>>   hw/net/virtio-net.c | 4 ++--
>>   7 files changed, 12 insertions(+), 12 deletions(-)
>>
>
>> +++ b/block/gluster.c
>> @@ -523,7 +523,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
>>         /* create opts info from runtime_json_opts list */
>>       opts = qemu_opts_create(&runtime_json_opts, NULL, 0, &error_abort);
>> -    if (!qemu_opts_absorb_qdict(opts, options, &local_err)) {
>> +    if (!qemu_opts_absorb_qdict(opts, options, errp)) {
>>           goto out;
>>       }
>
> This function also has a few error_setg(&local_err) that could be
> cleaned up to error_setg(errp);

More elsewhere.  PATCH 08 transforms them only where it permits deleting
the error_propagate().  I left the remainder for another day.  Not all
of them can be transformed more or less mechanically, e.g. this one in
mirror.c:

        if (bdrv_recurse_can_replace(src, to_replace)) {
            bdrv_replace_node(to_replace, target_bs, &local_err);
        } else {
            error_setg(&local_err, "Can no longer replace '%s' by '%s', "
                       "because it can no longer be guaranteed that doing so "
                       "would not lead to an abrupt change of visible data",
                       to_replace->node_name, target_bs->node_name);
        }
        bdrv_drained_end(target_bs);
        if (local_err) {
            error_report_err(local_err);
            ret = -EPERM;
        }

>                                 but the ones that use
> error_append_hint() immediately after (and thus the
> error_propagate(errp, local_err) in the out: label) still have to
> remain, until we have Vladimir's macro in place.

Correct.

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

Thanks!



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

* Re: [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create()
  2020-06-24 20:14   ` Eric Blake
@ 2020-06-25 13:47     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 13:47 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> When creating an image fails because the format doesn't support option
>> "backing_file" or "backing_fmt", bdrv_img_create() first has
>> qemu_opt_set() put a generic error into @local_err, then puts the real
>> error into @errp with error_setg(), and then propagates the former to
>> the latter, which throws away the generic error.  A bit complicated,
>> but works.
>
> Hmm - may interact with my series to deprecate -b without -F.  We'll
> deal with the fallout based on whatever lands first.
>
>>
>> Not that qemu_opt_set() returns a useful value, we can simply ignore
>
> s/Not/Now/

Will fix.

>> the generic error instead.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   block.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> Aha - you fixed 2 of the 4 cases that I noticed in 17/46.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-25 12:50     ` Markus Armbruster
@ 2020-06-25 14:41       ` Eric Blake
  0 siblings, 0 replies; 157+ messages in thread
From: Eric Blake @ 2020-06-25 14:41 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

On 6/25/20 7:50 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>>> When all we do with an Error we receive into a local variable is
>>> propagating to somewhere else, we can just as well receive it there
>>> right away.  The previous commit did that for simple cases with
>>> Coccinelle.  Do it for a few more manually.
>>>

>>>          if (!bus && qdev_hotplug &&
>>> !qdev_get_machine_hotplug_handler(dev)) {
>>>            /* No bus, no machine hotplug handler --> device is not hotpluggable */
>>> -        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
>>> +        error_setg(errp, "Device '%s' can not be hotplugged on this machine",
>>
>> Should we s/can not/cannot/ while touching this?
> 
> The longer and the more mechanical the patch, the less willing I am to
> include "while we're there" improvements.  This one may still be okay.
> But you pointed out a few more error message improvements in later
> reviews.  Perhaps collecting them all into an omnibus error message
> patch would be better.

Yes, collecting a single followup patch for grammar/spelling fixes found 
throughout the series is a good idea.

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



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

* Re: [PATCH 01/46] error: Improve examples in error.h's big comment
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
  2020-06-24 16:59   ` Eric Blake
@ 2020-06-25 14:43   ` Vladimir Sementsov-Ogievskiy
  2020-06-25 14:44   ` Greg Kurz
  2 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25 14:43 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:42, Markus Armbruster wrote:
> Show errp instead of &err where &err is actually unusual.  Add a
> missing declaration.  Add a second error pileup example.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 01/46] error: Improve examples in error.h's big comment
  2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
  2020-06-24 16:59   ` Eric Blake
  2020-06-25 14:43   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-25 14:44   ` Greg Kurz
  2020-06-25 15:28     ` Markus Armbruster
  2 siblings, 1 reply; 157+ messages in thread
From: Greg Kurz @ 2020-06-25 14:44 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

On Wed, 24 Jun 2020 18:42:59 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Show errp instead of &err where &err is actually unusual.  Add a
> missing declaration.  Add a second error pileup example.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/qapi/error.h | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/include/qapi/error.h b/include/qapi/error.h
> index ad5b6e896d..1a5ea25e12 100644
> --- a/include/qapi/error.h
> +++ b/include/qapi/error.h
> @@ -16,15 +16,15 @@
>   * Error reporting system loosely patterned after Glib's GError.
>   *
>   * Create an error:
> - *     error_setg(&err, "situation normal, all fouled up");
> + *     error_setg(errp, "situation normal, all fouled up");
>   *
>   * Create an error and add additional explanation:
> - *     error_setg(&err, "invalid quark");
> - *     error_append_hint(&err, "Valid quarks are up, down, strange, "
> + *     error_setg(errp, "invalid quark");
> + *     error_append_hint(errp, "Valid quarks are up, down, strange, "
>   *                       "charm, top, bottom.\n");
>   *
>   * Do *not* contract this to
> - *     error_setg(&err, "invalid quark\n"
> + *     error_setg(errp, "invalid quark\n" // WRONG!
>   *                "Valid quarks are up, down, strange, charm, top, bottom.");
>   *
>   * Report an error to the current monitor if we have one, else stderr:
> @@ -108,12 +108,23 @@
>   *     }
>   *
>   * Do *not* "optimize" this to
> + *     Error *err = NULL;
>   *     foo(arg, &err);
>   *     bar(arg, &err); // WRONG!
>   *     if (err) {
>   *         handle the error...
>   *     }
>   * because this may pass a non-null err to bar().
> + *
> + * Likewise, do *not*
> + *     Error *err = NULL;
> + *     if (cond1) {
> + *         error_setg(err, ...);

s/err/&err

> + *     }
> + *     if (cond2) {
> + *         error_setg(err, ...); // WRONG!

ditto

With that fixed:

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

> + *     }
> + * because this may pass a non-null err to error_setg().
>   */
>  
>  #ifndef ERROR_H



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

* Re: [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void
  2020-06-24 20:43   ` Eric Blake
@ 2020-06-25 14:56     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 14:56 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> See recent commit "error: Document Error API usage rules" for
>> rationale.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   docs/devel/qapi-code-gen.txt  |  51 +++++------
>>   include/qapi/clone-visitor.h  |   8 +-
>>   include/qapi/visitor-impl.h   |  26 +++---
>>   include/qapi/visitor.h        | 102 ++++++++++++---------
>>   audio/audio_legacy.c          |  15 ++--
>>   qapi/opts-visitor.c           |  58 +++++++-----
>>   qapi/qapi-clone-visitor.c     |  33 ++++---
>>   qapi/qapi-dealloc-visitor.c   |  27 ++++--
>>   qapi/qapi-visit-core.c        | 165 ++++++++++++++++++----------------
>>   qapi/qobject-input-visitor.c  | 109 +++++++++++++---------
>>   qapi/qobject-output-visitor.c |  27 ++++--
>>   qapi/string-input-visitor.c   |  62 +++++++------
>>   qapi/string-output-visitor.c  |  32 ++++---
>>   scripts/qapi/visit.py         |  58 +++++-------
>>   14 files changed, 435 insertions(+), 338 deletions(-)
>
> Hefty, but I don't see a sane way to split it further.

I kept its scope as narrow as I could.  More on that below.

>> diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt
>> index a7794ef658..9bfc57063c 100644
>> --- a/docs/devel/qapi-code-gen.txt
>> +++ b/docs/devel/qapi-code-gen.txt
>
>> -    void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
>> +    bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error **errp)
>>       {
>>           Error *err = NULL;
>>   -        visit_type_int(v, "integer", &obj->integer, &err);
>> -        if (err) {
>> -            goto out;
>> +        if (!visit_type_int(v, "integer", &obj->integer, errp)) {
>> +            return false;
>>           }
>>           if (visit_optional(v, "string", &obj->has_string)) {
>> -            visit_type_str(v, "string", &obj->string, &err);
>> -            if (err) {
>> -                goto out;
>> +            if (!visit_type_str(v, "string", &obj->string, errp)) {
>> +                return false;
>>               }
>>           }
>
> Is this worth compressing two 'if's into one:
>
> if (visit_optional(...) &&
>     !visit_type_str(...)) {
>     return false;
> }

This is due to the structure of the code generator:

       for memb in members:
           ret += gen_if(memb.ifcond)
           if memb.optional:
               ret += mcgen('''
       if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
   ''',
                            name=memb.name, c_name=c_name(memb.name))
               push_indent()
           ret += mcgen('''
       if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) {
           return false;
       }
   ''',
                        c_type=memb.type.c_name(), name=memb.name,
                        c_name=c_name(memb.name))
           if memb.optional:
               pop_indent()
               ret += mcgen('''
       }
   ''')
           ret += gen_endif(memb.ifcond)

Note how we splice in the if (visit_optional(...)) without affecting the
common part.

I doubt messing with it is worthwhile.

>> -
>> -    out:
>>           error_propagate(errp, err);
>> +        return !err;
>
> Now that 'err' is never anything but NULL, why aren't you dropping the
> error_propagate() and merely using 'return true;'?

We can't drop the error_propagate() just yet, because the generator can
still generate code that needs it, just not for this particular input.

Narrow scope: this patch does just enough to make the functions return
bool.  It freely uses such bool function values for this purpose, but it
refrains from exploiting them for more.  That's left to later patches,
in this case PATCH 25.

>>       }
>>   -    void visit_type_UserDefOne(Visitor *v, const char *name,
>> UserDefOne **obj, Error **errp)
>> +    bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **obj, Error **errp)
>>       {
>>           Error *err = NULL;
>>   -        visit_start_struct(v, name, (void **)obj,
>> sizeof(UserDefOne), &err);
>> -        if (err) {
>> -            goto out;
>> +        if (!visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), errp)) {
>> +            return false;
>>           }
>>           if (!*obj) {
>>               /* incomplete */
>> @@ -1461,19 +1457,18 @@ Example:
>
> Adding context:
>
>>             assert(visit_is_dealloc(v));
>>             goto out_obj;
>>         }
>>         visit_type_UserDefOne_members(v, *obj, &err);
>>         if (err) {
>>             goto out_obj;
>
> Should this be:
>
>> if (!visit_type_UserDefOne_members(v, *obj, &err)) {
>>     goto out_obj;

Also left for PATCH 25.

>>         }
>>         visit_check_struct(v, &err);
>>     out_obj:
>>         visit_end_struct(v, (void **)obj);
>>         if (err && visit_is_input(v)) {
>
>
>>               qapi_free_UserDefOne(*obj);
>>               *obj = NULL;
>>           }
>> -    out:
>>           error_propagate(errp, err);
>> +        return !err;
>
> Here, err is still used by out_obj:, so this one is fine.
>
>>       }
>>   -    void visit_type_UserDefOneList(Visitor *v, const char *name,
>> UserDefOneList **obj, Error **errp)
>> +    bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
>>       {
>>           Error *err = NULL;
>>           UserDefOneList *tail;
>>           size_t size = sizeof(**obj);
>>   -        visit_start_list(v, name, (GenericList **)obj, size,
>> &err);
>> -        if (err) {
>> -            goto out;
>> +        if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) {
>> +            return false;
>>           }
>>             for (tail = *obj; tail;
>> @@ -1492,21 +1487,19 @@ Example:
>
> Adding context:
>
>>              tail = (UserDefOneList *)visit_next_list(v, (GenericList *)tail, size)) {
>>             visit_type_UserDefOne(v, NULL, &tail->value, &err);
>>             if (err) {
>>                 break;
>>             }
>
> Should this be:
> if (visit_type_UserDefOne(...)) {
>     break;

Likewise.

>>         }
>>
>>         if (!err) {
>>             visit_check_list(v, &err);
>>         }
>>         visit_end_list(v, (void **)obj);
>>         if (err && visit_is_input(v)) {
>
>
>>               qapi_free_UserDefOneList(*obj);
>>               *obj = NULL;
>>           }
>> -    out:
>>           error_propagate(errp, err);
>> +        return !err;
>>       }
>
> Again, err is still used, so this one is fine.
>
>>   -    void visit_type_q_obj_my_command_arg_members(Visitor *v,
>> q_obj_my_command_arg *obj, Error **errp)
>> +    bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_command_arg *obj, Error **errp)
>>       {
>>           Error *err = NULL;
>>   -        visit_type_UserDefOneList(v, "arg1", &obj->arg1, &err);
>> -        if (err) {
>> -            goto out;
>> +        if (!visit_type_UserDefOneList(v, "arg1", &obj->arg1, errp)) {
>> +            return false;
>>           }
>> -
>> -    out:
>>           error_propagate(errp, err);
>> +        return !err;
>>       }
>
> But this is another one where err is unused.

Generated by the code as visit_type_UserDefOne_members() above.

>>     [Uninteresting stuff omitted...]
>> diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h
>> index 5b665ee38c..adf9a788e2 100644
>> --- a/include/qapi/clone-visitor.h
>
>> +++ b/include/qapi/visitor.h
>> @@ -286,6 +284,8 @@ void visit_free(Visitor *v);
>>    * On failure, set *@obj to NULL and store an error through @errp.
>>    * Can happen only when @v is an input visitor.
>>    *
>> + * Return true on succes, false on failure.
>
> success
>
> (copied several times in this file)

Will fix.

>> +++ b/qapi/qapi-clone-visitor.c
>
>> -static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
>> +static bool qapi_clone_type_int64(Visitor *v, const char *name, int64_t *obj,
>>                                      Error **errp)
>
> Pre-existing indentation glitch that you could fix while here.

Will do.

>>   {
>>       QapiCloneVisitor *qcv = to_qcv(v);
>>         assert(qcv->depth);
>>       /* Value was already cloned by g_memdup() */
>> +    return true;
>>   }
>>   -static void qapi_clone_type_uint64(Visitor *v, const char *name,
>> +static bool qapi_clone_type_uint64(Visitor *v, const char *name,
>>                                       uint64_t *obj, Error **errp)
>
> Ditto for several more functions in this file.

ACK.

Thanks!



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

* Re: [PATCH 23/46] qapi: Smooth error checking with Coccinelle
  2020-06-24 20:50   ` Eric Blake
@ 2020-06-25 15:03     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:03 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> The previous commit enables conversion of
>>
>>      visit_foo(..., &err);
>>      if (err) {
>> 	...
>>      }
>>
>> to
>>
>>      if (!visit_foo(..., errp)) {
>> 	...
>>      }
>>
>> for visitor functions that now return true / false on success / error.
>> Coccinelle script:
>>
>>      @@
>>      identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";
>
> Long line. Does coccinelle understand \-newline wrapping?

Documentation is mum on it.  A quick test appears to work.  I'll check
whether I still get the same result here.

>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      identifier errp;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, errp, args2)) {
>> 	       ... when != err
>>      -	   error_propagate(errp, err);
>> 	       ...
>> 	   }
>>
>>      @@
>>      identifier fun =~ "check_list|input_type_enum|lv_start_struct|lv_type_bool|lv_type_int64|lv_type_str|lv_type_uint64|output_type_enum|parse_type_bool|parse_type_int64|parse_type_null|parse_type_number|parse_type_size|parse_type_str|parse_type_uint64|print_type_bool|print_type_int64|print_type_null|print_type_number|print_type_size|print_type_str|print_type_uint64|qapi_clone_start_alternate|qapi_clone_start_list|qapi_clone_start_struct|qapi_clone_type_bool|qapi_clone_type_int64|qapi_clone_type_null|qapi_clone_type_number|qapi_clone_type_str|qapi_clone_type_uint64|qapi_dealloc_start_list|qapi_dealloc_start_struct|qapi_dealloc_type_anything|qapi_dealloc_type_bool|qapi_dealloc_type_int64|qapi_dealloc_type_null|qapi_dealloc_type_number|qapi_dealloc_type_str|qapi_dealloc_type_uint64|qobject_input_check_list|qobject_input_check_struct|qobject_input_start_alternate|qobject_input_start_list|qobject_input_start_struct|qobject_input_type_any|qobject_input_type_bool|qobject_input_type_bool_keyval|qobject_input_type_int64|qobject_input_type_int64_keyval|qobject_input_type_null|qobject_input_type_number|qobject_input_type_number_keyval|qobject_input_type_size_keyval|qobject_input_type_str|qobject_input_type_str_keyval|qobject_input_type_uint64|qobject_input_type_uint64_keyval|qobject_output_start_list|qobject_output_start_struct|qobject_output_type_any|qobject_output_type_bool|qobject_output_type_int64|qobject_output_type_null|qobject_output_type_number|qobject_output_type_str|qobject_output_type_uint64|start_list|visit_check_list|visit_check_struct|visit_start_alternate|visit_start_list|visit_start_struct|visit_type_.*";
>
> The same list twice.  Is there a way to write it only once, then refer
> to it by reference in the two halves of the script?

I wish I knew!  Tell me, and I owe you a beverage of your choice at the
next in-person KVM Forum.

>>   46 files changed, 95 insertions(+), 331 deletions(-)
>
> Nice to see the size reduction.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure
  2020-06-24 21:07   ` Eric Blake
@ 2020-06-25 15:05     ` Markus Armbruster
  2020-07-02 12:11       ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:05 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> Pass &error_abort instead of NULL where the returned value is
>> dereferenced or asserted to be non-null.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>> @@ -63,8 +64,8 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
>>           return -1;
>>       }
>>   -    parent_mr = object_property_get_link(OBJECT(sbdev_mr),
>> "container", NULL);
>> -
>> +    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container",
>> +                                         &error_abort);
>>       assert(parent_mr);
>
> Do we still need to keep the assert?

Not really, I guess.

>> +++ b/hw/ppc/spapr_pci_nvlink2.c
>> @@ -141,9 +141,10 @@ static void spapr_phb_pci_collect_nvgpu(PCIBus *bus, PCIDevice *pdev,
>>       if (tgt) {
>>           Error *local_err = NULL;
>>           SpaprPhbPciNvGpuConfig *nvgpus = opaque;
>> -        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]", NULL);
>> +        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]",
>> +                                                  &error_abort);
>>           Object *mr_npu = object_property_get_link(po, "nvlink2-atsd-mr[0]",
>> -                                                  NULL);
>> +                                                  &error_abort);
>>             g_assert(mr_gpu || mr_npu);
>
> Likewise.

I'll drop both unless somebody objects.



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

* Re: [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-25  6:36   ` Philippe Mathieu-Daudé
@ 2020-06-25 15:09     ` Markus Armbruster
  2020-06-29 14:38       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:09 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

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

> On 6/24/20 6:43 PM, Markus Armbruster wrote:
>> Don't handle object_property_get_link() failure that can't happen
>> unless the programmer screwed up, pass &error_abort.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  hw/arm/bcm2835_peripherals.c |  7 +------
>>  hw/arm/bcm2836.c             |  7 +------
>>  hw/display/bcm2835_fb.c      |  8 +-------
>>  hw/dma/bcm2835_dma.c         |  9 +--------
>>  hw/gpio/bcm2835_gpio.c       | 15 ++-------------
>>  hw/intc/nios2_iic.c          |  8 +-------
>>  hw/misc/bcm2835_mbox.c       |  9 +--------
>>  hw/misc/bcm2835_property.c   | 17 ++---------------
>>  hw/usb/hcd-dwc2.c            |  9 +--------
>>  9 files changed, 11 insertions(+), 78 deletions(-)
>> 
>> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
>> index 8313410ffe..3c40bda91e 100644
>> --- a/hw/arm/bcm2835_peripherals.c
>> +++ b/hw/arm/bcm2835_peripherals.c
>> @@ -134,12 +134,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>>      uint64_t ram_size, vcram_size;
>>      int n;
>>  
>> -    obj = object_property_get_link(OBJECT(dev), "ram", &err);
>> -    if (obj == NULL) {
>> -        error_setg(errp, "%s: required ram link not found: %s",
>> -                   __func__, error_get_pretty(err));
>> -        return;
>> -    }
>> +    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
> [...]
>
> Should we now add an assert(errp) in object_property_get_link()?
> Basically this would force forks to adapt their code when
> rebasing.

Functions should not place additional restrictions @errp arguments
without a compelling reason.  What if you want genuinely don't need the
error details when object_property_get_link() fails?  Passing null is
better than passing &err only to error_free(err).

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

Thanks!



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

* Re: [PATCH 36/46] qom: Put name parameter before value / visitor parameter
  2020-06-24 21:27   ` Eric Blake
@ 2020-06-25 15:14     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:14 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> The object_property_set_FOO() setters take property name and value in
>> an unusual order:
>>
>>      void object_property_set_FOO(Object *obj, FOO_TYPE value,
>>                                   const char *name, Error **errp)
>>
>> Having to pass value before name feels grating.  Swap them.
>>
>> Same for object_property_set(), object_property_get(), and
>> object_property_parse().
>>
>> Convert callers with this Coccinelle script:
>>
>>      @@
>>      identifier fun = {object_property_get, object_property_parse, object_property_set_str, object_property_set_link, object_property_set_bool, object_property_set_int, object_property_set_uint, object_property_set, object_property_set_qobject};
>>      expression obj, v, name, errp;
>>      @@
>>      -    fun(obj, v, name, errp)
>>      +    fun(obj, name, v, errp)
>>
>> Chokes on hw/arm/musicpal.c's lcd_refresh() with the unhelpful error
>> message "no position information".  Convert that one manually.
>>
>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Fails to convert hw/rx/rx-gdbsim.c, because Coccinelle gets confused
>> by RXCPU being used both as typedef and function-like macro there.
>> Convert manually.  Convert that one manually.  The other files using
>> RXCPU that way don't need conversion.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>>   136 files changed, 702 insertions(+), 729 deletions(-)
>
> Big but mechanical.
>
> Reviewed-by: Eric Blake <eblake@redhat.com>
>
> This one might be a semantic conflict magnet with patches written in
> the meantime;

You bet!

>               I guess the trick is to check that 'git grep' finds as
> many calls to any of the functions listed as conversions.

I throw away the old patch and rerun Coccinelle.  Works except when I
rebase onto changes to the files containing the functions that change,
because my Coccinelle script only updates calls, not definitions.
Hasn't been an issue so far.



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

* Re: [PATCH 37/46] qom: Make functions taking Error ** return bool, not void
  2020-06-24 21:32   ` Eric Blake
@ 2020-06-25 15:14     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:14 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> See recent commit "error: Document Error API usage rules" for
>> rationale.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
>> @@ -524,25 +527,29 @@ void object_initialize(void *data, size_t size, const char *typename)
>>       object_initialize_with_type(data, size, type);
>>   }
>>   -void object_initialize_child_with_props(Object *parentobj,
>> +bool object_initialize_child_with_props(Object *parentobj,
>>                                const char *propname,
>>                                void *childobj, size_t size, const char *type,
>>                                Error **errp, ...)
>
> Is it worth tweaking indentation while here?

Can do.

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

Thanks!



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

* Re: [PATCH 43/46] qdev: Smooth error checking manually
  2020-06-24 21:42   ` Eric Blake
@ 2020-06-25 15:15     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:15 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Markus Armbruster, qemu-devel, pbonzini

Eric Blake <eblake@redhat.com> writes:

> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>> When foo(..., &err) is followed by error_propagate(errp, err), we can
>> often just as well do foo(..., errp).  The previous commit did that
>> for simple cases with Coccinelle.  Do it for one more manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   hw/block/fdc.c | 8 +++-----
>>   1 file changed, 3 insertions(+), 5 deletions(-)
>>
>
>> @@ -2566,11 +2566,9 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
>>           blk_ref(blk);
>>           blk_detach_dev(blk, fdc_dev);
>>           fdctrl->qdev_for_drives[i].blk = NULL;
>> -        qdev_prop_set_drive_err(dev, "drive", blk, &local_err);
>> +        ok = qdev_prop_set_drive_err(dev, "drive", blk, errp);
>>           blk_unref(blk);
>
> Perhaps some glib g_auto* magic could make this even easier (to mark a
> variable to be blk_unref'd when it goes out of scope).  But for now,
> your pattern is fine.

It's PATCH 43, my hatchet needs sharpening, and my arm hurts ;)

>> -
>> -        if (local_err) {
>> -            error_propagate(errp, local_err);
>> +        if (!ok) {
>>               return;
>>           }
>>   
>
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks!



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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
  2020-06-24 17:51   ` Eric Blake
  2020-06-25  7:16   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-25 15:17   ` Greg Kurz
  2020-06-25 15:30     ` Markus Armbruster
  2 siblings, 1 reply; 157+ messages in thread
From: Greg Kurz @ 2020-06-25 15:17 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

On Wed, 24 Jun 2020 18:43:00 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> This merely codifies existing practice, with one exception: the rule
> advising against returning void, where existing practice is mixed.
> 
> When the Error API was created, we adopted the (unwritten) rule to
> return void when the function returns no useful value on success,
> unlike GError, which recommends to return true on success and false on
> error then.
> 
> When a function returns a distinct error value, say false, a checked
> call that passes the error up looks like
> 
>     if (!frobnicate(..., errp)) {
>         handle the error...
>     }
> 
> When it returns void, we need
> 
>     Error *err = NULL;
> 
>     frobnicate(..., &err);
>     if (err) {
>         handle the error...
>         error_propagate(errp, err);
>     }
> 
> Not only is this more verbose, it also creates an Error object even
> when @errp is null, &error_abort or &error_fatal.
> 
> People got tired of the additional boilerplate, and started to ignore
> the unwritten rule.  The result is confusion among developers about
> the preferred usage.
> 

This confusion is reinforced by the fact that the standard pattern:

    error_setg(errp, ...);
    error_append_hint(errp, ...);

doesn't work when errp is &error_fatal, which is a typical case of
an invalid command line argument, where it is valuable to suggest
something sensible to the user but error_setg() exits before we
could do so.

Fortunately, Vladimir's work will address that and eliminate the
temptation to workaround the issue with more boilerplate :)

> The written rule will hopefully reduce the confusion.
> 
> The remainder of this series will update a substantial amount of code
> to honor the rule.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

>  include/qapi/error.h | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/include/qapi/error.h b/include/qapi/error.h
> index 1a5ea25e12..c3d84d610a 100644
> --- a/include/qapi/error.h
> +++ b/include/qapi/error.h
> @@ -15,6 +15,32 @@
>  /*
>   * Error reporting system loosely patterned after Glib's GError.
>   *
> + * Rules:
> + *
> + * - Functions that use Error to report errors have an Error **errp
> + *   parameter.  It should be the last parameter, except for functions
> + *   taking variable arguments.
> + *
> + * - You may pass NULL to not receive the error, &error_abort to abort
> + *   on error, &error_fatal to exit(1) on error, or a pointer to a
> + *   variable containing NULL to receive the error.
> + *
> + * - The value of @errp should not affect control flow.
> + *
> + * - On success, the function should not use @errp.  On failure, it
> + *   should set a new error, e.g. with error_setg(errp, ...), or
> + *   propagate an existing one, e.g. with error_propagate(errp, ...).
> + *
> + * - Whenever practical, also return a value that indicates success /
> + *   failure.  This can make the error checking more concise, and can
> + *   avoid useless error object creation and destruction.  Note that
> + *   we still have many functions returning void.  We recommend
> + *   • bool-valued functions return true on success / false on failure,
> + *   • pointer-valued functions return non-null / null pointer, and
> + *   • integer-valued functions return non-negative / negative.
> + *
> + * How to:
> + *
>   * Create an error:
>   *     error_setg(errp, "situation normal, all fouled up");
>   *



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

* Re: [PATCH 01/46] error: Improve examples in error.h's big comment
  2020-06-25 14:44   ` Greg Kurz
@ 2020-06-25 15:28     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:28 UTC (permalink / raw)
  To: Greg Kurz
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Greg Kurz <groug@kaod.org> writes:

> On Wed, 24 Jun 2020 18:42:59 +0200
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> Show errp instead of &err where &err is actually unusual.  Add a
>> missing declaration.  Add a second error pileup example.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  include/qapi/error.h | 19 +++++++++++++++----
>>  1 file changed, 15 insertions(+), 4 deletions(-)
>> 
>> diff --git a/include/qapi/error.h b/include/qapi/error.h
>> index ad5b6e896d..1a5ea25e12 100644
>> --- a/include/qapi/error.h
>> +++ b/include/qapi/error.h
>> @@ -16,15 +16,15 @@
>>   * Error reporting system loosely patterned after Glib's GError.
>>   *
>>   * Create an error:
>> - *     error_setg(&err, "situation normal, all fouled up");
>> + *     error_setg(errp, "situation normal, all fouled up");
>>   *
>>   * Create an error and add additional explanation:
>> - *     error_setg(&err, "invalid quark");
>> - *     error_append_hint(&err, "Valid quarks are up, down, strange, "
>> + *     error_setg(errp, "invalid quark");
>> + *     error_append_hint(errp, "Valid quarks are up, down, strange, "
>>   *                       "charm, top, bottom.\n");
>>   *
>>   * Do *not* contract this to
>> - *     error_setg(&err, "invalid quark\n"
>> + *     error_setg(errp, "invalid quark\n" // WRONG!
>>   *                "Valid quarks are up, down, strange, charm, top, bottom.");
>>   *
>>   * Report an error to the current monitor if we have one, else stderr:
>> @@ -108,12 +108,23 @@
>>   *     }
>>   *
>>   * Do *not* "optimize" this to
>> + *     Error *err = NULL;
>>   *     foo(arg, &err);
>>   *     bar(arg, &err); // WRONG!
>>   *     if (err) {
>>   *         handle the error...
>>   *     }
>>   * because this may pass a non-null err to bar().
>> + *
>> + * Likewise, do *not*
>> + *     Error *err = NULL;
>> + *     if (cond1) {
>> + *         error_setg(err, ...);
>
> s/err/&err
>
>> + *     }
>> + *     if (cond2) {
>> + *         error_setg(err, ...); // WRONG!
>
> ditto

Good catch!

> With that fixed:
>
> Reviewed-by: Greg Kurz <groug@kaod.org>

Thanks!

>
>> + *     }
>> + * because this may pass a non-null err to error_setg().
>>   */
>>  
>>  #ifndef ERROR_H



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

* Re: [PATCH 02/46] error: Document Error API usage rules
  2020-06-25 15:17   ` Greg Kurz
@ 2020-06-25 15:30     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-25 15:30 UTC (permalink / raw)
  To: Greg Kurz
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Greg Kurz <groug@kaod.org> writes:

> On Wed, 24 Jun 2020 18:43:00 +0200
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> This merely codifies existing practice, with one exception: the rule
>> advising against returning void, where existing practice is mixed.
>> 
>> When the Error API was created, we adopted the (unwritten) rule to
>> return void when the function returns no useful value on success,
>> unlike GError, which recommends to return true on success and false on
>> error then.
>> 
>> When a function returns a distinct error value, say false, a checked
>> call that passes the error up looks like
>> 
>>     if (!frobnicate(..., errp)) {
>>         handle the error...
>>     }
>> 
>> When it returns void, we need
>> 
>>     Error *err = NULL;
>> 
>>     frobnicate(..., &err);
>>     if (err) {
>>         handle the error...
>>         error_propagate(errp, err);
>>     }
>> 
>> Not only is this more verbose, it also creates an Error object even
>> when @errp is null, &error_abort or &error_fatal.
>> 
>> People got tired of the additional boilerplate, and started to ignore
>> the unwritten rule.  The result is confusion among developers about
>> the preferred usage.
>> 
>
> This confusion is reinforced by the fact that the standard pattern:
>
>     error_setg(errp, ...);
>     error_append_hint(errp, ...);
>
> doesn't work when errp is &error_fatal, which is a typical case of
> an invalid command line argument, where it is valuable to suggest
> something sensible to the user but error_setg() exits before we
> could do so.
>
> Fortunately, Vladimir's work will address that and eliminate the
> temptation to workaround the issue with more boilerplate :)

Yes, my work does not obviate Vladimir's at all.  It merely reduce the
number of auto-propagations, hopefully making his patches slightly less
scary.

>> The written rule will hopefully reduce the confusion.
>> 
>> The remainder of this series will update a substantial amount of code
>> to honor the rule.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
> Reviewed-by: Greg Kurz <groug@kaod.org>

Thanks!



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
  2020-06-24 18:03   ` Eric Blake
  2020-06-25 12:39   ` Markus Armbruster
@ 2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
  2020-06-26  6:19     ` Markus Armbruster
  2020-07-03 10:41     ` Markus Armbruster
  2020-06-29 10:40   ` Greg Kurz
  3 siblings, 2 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25 19:00 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> Convert
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:

Please, also mention a command to run the script

> 
>      @@
>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      identifier errp;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>      -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>      @@
>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
> 
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>
> ---
>   hw/arm/allwinner-a10.c          |  21 ++-----
>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>   hw/arm/armv7m.c                 |  12 +---
>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>   hw/arm/bcm2836.c                |  12 +---
>   hw/arm/cubieboard.c             |   3 +-
>   hw/arm/digic.c                  |  12 +---
>   hw/arm/digic_boards.c           |   3 +-
>   hw/arm/fsl-imx25.c              |  44 ++++----------
>   hw/arm/fsl-imx31.c              |  32 +++-------
>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>   hw/arm/msf2-soc.c               |  21 ++-----
>   hw/arm/nrf51_soc.c              |  24 ++------
>   hw/arm/stm32f205_soc.c          |  29 +++------
>   hw/arm/stm32f405_soc.c          |  32 +++-------
>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>   hw/block/fdc.c                  |   4 +-
>   hw/block/xen-block.c            |   3 +-
>   hw/char/serial-pci-multi.c      |   5 +-
>   hw/char/serial-pci.c            |   5 +-
>   hw/char/serial.c                |  10 +--
>   hw/core/cpu.c                   |   3 +-
>   hw/cpu/a15mpcore.c              |   5 +-
>   hw/cpu/a9mpcore.c               |  21 ++-----
>   hw/cpu/arm11mpcore.c            |  17 ++----
>   hw/cpu/realview_mpcore.c        |   9 +--
>   hw/display/virtio-gpu-pci.c     |   6 +-
>   hw/display/virtio-vga.c         |   5 +-
>   hw/intc/armv7m_nvic.c           |   9 +--
>   hw/intc/pnv_xive.c              |   8 +--
>   hw/intc/realview_gic.c          |   5 +-
>   hw/intc/spapr_xive.c            |   8 +--
>   hw/intc/xics.c                  |   5 +-
>   hw/intc/xive.c                  |   3 +-
>   hw/isa/piix4.c                  |   5 +-
>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>   hw/mips/cps.c                   |  17 ++----
>   hw/misc/macio/cuda.c            |   5 +-
>   hw/misc/macio/macio.c           |  25 ++------
>   hw/misc/macio/pmu.c             |   5 +-
>   hw/pci-host/pnv_phb3.c          |  13 +---
>   hw/pci-host/pnv_phb4.c          |   5 +-
>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>   hw/ppc/e500.c                   |   5 +-
>   hw/ppc/pnv.c                    |  53 ++++------------
>   hw/ppc/pnv_core.c               |   4 +-
>   hw/ppc/pnv_psi.c                |   9 +--
>   hw/ppc/spapr_cpu_core.c         |   3 +-
>   hw/ppc/spapr_irq.c              |   5 +-
>   hw/riscv/opentitan.c            |   9 +--
>   hw/riscv/sifive_e.c             |   6 +-
>   hw/riscv/sifive_u.c             |   5 +-
>   hw/s390x/event-facility.c       |  13 ++--
>   hw/s390x/s390-pci-bus.c         |   3 +-
>   hw/s390x/sclp.c                 |   3 +-
>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>   hw/scsi/scsi-bus.c              |   4 +-
>   hw/sd/aspeed_sdhci.c            |   4 +-
>   hw/sd/ssi-sd.c                  |   3 +-
>   hw/usb/bus.c                    |   3 +-
>   hw/virtio/virtio-rng-pci.c      |   5 +-
>   qdev-monitor.c                  |   3 +-
>  65 files changed, 248 insertions(+), 768 deletions(-)

Almost all of this diff-stat may be generated by more obvious script:

@rule1@
identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
expression list args;
typedef Error;
Error *err;
identifier errp;
@@

-      fun(args, &err);
-      if (err)
+      if (!fun(args, errp))
        {
-              error_propagate(errp, err);
            return;
        }

@depends on rule1@
identifier err;
@@

-    Error *err = NULL;
      ... when != err


===
Script started by command
spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw

You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.

diffstat generated by my cocci script:
  50 files changed, 230 insertions(+), 725 deletions(-)

Difference with your patch, considering only files, touched by new script is very small:

[root@kvm error-smooth-my-try]# git diff --name-only | xargs git diff bbdd4596d3e3290 --
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 416adfcce0..cacfcbac54 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -185,6 +185,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
  {
      MachineState *ms = MACHINE(qdev_get_machine());
      const struct MemmapEntry *memmap = sifive_e_memmap;
+
      SiFiveESoCState *s = RISCV_E_SOC(dev);
      MemoryRegion *sys_mem = get_system_memory();
  
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 645b4080c5..32ff015c2c 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -442,13 +442,15 @@ static void init_event_facility(Object *obj)
  static void realize_event_facility(DeviceState *dev, Error **errp)
  {
      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
+    Error *local_err = NULL;
  
-    if (!qdev_realize(DEVICE(&event_facility->quiesce),
-                      BUS(&event_facility->sbus), errp)) {
+    if (!qdev_realize(DEVICE(&event_facility->quiesce), BUS(&event_facility->sbus), errp)) {
          return;
      }
-    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
-                      BUS(&event_facility->sbus), errp)) {
+    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
+                 BUS(&event_facility->sbus), &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
          qdev_unrealize(DEVICE(&event_facility->quiesce));
          return;
      }



- Hmm, strange, "--max-width 80" doesn't help. So, we may keep the patch fully-generated with only one over-80 line, or write in commit message that the only manual fix is one over-80 line wrapping in hw/s390x/event-facility.c


-- 
Best regards,
Vladimir


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

* Re: [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize()
  2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
  2020-06-24 23:54   ` David Gibson
@ 2020-06-25 19:09   ` Vladimir Sementsov-Ogievskiy
  2 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25 19:09 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, berrange, ehabkost, qemu-block, Mark Cave-Ayland,
	pbonzini, David Gibson

24.06.2020 19:43, Markus Armbruster wrote:
> macio_newworld_realize() effectively ignores ns->gpio realization
> errors, leaking the Error object.  Fortunately, macio_gpio_realize()
> can't actually fail.  Tidy up.
> 
> Cc: Mark Cave-Ayland<mark.cave-ayland@ilande.co.uk>
> Cc: David Gibson<david@gibson.dropbear.id.au>
> Signed-off-by: Markus Armbruster<armbru@redhat.com>


Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
  2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
@ 2020-06-25 19:12   ` Vladimir Sementsov-Ogievskiy
  2020-06-28  0:50   ` Gonglei (Arei)
  2 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-25 19:12 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, berrange, ehabkost, qemu-block,
	Michael S . Tsirkin, Gonglei (Arei),
	pbonzini

24.06.2020 19:43, Markus Armbruster wrote:
> virtio_crypto_pci_realize() continues after realization of its
> "virtio-crypto-device" fails.  Only an object_property_set_link()
> follows; looks harmless to me.  Tidy up anyway: return after failure,
> just like virtio_rng_pci_realize() does.
> 
> Cc: "Gonglei (Arei)"<arei.gonglei@huawei.com>
> Cc: Michael S. Tsirkin<mst@redhat.com>
> Signed-off-by: Markus Armbruster<armbru@redhat.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-26  6:19     ` Markus Armbruster
  2020-07-02 14:56       ` Markus Armbruster
  2020-07-03 10:41     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-26  6:19 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Please, also mention a command to run the script
>
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      identifier errp;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, errp, args2)) {
>> 	       ... when != err
>>      -	   error_propagate(errp, err);
>> 	       ...
>> 	   }
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, &err, args2)) {
>> 	       ...
>> 	   }
>>
>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>>
>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>> ---
>>   hw/arm/allwinner-a10.c          |  21 ++-----
>>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>>   hw/arm/armv7m.c                 |  12 +---
>>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>>   hw/arm/bcm2836.c                |  12 +---
>>   hw/arm/cubieboard.c             |   3 +-
>>   hw/arm/digic.c                  |  12 +---
>>   hw/arm/digic_boards.c           |   3 +-
>>   hw/arm/fsl-imx25.c              |  44 ++++----------
>>   hw/arm/fsl-imx31.c              |  32 +++-------
>>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>>   hw/arm/msf2-soc.c               |  21 ++-----
>>   hw/arm/nrf51_soc.c              |  24 ++------
>>   hw/arm/stm32f205_soc.c          |  29 +++------
>>   hw/arm/stm32f405_soc.c          |  32 +++-------
>>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>>   hw/block/fdc.c                  |   4 +-
>>   hw/block/xen-block.c            |   3 +-
>>   hw/char/serial-pci-multi.c      |   5 +-
>>   hw/char/serial-pci.c            |   5 +-
>>   hw/char/serial.c                |  10 +--
>>   hw/core/cpu.c                   |   3 +-
>>   hw/cpu/a15mpcore.c              |   5 +-
>>   hw/cpu/a9mpcore.c               |  21 ++-----
>>   hw/cpu/arm11mpcore.c            |  17 ++----
>>   hw/cpu/realview_mpcore.c        |   9 +--
>>   hw/display/virtio-gpu-pci.c     |   6 +-
>>   hw/display/virtio-vga.c         |   5 +-
>>   hw/intc/armv7m_nvic.c           |   9 +--
>>   hw/intc/pnv_xive.c              |   8 +--
>>   hw/intc/realview_gic.c          |   5 +-
>>   hw/intc/spapr_xive.c            |   8 +--
>>   hw/intc/xics.c                  |   5 +-
>>   hw/intc/xive.c                  |   3 +-
>>   hw/isa/piix4.c                  |   5 +-
>>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>>   hw/mips/cps.c                   |  17 ++----
>>   hw/misc/macio/cuda.c            |   5 +-
>>   hw/misc/macio/macio.c           |  25 ++------
>>   hw/misc/macio/pmu.c             |   5 +-
>>   hw/pci-host/pnv_phb3.c          |  13 +---
>>   hw/pci-host/pnv_phb4.c          |   5 +-
>>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>>   hw/ppc/e500.c                   |   5 +-
>>   hw/ppc/pnv.c                    |  53 ++++------------
>>   hw/ppc/pnv_core.c               |   4 +-
>>   hw/ppc/pnv_psi.c                |   9 +--
>>   hw/ppc/spapr_cpu_core.c         |   3 +-
>>   hw/ppc/spapr_irq.c              |   5 +-
>>   hw/riscv/opentitan.c            |   9 +--
>>   hw/riscv/sifive_e.c             |   6 +-
>>   hw/riscv/sifive_u.c             |   5 +-
>>   hw/s390x/event-facility.c       |  13 ++--
>>   hw/s390x/s390-pci-bus.c         |   3 +-
>>   hw/s390x/sclp.c                 |   3 +-
>>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>>   hw/scsi/scsi-bus.c              |   4 +-
>>   hw/sd/aspeed_sdhci.c            |   4 +-
>>   hw/sd/ssi-sd.c                  |   3 +-
>>   hw/usb/bus.c                    |   3 +-
>>   hw/virtio/virtio-rng-pci.c      |   5 +-
>>   qdev-monitor.c                  |   3 +-
>>  65 files changed, 248 insertions(+), 768 deletions(-)
>
> Almost all of this diff-stat may be generated by more obvious script:
>
> @rule1@
> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
> expression list args;
> typedef Error;
> Error *err;
> identifier errp;
> @@
>
> -      fun(args, &err);
> -      if (err)
> +      if (!fun(args, errp))
>        {
> -              error_propagate(errp, err);
>            return;
>        }
>
> @depends on rule1@
> identifier err;
> @@
>
> -    Error *err = NULL;
>      ... when != err
>
>
> ===
> Script started by command
> spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw
>
> You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.

I can try this idea.  It's not just this patch, though, it's four more:
PATCH 17+23+38+42.

> diffstat generated by my cocci script:
>  50 files changed, 230 insertions(+), 725 deletions(-)
>
> Difference with your patch, considering only files, touched by new script is very small:
>
> [root@kvm error-smooth-my-try]# git diff --name-only | xargs git diff bbdd4596d3e3290 --
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 416adfcce0..cacfcbac54 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -185,6 +185,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      const struct MemmapEntry *memmap = sifive_e_memmap;
> +
>      SiFiveESoCState *s = RISCV_E_SOC(dev);
>      MemoryRegion *sys_mem = get_system_memory();
>  diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
> index 645b4080c5..32ff015c2c 100644
> --- a/hw/s390x/event-facility.c
> +++ b/hw/s390x/event-facility.c
> @@ -442,13 +442,15 @@ static void init_event_facility(Object *obj)
>  static void realize_event_facility(DeviceState *dev, Error **errp)
>  {
>      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
> +    Error *local_err = NULL;
>  -    if (!qdev_realize(DEVICE(&event_facility->quiesce),
> -                      BUS(&event_facility->sbus), errp)) {
> +    if (!qdev_realize(DEVICE(&event_facility->quiesce), BUS(&event_facility->sbus), errp)) {
>          return;
>      }
> -    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> -                      BUS(&event_facility->sbus), errp)) {
> +    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> +                 BUS(&event_facility->sbus), &local_err);
> +    if (local_err) {
> +        error_propagate(errp, local_err);
>          qdev_unrealize(DEVICE(&event_facility->quiesce));
>          return;
>      }
>
>
>
> - Hmm, strange, "--max-width 80" doesn't help. So, we may keep the patch fully-generated with only one over-80 line, or write in commit message that the only manual fix is one over-80 line wrapping in hw/s390x/event-facility.c

In my experience, I need to correct Coccinelle's spacing more often than
not.  I usually don't bother to enumerate my corrections one by one, I
only document what kind of corrections I made.



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

* Re: [PATCH 06/46] error: Avoid error_propagate() when error is not used here
  2020-06-24 16:43 ` [PATCH 06/46] error: Avoid error_propagate() when error is not used here Markus Armbruster
  2020-06-24 18:17   ` Eric Blake
@ 2020-06-26 14:36   ` Vladimir Sementsov-Ogievskiy
  2020-06-27 11:57     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-26 14:36 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> When all we do with an Error we receive into a local variable is
> propagating to somewhere else, we can just as well receive it there
> right away.  Coccinelle script:
> 
>      @@
>      identifier fun, err, errp;
>      expression list args;
>      @@
>      -    fun(args, &err);
>      +    fun(args, errp);
>           ... when != err
>               when strict
>      -    error_propagate(errp, err);
> 
>      @@
>      identifier fun, err, errp;
>      expression list args;
>      expression ret;
>      @@
>      -    ret = fun(args, &err);
>      +    ret = fun(args, errp);
>           ... when != err
>               when strict
>      -    error_propagate(errp, err);
> 
>      @@
>      identifier fun, err, errp;
>      expression list args;
>      expression ret;
>      @@
>      -    ret = fun(args, &err);
>      +    ret = fun(args, errp);
>           ... when != err
>               when strict
>           if (
>      (
>               ret
>      |
>               !ret
>      |
>               ret == 0
>      |
>               ret != 0
>      |
>               ret < 0
>      |
>               ret != NULL
>      |
>               ret == NULL
>      )
>              )
>           {
>               ... when != err
>                   when strict
>      -        error_propagate(errp, err);
>               ...
>           }
> 
>      @@
>      identifier fun, err, errp;
>      expression list args;
>      @@
>           if (
>      (
>      -        fun(args, &err)
>      +        fun(args, errp)
>      |
>      -        !fun(args, &err)
>      +        !fun(args, errp)
>      |
>      -        fun(args, &err) == 0
>      +        fun(args, errp) == 0
>      |
>      -        fun(args, &err) != 0
>      +        fun(args, errp) != 0
>      |
>      -        fun(args, &err) < 0
>      +        fun(args, errp) < 0
>      |
>      -        fun(args, &err) == NULL
>      +        fun(args, errp) == NULL
>      |
>      -        fun(args, &err) != NULL
>      +        fun(args, errp) != NULL
>      )
>              )
>           {
>               ... when != err;
>                   when strict
>      -        error_propagate(errp, err);
>               ...
>           }
> 
> The first two rules are prone to fail with "error_propagate(...)
> ... reachable by inconsistent control-flow paths".  Script without
> them re-run where that happens.
> 
> Manually double-check @err is not used afterwards.  Dereferencing it
> would be use after free, but checking whether it's null would be
> legitimate.  One such change to qbus_realize() backed out.
> 
> Suboptimal line breaks tweaked manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

[..]

> diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
> index 8d6156578f..6705220380 100644
> --- a/hw/intc/xics_kvm.c
> +++ b/hw/intc/xics_kvm.c
> @@ -316,9 +316,8 @@ int ics_set_kvm_state(ICSState *ics, Error **errp)
>               continue;
>           }

local_err becomes unused in this function, we should drop it

with this fixed:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

>   
> -        ret = ics_set_kvm_state_one(ics, i, &local_err);
> +        ret = ics_set_kvm_state_one(ics, i, errp);
>           if (ret < 0) {
> -            error_propagate(errp, local_err);
>               return ret;
>           }
>       }

-- 
Best regards,
Vladimir


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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-24 16:43 ` [PATCH 07/46] error: Avoid more " Markus Armbruster
  2020-06-24 18:21   ` Eric Blake
@ 2020-06-26 17:21   ` Vladimir Sementsov-Ogievskiy
  2020-06-27 12:18     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-26 17:21 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> When all we do with an Error we receive into a local variable is
> propagating to somewhere else, we can just as well receive it there
> right away.  The previous commit did that for simple cases with
> Coccinelle.  Do it for a few more manually.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   blockdev.c     |  5 +----
>   hw/core/numa.c | 44 ++++++++++++++------------------------------
>   qdev-monitor.c | 11 ++++-------
>   3 files changed, 19 insertions(+), 41 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index b66863c42a..73736a4eaf 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
>       }
>   
>       /* Actual block device init: Functionality shared with blockdev-add */
> -    blk = blockdev_init(filename, bs_opts, &local_err);
> +    blk = blockdev_init(filename, bs_opts, errp);
>       bs_opts = NULL;
>       if (!blk) {
> -        error_propagate(errp, local_err);
>           goto fail;
> -    } else {
> -        assert(!local_err);
>       }
>   
>       /* Create legacy DriveInfo */
> diff --git a/hw/core/numa.c b/hw/core/numa.c
> index 5f81900f88..aa8c6be210 100644
> --- a/hw/core/numa.c
> +++ b/hw/core/numa.c
> @@ -449,40 +449,33 @@ void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
>   
>   void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
>   {
> -    Error *err = NULL;
> -
>       if (!ms->numa_state) {
>           error_setg(errp, "NUMA is not supported by this machine-type");
> -        goto end;
> +        return;
>       }
>   
>       switch (object->type) {
>       case NUMA_OPTIONS_TYPE_NODE:
> -        parse_numa_node(ms, &object->u.node, &err);
> -        if (err) {
> -            goto end;
> -        }
> +        parse_numa_node(ms, &object->u.node, errp);
>           break;

Could we use return here and and for other "break" operators here, to stress, that we
are not going to do something more in case of failure (as well as in case of
success)? To prevent the future addition of some code after the switch without
handling the error carefully here.

>       case NUMA_OPTIONS_TYPE_DIST:
> -        parse_numa_distance(ms, &object->u.dist, &err);
> -        if (err) {
> -            goto end;
> -        }
> +        parse_numa_distance(ms, &object->u.dist, errp);
>           break;
>       case NUMA_OPTIONS_TYPE_CPU:
>           if (!object->u.cpu.has_node_id) {
> -            error_setg(&err, "Missing mandatory node-id property");
> -            goto end;
> +            error_setg(errp, "Missing mandatory node-id property");
> +            return;
>           }
>           if (!ms->numa_state->nodes[object->u.cpu.node_id].present) {
> -            error_setg(&err, "Invalid node-id=%" PRId64 ", NUMA node must be "
> -                "defined with -numa node,nodeid=ID before it's used with "
> -                "-numa cpu,node-id=ID", object->u.cpu.node_id);
> -            goto end;
> +            error_setg(errp, "Invalid node-id=%" PRId64 ", NUMA node must be "
> +                       "defined with -numa node,nodeid=ID before it's used with "
> +                       "-numa cpu,node-id=ID", object->u.cpu.node_id);
> +            return;
>           }
>   
> -        machine_set_cpu_numa_node(ms, qapi_NumaCpuOptions_base(&object->u.cpu),
> -                                  &err);
> +        machine_set_cpu_numa_node(ms,
> +                                  qapi_NumaCpuOptions_base(&object->u.cpu),
> +                                  errp);
>           break;
>       case NUMA_OPTIONS_TYPE_HMAT_LB:
>           if (!ms->numa_state->hmat_enabled) {
> @@ -492,10 +485,7 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
>               return;
>           }
>   
> -        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, &err);
> -        if (err) {
> -            goto end;
> -        }
> +        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, errp);
>           break;
>       case NUMA_OPTIONS_TYPE_HMAT_CACHE:
>           if (!ms->numa_state->hmat_enabled) {
> @@ -505,17 +495,11 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
>               return;
>           }
>   
> -        parse_numa_hmat_cache(ms, &object->u.hmat_cache, &err);
> -        if (err) {
> -            goto end;
> -        }
> +        parse_numa_hmat_cache(ms, &object->u.hmat_cache, errp);
>           break;
>       default:
>           abort();
>       }
> -
> -end:
> -    error_propagate(errp, err);
>   }
>   
>   static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index e38030429b..40c34bb9cf 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -600,7 +600,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>       const char *driver, *path;
>       DeviceState *dev = NULL;
>       BusState *bus = NULL;
> -    Error *err = NULL;
>       bool hide;
>   
>       driver = qemu_opt_get(opts, "driver");
> @@ -655,15 +654,14 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>       dev = qdev_new(driver);
>   
>       /* Check whether the hotplug is allowed by the machine */
> -    if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
> +    if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
>           /* Error must be set in the machine hook */
> -        assert(err);
>           goto err_del_dev;
>       }
>   
>       if (!bus && qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) {
>           /* No bus, no machine hotplug handler --> device is not hotpluggable */
> -        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
> +        error_setg(errp, "Device '%s' can not be hotplugged on this machine",
>                      driver);
>           goto err_del_dev;
>       }
> @@ -671,19 +669,18 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>       qdev_set_id(dev, qemu_opts_id(opts));
>   
>       /* set properties */
> -    if (qemu_opt_foreach(opts, set_property, dev, &err)) {
> +    if (qemu_opt_foreach(opts, set_property, dev, errp)) {

Here is an example, what I was afraid, when we discussed introducing a lot more
bool functions (true is success).

Here are two functions with different semantics, and it looks a bit weird,
one if (func()) and one if (!func()). Still "goto err" makes it obvious
that it's all about error checking.

I don't remember, did we considered a convention to avoid if (func()) to check
errors, and use instead if (func() < 0) for such case? So here, update it to be

if (qemu_opt_foreach(opts, set_property, dev, errp) < 0)


(I don't insist to do it exactly in this patch, as its aim is another, I just
  want to remind about this problem)

>           goto err_del_dev;
>       }
>   
>       dev->opts = opts;
> -    if (!qdev_realize(DEVICE(dev), bus, &err)) {
> +    if (!qdev_realize(DEVICE(dev), bus, errp)) {
>           dev->opts = NULL;
>           goto err_del_dev;
>       }
>       return dev;
>   
>   err_del_dev:
> -    error_propagate(errp, err);
>       if (dev) {
>           object_unparent(OBJECT(dev));
>           object_unref(OBJECT(dev));
> 


Also, suggest a squash-in, I've noted during previous patch review:

diff --git a/backends/cryptodev-vhost-user.c b/backends/cryptodev-vhost-user.c
index dbe5a8aae6..3cdc406b0d 100644
--- a/backends/cryptodev-vhost-user.c
+++ b/backends/cryptodev-vhost-user.c
@@ -184,15 +184,13 @@ static void cryptodev_vhost_user_init(
  {
      int queues = backend->conf.peers.queues;
      size_t i;
-    Error *local_err = NULL;
      Chardev *chr;
      CryptoDevBackendClient *cc;
      CryptoDevBackendVhostUser *s =
                        CRYPTODEV_BACKEND_VHOST_USER(backend);
  
-    chr = cryptodev_vhost_claim_chardev(s, &local_err);
-    if (local_err) {
-        error_propagate(errp, local_err);
+    chr = cryptodev_vhost_claim_chardev(s, errp);
+    if (!chr) {
          return;
      }
  



-- 
Best regards,
Vladimir


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

* Re: [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg()
  2020-06-24 16:43 ` [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
  2020-06-24 18:32   ` Eric Blake
@ 2020-06-26 18:22   ` Vladimir Sementsov-Ogievskiy
  2020-06-27 11:56     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-26 18:22 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> Replace
> 
>      error_setg(&err, ...);
>      error_propagate(errp, err);
> 
> by
> 
>      error_setg(errp, ...);
> 
> Related pattern:
> 
>      if (...) {
>          error_setg(&err, ...);
>          goto out;
>      }
>      ...
>   out:
>      error_propagate(errp, err);
>      return;
> 
> When all paths to label out are that way, replace by
> 
>      if (...) {
>          error_setg(errp, ...);
>          return;
>      }
> 
> and delete the label along with the error_propagate().
> 
> When we have at most one other path that actually needs to propagate,
> and maybe one at the end that where propagation is unnecessary, e.g.
> 
>      foo(..., &err);
>      if (err) {
>          goto out;
>      }
>      ...
>      bar(..., &err);
>   out:
>      error_propagate(errp, err);
>      return;
> 
> move the error_propagate() to where it's needed, like
> 
>      if (...) {
>          foo(..., &err);
>          error_propagate(errp, err);
>          return;
>      }
>      ...
>      bar(..., errp);
>      return;
> 
> and transform the error_setg() as above.
> 
> Bonus: the elimination of gotos will make later patches in this series
> easier to review.
> 
> Candidates for conversion tracked down with this Coccinelle script:
> 
>      @@
>      identifier err, errp;
>      expression list args;
>      @@
>      -    error_setg(&err, args);
>      +    error_setg(errp, args);
> 	 ... when != err
> 	 error_propagate(errp, err);
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   backends/cryptodev.c        | 11 +++---
>   backends/hostmem-file.c     | 19 +++-------
>   backends/hostmem-memfd.c    | 15 ++++----
>   backends/hostmem.c          | 27 ++++++--------
>   block/throttle-groups.c     | 22 +++++------
>   hw/hyperv/vmbus.c           |  5 +--
>   hw/i386/pc.c                | 35 ++++++------------
>   hw/mem/nvdimm.c             | 17 ++++-----
>   hw/mem/pc-dimm.c            | 14 +++----
>   hw/misc/aspeed_sdmc.c       |  3 +-
>   hw/ppc/rs6000_mc.c          |  9 ++---
>   hw/ppc/spapr.c              | 73 ++++++++++++++++---------------------
>   hw/ppc/spapr_pci.c          | 14 +++----
>   hw/s390x/ipl.c              | 23 +++++-------
>   hw/s390x/sclp.c             | 12 ++----
>   hw/xen/xen_pt_config_init.c |  3 +-
>   iothread.c                  | 12 +++---
>   net/colo-compare.c          | 20 ++++------
>   net/dump.c                  | 10 ++---
>   net/filter-buffer.c         | 10 ++---
>   qga/commands-win32.c        | 16 +++-----
>   21 files changed, 151 insertions(+), 219 deletions(-)
> 

[..]

> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -282,9 +282,8 @@ static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,

You forget to remove unused local_err variable

>   
>       HANDLE thread = CreateThread(NULL, 0, func, opaque, 0, NULL);
>       if (!thread) {
> -        error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
> +        error_setg(errp, QERR_QGA_COMMAND_FAILED,
>                      "failed to dispatch asynchronous command");
> -        error_propagate(errp, local_err);
>       }
>   }
>   
> @@ -1274,31 +1273,28 @@ static void check_suspend_mode(GuestSuspendMode mode, Error **errp)

and here (I assume, you remove unused variables with help of compiler, but don't compile for win32 :)


with these two local_err removed:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>


Ohh, my brain is broken, I'd prefer to create such patches than to review them :)

>   
>       ZeroMemory(&sys_pwr_caps, sizeof(sys_pwr_caps));
>       if (!GetPwrCapabilities(&sys_pwr_caps)) {
> -        error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
> +        error_setg(errp, QERR_QGA_COMMAND_FAILED,
>                      "failed to determine guest suspend capabilities");
> -        goto out;
> +        return;
>       }
>   
>       switch (mode) {
>       case GUEST_SUSPEND_MODE_DISK:
>           if (!sys_pwr_caps.SystemS4) {
> -            error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
> +            error_setg(errp, QERR_QGA_COMMAND_FAILED,
>                          "suspend-to-disk not supported by OS");
>           }
>           break;
>       case GUEST_SUSPEND_MODE_RAM:
>           if (!sys_pwr_caps.SystemS3) {
> -            error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
> +            error_setg(errp, QERR_QGA_COMMAND_FAILED,
>                          "suspend-to-ram not supported by OS");
>           }
>           break;
>       default:
> -        error_setg(&local_err, QERR_INVALID_PARAMETER_VALUE, "mode",
> +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "mode",
>                      "GuestSuspendMode");
>       }
> -
> -out:
> -    error_propagate(errp, local_err);
>   }
>   
>   static DWORD WINAPI do_suspend(LPVOID opaque)
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg()
  2020-06-26 18:22   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-27 11:56     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-27 11:56 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Replace
>>
>>      error_setg(&err, ...);
>>      error_propagate(errp, err);
>>
>> by
>>
>>      error_setg(errp, ...);
>>
>> Related pattern:
>>
>>      if (...) {
>>          error_setg(&err, ...);
>>          goto out;
>>      }
>>      ...
>>   out:
>>      error_propagate(errp, err);
>>      return;
>>
>> When all paths to label out are that way, replace by
>>
>>      if (...) {
>>          error_setg(errp, ...);
>>          return;
>>      }
>>
>> and delete the label along with the error_propagate().
>>
>> When we have at most one other path that actually needs to propagate,
>> and maybe one at the end that where propagation is unnecessary, e.g.
>>
>>      foo(..., &err);
>>      if (err) {
>>          goto out;
>>      }
>>      ...
>>      bar(..., &err);
>>   out:
>>      error_propagate(errp, err);
>>      return;
>>
>> move the error_propagate() to where it's needed, like
>>
>>      if (...) {
>>          foo(..., &err);
>>          error_propagate(errp, err);
>>          return;
>>      }
>>      ...
>>      bar(..., errp);
>>      return;
>>
>> and transform the error_setg() as above.
>>
>> Bonus: the elimination of gotos will make later patches in this series
>> easier to review.
>>
>> Candidates for conversion tracked down with this Coccinelle script:
>>
>>      @@
>>      identifier err, errp;
>>      expression list args;
>>      @@
>>      -    error_setg(&err, args);
>>      +    error_setg(errp, args);
>> 	 ... when != err
>> 	 error_propagate(errp, err);
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   backends/cryptodev.c        | 11 +++---
>>   backends/hostmem-file.c     | 19 +++-------
>>   backends/hostmem-memfd.c    | 15 ++++----
>>   backends/hostmem.c          | 27 ++++++--------
>>   block/throttle-groups.c     | 22 +++++------
>>   hw/hyperv/vmbus.c           |  5 +--
>>   hw/i386/pc.c                | 35 ++++++------------
>>   hw/mem/nvdimm.c             | 17 ++++-----
>>   hw/mem/pc-dimm.c            | 14 +++----
>>   hw/misc/aspeed_sdmc.c       |  3 +-
>>   hw/ppc/rs6000_mc.c          |  9 ++---
>>   hw/ppc/spapr.c              | 73 ++++++++++++++++---------------------
>>   hw/ppc/spapr_pci.c          | 14 +++----
>>   hw/s390x/ipl.c              | 23 +++++-------
>>   hw/s390x/sclp.c             | 12 ++----
>>   hw/xen/xen_pt_config_init.c |  3 +-
>>   iothread.c                  | 12 +++---
>>   net/colo-compare.c          | 20 ++++------
>>   net/dump.c                  | 10 ++---
>>   net/filter-buffer.c         | 10 ++---
>>   qga/commands-win32.c        | 16 +++-----
>>   21 files changed, 151 insertions(+), 219 deletions(-)
>>
>
> [..]
>
>> --- a/qga/commands-win32.c
>> +++ b/qga/commands-win32.c
>> @@ -282,9 +282,8 @@ static void execute_async(DWORD WINAPI (*func)(LPVOID), LPVOID opaque,
>
> You forget to remove unused local_err variable

In my haste to get this series out for review, I took undadvisable
shortcuts on Error * variable cleanup.  Need to do better for v2.

>>         HANDLE thread = CreateThread(NULL, 0, func, opaque, 0,
>> NULL);
>>       if (!thread) {
>> -        error_setg(&local_err, QERR_QGA_COMMAND_FAILED,
>> +        error_setg(errp, QERR_QGA_COMMAND_FAILED,
>>                      "failed to dispatch asynchronous command");
>> -        error_propagate(errp, local_err);
>>       }
>>   }
>>   @@ -1274,31 +1273,28 @@ static void
>> check_suspend_mode(GuestSuspendMode mode, Error **errp)
>
> and here (I assume, you remove unused variables with help of compiler, but don't compile for win32 :)
>
>
> with these two local_err removed:
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Thanks!

> Ohh, my brain is broken, I'd prefer to create such patches than to review them :)

Rrrrrevenge!  ;)

[...]



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

* Re: [PATCH 06/46] error: Avoid error_propagate() when error is not used here
  2020-06-26 14:36   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-27 11:57     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-06-27 11:57 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> When all we do with an Error we receive into a local variable is
>> propagating to somewhere else, we can just as well receive it there
>> right away.  Coccinelle script:
>>
>>      @@
>>      identifier fun, err, errp;
>>      expression list args;
>>      @@
>>      -    fun(args, &err);
>>      +    fun(args, errp);
>>           ... when != err
>>               when strict
>>      -    error_propagate(errp, err);
>>
>>      @@
>>      identifier fun, err, errp;
>>      expression list args;
>>      expression ret;
>>      @@
>>      -    ret = fun(args, &err);
>>      +    ret = fun(args, errp);
>>           ... when != err
>>               when strict
>>      -    error_propagate(errp, err);
>>
>>      @@
>>      identifier fun, err, errp;
>>      expression list args;
>>      expression ret;
>>      @@
>>      -    ret = fun(args, &err);
>>      +    ret = fun(args, errp);
>>           ... when != err
>>               when strict
>>           if (
>>      (
>>               ret
>>      |
>>               !ret
>>      |
>>               ret == 0
>>      |
>>               ret != 0
>>      |
>>               ret < 0
>>      |
>>               ret != NULL
>>      |
>>               ret == NULL
>>      )
>>              )
>>           {
>>               ... when != err
>>                   when strict
>>      -        error_propagate(errp, err);
>>               ...
>>           }
>>
>>      @@
>>      identifier fun, err, errp;
>>      expression list args;
>>      @@
>>           if (
>>      (
>>      -        fun(args, &err)
>>      +        fun(args, errp)
>>      |
>>      -        !fun(args, &err)
>>      +        !fun(args, errp)
>>      |
>>      -        fun(args, &err) == 0
>>      +        fun(args, errp) == 0
>>      |
>>      -        fun(args, &err) != 0
>>      +        fun(args, errp) != 0
>>      |
>>      -        fun(args, &err) < 0
>>      +        fun(args, errp) < 0
>>      |
>>      -        fun(args, &err) == NULL
>>      +        fun(args, errp) == NULL
>>      |
>>      -        fun(args, &err) != NULL
>>      +        fun(args, errp) != NULL
>>      )
>>              )
>>           {
>>               ... when != err;
>>                   when strict
>>      -        error_propagate(errp, err);
>>               ...
>>           }
>>
>> The first two rules are prone to fail with "error_propagate(...)
>> ... reachable by inconsistent control-flow paths".  Script without
>> them re-run where that happens.
>>
>> Manually double-check @err is not used afterwards.  Dereferencing it
>> would be use after free, but checking whether it's null would be
>> legitimate.  One such change to qbus_realize() backed out.
>>
>> Suboptimal line breaks tweaked manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>
> [..]
>
>> diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
>> index 8d6156578f..6705220380 100644
>> --- a/hw/intc/xics_kvm.c
>> +++ b/hw/intc/xics_kvm.c
>> @@ -316,9 +316,8 @@ int ics_set_kvm_state(ICSState *ics, Error **errp)
>>               continue;
>>           }
>
> local_err becomes unused in this function, we should drop it

Will fix.

> with this fixed:
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Thanks!

>
>>   -        ret = ics_set_kvm_state_one(ics, i, &local_err);
>> +        ret = ics_set_kvm_state_one(ics, i, errp);
>>           if (ret < 0) {
>> -            error_propagate(errp, local_err);
>>               return ret;
>>           }
>>       }



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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-26 17:21   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-27 12:18     ` Markus Armbruster
  2020-07-02 12:54       ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-06-27 12:18 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> When all we do with an Error we receive into a local variable is
>> propagating to somewhere else, we can just as well receive it there
>> right away.  The previous commit did that for simple cases with
>> Coccinelle.  Do it for a few more manually.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   blockdev.c     |  5 +----
>>   hw/core/numa.c | 44 ++++++++++++++------------------------------
>>   qdev-monitor.c | 11 ++++-------
>>   3 files changed, 19 insertions(+), 41 deletions(-)
>>
>> diff --git a/blockdev.c b/blockdev.c
>> index b66863c42a..73736a4eaf 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
>>       }
>>         /* Actual block device init: Functionality shared with
>> blockdev-add */
>> -    blk = blockdev_init(filename, bs_opts, &local_err);
>> +    blk = blockdev_init(filename, bs_opts, errp);
>>       bs_opts = NULL;
>>       if (!blk) {
>> -        error_propagate(errp, local_err);
>>           goto fail;
>> -    } else {
>> -        assert(!local_err);
>>       }
>>         /* Create legacy DriveInfo */
>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>> index 5f81900f88..aa8c6be210 100644
>> --- a/hw/core/numa.c
>> +++ b/hw/core/numa.c
>> @@ -449,40 +449,33 @@ void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
>>     void set_numa_options(MachineState *ms, NumaOptions *object,
>> Error **errp)
>>   {
>> -    Error *err = NULL;
>> -
>>       if (!ms->numa_state) {
>>           error_setg(errp, "NUMA is not supported by this machine-type");
>> -        goto end;
>> +        return;
>>       }
>>         switch (object->type) {
>>       case NUMA_OPTIONS_TYPE_NODE:
>> -        parse_numa_node(ms, &object->u.node, &err);
>> -        if (err) {
>> -            goto end;
>> -        }
>> +        parse_numa_node(ms, &object->u.node, errp);
>>           break;
>
> Could we use return here and and for other "break" operators here, to stress, that we
> are not going to do something more in case of failure (as well as in case of
> success)? To prevent the future addition of some code after the switch without
> handling the error carefully here.

Can do.

>>       case NUMA_OPTIONS_TYPE_DIST:
>> -        parse_numa_distance(ms, &object->u.dist, &err);
>> -        if (err) {
>> -            goto end;
>> -        }
>> +        parse_numa_distance(ms, &object->u.dist, errp);
>>           break;
>>       case NUMA_OPTIONS_TYPE_CPU:
>>           if (!object->u.cpu.has_node_id) {
>> -            error_setg(&err, "Missing mandatory node-id property");
>> -            goto end;
>> +            error_setg(errp, "Missing mandatory node-id property");
>> +            return;
>>           }
>>           if (!ms->numa_state->nodes[object->u.cpu.node_id].present) {
>> -            error_setg(&err, "Invalid node-id=%" PRId64 ", NUMA node must be "
>> -                "defined with -numa node,nodeid=ID before it's used with "
>> -                "-numa cpu,node-id=ID", object->u.cpu.node_id);
>> -            goto end;
>> +            error_setg(errp, "Invalid node-id=%" PRId64 ", NUMA node must be "
>> +                       "defined with -numa node,nodeid=ID before it's used with "
>> +                       "-numa cpu,node-id=ID", object->u.cpu.node_id);
>> +            return;
>>           }
>>   -        machine_set_cpu_numa_node(ms,
>> qapi_NumaCpuOptions_base(&object->u.cpu),
>> -                                  &err);
>> +        machine_set_cpu_numa_node(ms,
>> +                                  qapi_NumaCpuOptions_base(&object->u.cpu),
>> +                                  errp);
>>           break;
>>       case NUMA_OPTIONS_TYPE_HMAT_LB:
>>           if (!ms->numa_state->hmat_enabled) {
>> @@ -492,10 +485,7 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
>>               return;
>>           }
>>   -        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb,
>> &err);
>> -        if (err) {
>> -            goto end;
>> -        }
>> +        parse_numa_hmat_lb(ms->numa_state, &object->u.hmat_lb, errp);
>>           break;
>>       case NUMA_OPTIONS_TYPE_HMAT_CACHE:
>>           if (!ms->numa_state->hmat_enabled) {
>> @@ -505,17 +495,11 @@ void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp)
>>               return;
>>           }
>>   -        parse_numa_hmat_cache(ms, &object->u.hmat_cache, &err);
>> -        if (err) {
>> -            goto end;
>> -        }
>> +        parse_numa_hmat_cache(ms, &object->u.hmat_cache, errp);
>>           break;
>>       default:
>>           abort();
>>       }
>> -
>> -end:
>> -    error_propagate(errp, err);
>>   }
>>     static int parse_numa(void *opaque, QemuOpts *opts, Error
>> **errp)
>> diff --git a/qdev-monitor.c b/qdev-monitor.c
>> index e38030429b..40c34bb9cf 100644
>> --- a/qdev-monitor.c
>> +++ b/qdev-monitor.c
>> @@ -600,7 +600,6 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>>       const char *driver, *path;
>>       DeviceState *dev = NULL;
>>       BusState *bus = NULL;
>> -    Error *err = NULL;
>>       bool hide;
>>         driver = qemu_opt_get(opts, "driver");
>> @@ -655,15 +654,14 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>>       dev = qdev_new(driver);
>>         /* Check whether the hotplug is allowed by the machine */
>> -    if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
>> +    if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
>>           /* Error must be set in the machine hook */
>> -        assert(err);
>>           goto err_del_dev;
>>       }
>>         if (!bus && qdev_hotplug &&
>> !qdev_get_machine_hotplug_handler(dev)) {
>>           /* No bus, no machine hotplug handler --> device is not hotpluggable */
>> -        error_setg(&err, "Device '%s' can not be hotplugged on this machine",
>> +        error_setg(errp, "Device '%s' can not be hotplugged on this machine",
>>                      driver);
>>           goto err_del_dev;
>>       }
>> @@ -671,19 +669,18 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>>       qdev_set_id(dev, qemu_opts_id(opts));
>>         /* set properties */
>> -    if (qemu_opt_foreach(opts, set_property, dev, &err)) {
>> +    if (qemu_opt_foreach(opts, set_property, dev, errp)) {
>
> Here is an example, what I was afraid, when we discussed introducing a lot more
> bool functions (true is success).
>
> Here are two functions with different semantics, and it looks a bit weird,
> one if (func()) and one if (!func()). Still "goto err" makes it obvious
> that it's all about error checking.
>
> I don't remember, did we considered a convention to avoid if (func()) to check
> errors, and use instead if (func() < 0) for such case? So here, update it to be
>
> if (qemu_opt_foreach(opts, set_property, dev, errp) < 0)

qemu_opt_foreach()'s contract:

  /**
   * For each member of @opts, call @func(@opaque, name, value, @errp).
   * @func() may store an Error through @errp, but must return non-zero then.
   * When @func() returns non-zero, break the loop and return that value.
   * Return zero when the loop completes.
   */

Thus, < 0 would be wrong.

Contracts can be changed, of course.  We can make qemu_opt_foreach()
return true on success, and false on failure.  Confusing unless we
change the callback's contract as well, and that requires updating all
the callbacks.  Feasible, just work.

> (I don't insist to do it exactly in this patch, as its aim is another, I just
>  want to remind about this problem)

Appreciated.

>>           goto err_del_dev;
>>       }
>>         dev->opts = opts;
>> -    if (!qdev_realize(DEVICE(dev), bus, &err)) {
>> +    if (!qdev_realize(DEVICE(dev), bus, errp)) {
>>           dev->opts = NULL;
>>           goto err_del_dev;
>>       }
>>       return dev;
>>     err_del_dev:
>> -    error_propagate(errp, err);
>>       if (dev) {
>>           object_unparent(OBJECT(dev));
>>           object_unref(OBJECT(dev));
>>
>
>
> Also, suggest a squash-in, I've noted during previous patch review:
>
> diff --git a/backends/cryptodev-vhost-user.c b/backends/cryptodev-vhost-user.c
> index dbe5a8aae6..3cdc406b0d 100644
> --- a/backends/cryptodev-vhost-user.c
> +++ b/backends/cryptodev-vhost-user.c
> @@ -184,15 +184,13 @@ static void cryptodev_vhost_user_init(
>  {
>      int queues = backend->conf.peers.queues;
>      size_t i;
> -    Error *local_err = NULL;
>      Chardev *chr;
>      CryptoDevBackendClient *cc;
>      CryptoDevBackendVhostUser *s =
>                        CRYPTODEV_BACKEND_VHOST_USER(backend);
>  -    chr = cryptodev_vhost_claim_chardev(s, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    chr = cryptodev_vhost_claim_chardev(s, errp);
> +    if (!chr) {
>          return;
>      }

I like this change, but I'd rather not squash it into this patch,
because this patch is about doing exactly the things the previous patch
does with Coccinelle for cases where the Coccinelle script doesn't
match.

In particular, the patch does not switch from "use @local_err to check
for failure" to "use return value to check for failure".

The closest match is probably "[PATCH 10/46] qemu-option: Check return
value instead of @err where convenient", but that one's strictly about
qemu-options.

Perhaps a future series could transform more calls of functions that
return non-null on succes, null on failure.  How can we identify them?
False negatives would be tolerable, false positives absolutely not.



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

* RE: [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
  2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
  2020-06-24 21:52   ` Eric Blake
  2020-06-25 19:12   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-28  0:50   ` Gonglei (Arei)
  2 siblings, 0 replies; 157+ messages in thread
From: Gonglei (Arei) @ 2020-06-28  0:50 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	Michael S . Tsirkin, pbonzini


> -----Original Message-----
> From: Markus Armbruster [mailto:armbru@redhat.com]
> Sent: Thursday, June 25, 2020 12:43 AM
> To: qemu-devel@nongnu.org
> Cc: pbonzini@redhat.com; berrange@redhat.com; ehabkost@redhat.com;
> qemu-block@nongnu.org; peter.maydell@linaro.org;
> vsementsov@virtuozzo.com; Gonglei (Arei) <arei.gonglei@huawei.com>;
> Michael S . Tsirkin <mst@redhat.com>
> Subject: [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize()
> 
> virtio_crypto_pci_realize() continues after realization of its "virtio-crypto-device"
> fails.  Only an object_property_set_link() follows; looks harmless to me.  Tidy
> up anyway: return after failure, just like virtio_rng_pci_realize() does.
> 
> Cc: "Gonglei (Arei)" <arei.gonglei@huawei.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/virtio/virtio-crypto-pci.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 

Reviewed-by: Gonglei < arei.gonglei@huawei.com>

> diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c index
> 72be531c95..0755722288 100644
> --- a/hw/virtio/virtio-crypto-pci.c
> +++ b/hw/virtio/virtio-crypto-pci.c
> @@ -54,7 +54,9 @@ static void virtio_crypto_pci_realize(VirtIOPCIProxy
> *vpci_dev, Error **errp)
>      }
> 
>      virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
> +        return;
> +    }
>      object_property_set_link(OBJECT(vcrypto),
>                   OBJECT(vcrypto->vdev.conf.cryptodev), "cryptodev",
>                   NULL);
> --
> 2.26.2



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

* Re: [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker()
  2020-06-24 16:43 ` [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker() Markus Armbruster
  2020-06-24 19:34   ` Eric Blake
@ 2020-06-29  8:29   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  8:29 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> When migrate_add_blocker(blocker, &errp) is followed by
> error_propagate(errp, err), we can often just as well do
> migrate_add_blocker(..., errp).
> 
> Do that with this Coccinelle script:
> 
>      @@
>      expression blocker, err, errp;
>      expression ret;
>      @@
>      -    ret = migrate_add_blocker(blocker, &err);
>      -    if (err) {
>      +    ret = migrate_add_blocker(blocker, errp);
>      +    if (ret < 0) {
> 	     ... when != err;
>      -        error_propagate(errp, err);
> 	     ...
> 	 }
> 
>      @@
>      expression blocker, err, errp;
>      @@
>      -    migrate_add_blocker(blocker, &err);
>      -    if (err) {
>      +    if (migrate_add_blocker(blocker, errp) < 0) {
> 	     ... when != err;
>      -        error_propagate(errp, err);
> 	     ...
> 	 }
> 
> Double-check @err is not used afterwards.  Dereferencing it would be
> use after free, but checking whether it's null would be legitimate.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block/parallels.c            | 5 ++---
>   block/qcow.c                 | 6 ++----
>   block/vdi.c                  | 6 ++----
>   block/vhdx.c                 | 5 ++---
>   block/vmdk.c                 | 6 ++----
>   block/vpc.c                  | 5 ++---
>   block/vvfat.c                | 5 ++---
>   hw/display/virtio-gpu-base.c | 5 +----
>   hw/intc/arm_gic_kvm.c        | 4 +---
>   hw/intc/arm_gicv3_its_kvm.c  | 4 +---
>   hw/intc/arm_gicv3_kvm.c      | 4 +---
>   hw/misc/ivshmem.c            | 4 +---
>   hw/scsi/vhost-scsi.c         | 4 +---
>   13 files changed, 20 insertions(+), 43 deletions(-)
> 

[..]

> diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
> index ad0ebabc87..87bc4aeca1 100644
> --- a/hw/intc/arm_gicv3_its_kvm.c
> +++ b/hw/intc/arm_gicv3_its_kvm.c
> @@ -113,9 +113,7 @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)

Remove unused local_err

with fixed:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

>           GITS_CTLR)) {
>           error_setg(&s->migration_blocker, "This operating system kernel "
>                      "does not support vITS migration");
> -        migrate_add_blocker(s->migration_blocker, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (migrate_add_blocker(s->migration_blocker, errp) < 0) {
>               error_free(s->migration_blocker);
>               return;
>           }

[..]


-- 
Best regards,
Vladimir


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

* Re: [PATCH 10/46] qemu-option: Check return value instead of @err where convenient
  2020-06-24 16:43 ` [PATCH 10/46] qemu-option: Check return value instead of @err where convenient Markus Armbruster
  2020-06-24 19:36   ` Eric Blake
@ 2020-06-29  9:11   ` Vladimir Sementsov-Ogievskiy
  2020-07-01  8:02     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  9:11 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> Convert uses like
> 
>      opts = qemu_opts_create(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      opts = qemu_opts_create(..., &err);
>      if (!opts) {
>          ...
>      }
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   block/parallels.c  |  4 ++--
>   blockdev.c         |  5 ++---
>   qdev-monitor.c     |  6 ++----
>   util/qemu-config.c | 10 ++++------
>   util/qemu-option.c | 12 ++++--------
>   5 files changed, 14 insertions(+), 23 deletions(-)
> 
> diff --git a/block/parallels.c b/block/parallels.c
> index 860dbb80a2..b15c9ac28d 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -823,8 +823,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
>           }
>       }
>   
> -    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, &local_err);
> -    if (local_err != NULL) {
> +    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
> +    if (!opts) {
>           goto fail_options;
>       }

Honestly, I don't like this hunk. as already complicated code (crossing gotos) becomes more
complicated (add one more pattern to fail_options path: no-op error_propagate).

At least, we'll need a follow-up patch, refactoring parallels_open() to drop "fail_options"
label completely.

Still, it should work and the rest is fine, so:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
  2020-06-24 19:37   ` Eric Blake
@ 2020-06-29  9:25   ` Vladimir Sementsov-Ogievskiy
  2020-06-29  9:36   ` Vladimir Sementsov-Ogievskiy
  2 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  9:25 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> This is to make the next commit easier to review.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
  2020-06-24 19:37   ` Eric Blake
  2020-06-29  9:25   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-29  9:36   ` Vladimir Sementsov-Ogievskiy
  2020-06-29  9:47     ` Vladimir Sementsov-Ogievskiy
  2 siblings, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  9:36 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> This is to make the next commit easier to review.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 32 ++++++++++++++++++--------------
>   1 file changed, 18 insertions(+), 14 deletions(-)
> 
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index 6119f971a4..9941005c91 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -270,6 +270,7 @@ static void qemu_opt_del_all(QemuOpts *opts, const char *name)
>   const char *qemu_opt_get(QemuOpts *opts, const char *name)
>   {
>       QemuOpt *opt;
> +    const QemuOptDesc *desc;
>   
Honestly, I don't see how this hunk helps with the following patch, which is simple anyway.
Keeping desc variable scope smaller seems better for me, as well as further scope of
def_val. (Still, keep my r-b if you don't want to change it).

-- 
Best regards,
Vladimir


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

* Re: [PATCH 12/46] qemu-option: Factor out helper find_default_by_name()
  2020-06-24 16:43 ` [PATCH 12/46] qemu-option: Factor out helper find_default_by_name() Markus Armbruster
  2020-06-24 19:38   ` Eric Blake
@ 2020-06-29  9:46   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  9:46 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> Signed-off-by: Markus Armbruster<armbru@redhat.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-29  9:36   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-29  9:47     ` Vladimir Sementsov-Ogievskiy
  2020-07-01  8:07       ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29  9:47 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

29.06.2020 12:36, Vladimir Sementsov-Ogievskiy wrote:
> 24.06.2020 19:43, Markus Armbruster wrote:
>> This is to make the next commit easier to review.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   util/qemu-option.c | 32 ++++++++++++++++++--------------
>>   1 file changed, 18 insertions(+), 14 deletions(-)
>>
>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>> index 6119f971a4..9941005c91 100644
>> --- a/util/qemu-option.c
>> +++ b/util/qemu-option.c
>> @@ -270,6 +270,7 @@ static void qemu_opt_del_all(QemuOpts *opts, const char *name)
>>   const char *qemu_opt_get(QemuOpts *opts, const char *name)
>>   {
>>       QemuOpt *opt;
>> +    const QemuOptDesc *desc;
> Honestly, I don't see how this hunk helps with the following patch, which is simple anyway.
> Keeping desc variable scope smaller seems better for me, as well as further scope of
> def_val. (Still, keep my r-b if you don't want to change it).
> 

Aha, I see, we have more similar patterns and you want them to look similarly. Still, it's
better to keep scope of variable smaller. May be a follow-up.

-- 
Best regards,
Vladimir


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

* Re: [PATCH 13/46] qemu-option: Simplify around find_default_by_name()
  2020-06-25 13:12     ` Markus Armbruster
@ 2020-06-29 10:02       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29 10:02 UTC (permalink / raw)
  To: Markus Armbruster, Eric Blake
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

25.06.2020 16:12, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>    util/qemu-option.c | 13 ++++---------
>>>    1 file changed, 4 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>>> index ddcf3072c5..d9293814b4 100644
>>> --- a/util/qemu-option.c
>>> +++ b/util/qemu-option.c
>>> @@ -286,11 +286,9 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
>>>        opt = qemu_opt_find(opts, name);
>>>        if (!opt) {
>>>            def_val = find_default_by_name(opts, name);
>>> -        if (def_val) {
>>> -            return def_val;
>>> -        }
>>> +        return def_val;
>>>        }
>>> -    return opt ? opt->str : NULL;
>>> +    return opt->str;
>>>    }
>>
>> You could go with even fewer lines and variables by inverting the logic:
>>
>> if (opt) {
>>      return opt->str;
>> }
>> return find_default_by_name(opts, name);
> 
> Yes, that's better.
> 
>>>      void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts,
>>> const char *name)
>>> @@ -320,7 +318,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>>>    {
>>>        QemuOpt *opt;
>>>        const char *def_val;
>>> -    char *str = NULL;
>>> +    char *str;
>>>          if (opts == NULL) {
>>>            return NULL;
>>> @@ -329,10 +327,7 @@ char *qemu_opt_get_del(QemuOpts *opts, const char *name)
>>>        opt = qemu_opt_find(opts, name);
>>>        if (!opt) {
>>>            def_val = find_default_by_name(opts, name);
>>> -        if (def_val) {
>>> -            str = g_strdup(def_val);
>>> -        }
>>> -        return str;
>>> +        return g_strdup(def_val);
>>
>> Similarly, you could drop def_val with:
>>   return g_strdup(find_default_by_name(opts, name));
> 
> Your contracted version is still readable; sold.
> 
>> Either way,
>> Reviewed-by: Eric Blake <eblake@redhat.com>
> 

with suggested improvements:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>



-- 
Best regards,
Vladimir


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

* Re: [PATCH 14/46] qemu-option: Factor out helper opt_create()
  2020-06-24 16:43 ` [PATCH 14/46] qemu-option: Factor out helper opt_create() Markus Armbruster
  2020-06-24 19:47   ` Eric Blake
@ 2020-06-29 10:09   ` Vladimir Sementsov-Ogievskiy
  2020-07-01  8:13     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29 10:09 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> There is just one use so far.  The next commit will add more.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 27 ++++++++++++++++++---------
>   1 file changed, 18 insertions(+), 9 deletions(-)
> 
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index d9293814b4..3cdf0c0800 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -502,6 +502,23 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
>       }
>   }
>   
> +static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value,
> +                           bool prepend)
> +{
> +    QemuOpt *opt = g_malloc0(sizeof(*opt));

I'd prefer g_new0(QemuOpt, 1)

anyway:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

> +
> +    opt->name = g_strdup(name);
> +    opt->str = value;
> +    opt->opts = opts;
> +    if (prepend) {
> +        QTAILQ_INSERT_HEAD(&opts->head, opt, next);
> +    } else {
> +        QTAILQ_INSERT_TAIL(&opts->head, opt, next);
> +    }
> +
> +    return opt;
> +}
> +
>   static void opt_set(QemuOpts *opts, const char *name, char *value,
>                       bool prepend, bool *help_wanted, Error **errp)
>   {
> @@ -519,16 +536,8 @@ static void opt_set(QemuOpts *opts, const char *name, char *value,
>           return;
>       }
>   
> -    opt = g_malloc0(sizeof(*opt));
> -    opt->name = g_strdup(name);
> -    opt->opts = opts;
> -    if (prepend) {
> -        QTAILQ_INSERT_HEAD(&opts->head, opt, next);
> -    } else {
> -        QTAILQ_INSERT_TAIL(&opts->head, opt, next);
> -    }
> +    opt = opt_create(opts, name, value, prepend);
>       opt->desc = desc;
> -    opt->str = value;
>       qemu_opt_parse(opt, &local_err);
>       if (local_err) {
>           error_propagate(errp, local_err);
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure
  2020-06-24 16:43 ` [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure Markus Armbruster
  2020-06-24 19:50   ` Eric Blake
@ 2020-06-29 10:37   ` Vladimir Sementsov-Ogievskiy
  2020-07-01  9:01     ` Markus Armbruster
  1 sibling, 1 reply; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29 10:37 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> opt_set() frees its argument @value on failure.  Slightly unclean;
> functions ideally do nothing on failure.
> 
> To tidy this up, move opt_create() from opt_set() into its callers,
> along with the cleanup.

Hmm, let me think a bit..

So, prior to this patch:

opt_set gets name/value pair and sets the option in opts object, it
seems absolutely obvious and standard behavior for Map-like object.

The fact that for setting an option we create a QemuOpt object, and
somehow register it inside opts object is an implementation detail.

after the patch:

opt_set gets opt object, which is already registered in opts. So,
it seems like option is "partly" set already, and opt_set only
finalize the processing.

And, as opt_set() only finalize the "set" operation, on opt_set
failure we need additional roll-back of "set" operation first step.

Additional fact, indirectly showing that something is unclear here
is that we pass "opts" to opt_set twice: as "opts" parameter and
inside opt: (opt->opts must be the same, assertion won't hurt if
you decide to keep the patch).

=====

Semantics before the patch seems clearer to me.

To improve the situation around "value", we can just g_strdup it
in opt_create as well as "name" argument (and use const char*
type for "value" argument as well)

> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>   util/qemu-option.c | 33 ++++++++++++++++++---------------
>   1 file changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index 3cdf0c0800..14946e81f2 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -519,36 +519,39 @@ static QemuOpt *opt_create(QemuOpts *opts, const char *name, char *value,
>       return opt;
>   }
>   
> -static void opt_set(QemuOpts *opts, const char *name, char *value,
> -                    bool prepend, bool *help_wanted, Error **errp)
> +static bool opt_set(QemuOpts *opts, QemuOpt *opt, bool *help_wanted,
> +                    Error **errp)
>   {
> -    QemuOpt *opt;
>       const QemuOptDesc *desc;
>       Error *local_err = NULL;
>   
> -    desc = find_desc_by_name(opts->list->desc, name);
> +    desc = find_desc_by_name(opts->list->desc, opt->name);
>       if (!desc && !opts_accepts_any(opts)) {
> -        g_free(value);
> -        error_setg(errp, QERR_INVALID_PARAMETER, name);
> -        if (help_wanted && is_help_option(name)) {
> +        error_setg(errp, QERR_INVALID_PARAMETER, opt->name);
> +        if (help_wanted && is_help_option(opt->name)) {
>               *help_wanted = true;
>           }
> -        return;
> +        return false;
>       }
>   
> -    opt = opt_create(opts, name, value, prepend);
>       opt->desc = desc;
>       qemu_opt_parse(opt, &local_err);
>       if (local_err) {
>           error_propagate(errp, local_err);
> -        qemu_opt_del(opt);
> +        return false;
>       }
> +
> +    return true;
>   }
>   
>   void qemu_opt_set(QemuOpts *opts, const char *name, const char *value,
>                     Error **errp)
>   {
> -    opt_set(opts, name, g_strdup(value), false, NULL, errp);
> +    QemuOpt *opt = opt_create(opts, name, g_strdup(value), false);
> +
> +    if (!opt_set(opts, opt, NULL, errp)) {
> +        qemu_opt_del(opt);
> +    }
>   }
>   
>   void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
> @@ -820,9 +823,9 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
>                             const char *firstname, bool prepend,
>                             bool *help_wanted, Error **errp)
>   {
> -    Error *local_err = NULL;
>       char *option, *value;
>       const char *p;
> +    QemuOpt *opt;
>   
>       for (p = params; *p;) {
>           p = get_opt_name_value(p, firstname, &option, &value);
> @@ -834,10 +837,10 @@ static void opts_do_parse(QemuOpts *opts, const char *params,
>               continue;
>           }
>   
> -        opt_set(opts, option, value, prepend, help_wanted, &local_err);
> +        opt = opt_create(opts, option, value, prepend);
>           g_free(option);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!opt_set(opts, opt, help_wanted, errp)) {
> +            qemu_opt_del(opt);
>               return;
>           }
>       }
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
                     ` (2 preceding siblings ...)
  2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
@ 2020-06-29 10:40   ` Greg Kurz
  3 siblings, 0 replies; 157+ messages in thread
From: Greg Kurz @ 2020-06-29 10:40 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

On Wed, 24 Jun 2020 18:43:01 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Convert
> 
>     foo(..., &err);
>     if (err) {
>         ...
>     }
> 
> to
> 
>     if (!foo(..., &err)) {
>         ...
>     }
> 
> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
> Coccinelle script:
> 
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     identifier errp;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>     -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>     @@
>     identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>     expression list args, args2;
>     typedef Error;
>     Error *err;
>     @@
>     -      fun(args, &err, args2);
>     -      if (err) {
>     +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
> 
> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
> ARMSSE being used both as typedef and function-like macro there.
> Convert manually.
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Clean up whitespace.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---

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

>  hw/arm/allwinner-a10.c          |  21 ++-----
>  hw/arm/armsse.c                 | 104 ++++++++------------------------
>  hw/arm/armv7m.c                 |  12 +---
>  hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>  hw/arm/aspeed_soc.c             |  60 +++++-------------
>  hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>  hw/arm/bcm2836.c                |  12 +---
>  hw/arm/cubieboard.c             |   3 +-
>  hw/arm/digic.c                  |  12 +---
>  hw/arm/digic_boards.c           |   3 +-
>  hw/arm/fsl-imx25.c              |  44 ++++----------
>  hw/arm/fsl-imx31.c              |  32 +++-------
>  hw/arm/fsl-imx6.c               |  48 ++++-----------
>  hw/arm/msf2-soc.c               |  21 ++-----
>  hw/arm/nrf51_soc.c              |  24 ++------
>  hw/arm/stm32f205_soc.c          |  29 +++------
>  hw/arm/stm32f405_soc.c          |  32 +++-------
>  hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>  hw/block/fdc.c                  |   4 +-
>  hw/block/xen-block.c            |   3 +-
>  hw/char/serial-pci-multi.c      |   5 +-
>  hw/char/serial-pci.c            |   5 +-
>  hw/char/serial.c                |  10 +--
>  hw/core/cpu.c                   |   3 +-
>  hw/cpu/a15mpcore.c              |   5 +-
>  hw/cpu/a9mpcore.c               |  21 ++-----
>  hw/cpu/arm11mpcore.c            |  17 ++----
>  hw/cpu/realview_mpcore.c        |   9 +--
>  hw/display/virtio-gpu-pci.c     |   6 +-
>  hw/display/virtio-vga.c         |   5 +-
>  hw/intc/armv7m_nvic.c           |   9 +--
>  hw/intc/pnv_xive.c              |   8 +--
>  hw/intc/realview_gic.c          |   5 +-
>  hw/intc/spapr_xive.c            |   8 +--
>  hw/intc/xics.c                  |   5 +-
>  hw/intc/xive.c                  |   3 +-
>  hw/isa/piix4.c                  |   5 +-
>  hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>  hw/mips/cps.c                   |  17 ++----
>  hw/misc/macio/cuda.c            |   5 +-
>  hw/misc/macio/macio.c           |  25 ++------
>  hw/misc/macio/pmu.c             |   5 +-
>  hw/pci-host/pnv_phb3.c          |  13 +---
>  hw/pci-host/pnv_phb4.c          |   5 +-
>  hw/pci-host/pnv_phb4_pec.c      |   5 +-
>  hw/ppc/e500.c                   |   5 +-
>  hw/ppc/pnv.c                    |  53 ++++------------
>  hw/ppc/pnv_core.c               |   4 +-
>  hw/ppc/pnv_psi.c                |   9 +--
>  hw/ppc/spapr_cpu_core.c         |   3 +-
>  hw/ppc/spapr_irq.c              |   5 +-
>  hw/riscv/opentitan.c            |   9 +--
>  hw/riscv/sifive_e.c             |   6 +-
>  hw/riscv/sifive_u.c             |   5 +-
>  hw/s390x/event-facility.c       |  13 ++--
>  hw/s390x/s390-pci-bus.c         |   3 +-
>  hw/s390x/sclp.c                 |   3 +-
>  hw/s390x/virtio-ccw-crypto.c    |   5 +-
>  hw/s390x/virtio-ccw-rng.c       |   5 +-
>  hw/scsi/scsi-bus.c              |   4 +-
>  hw/sd/aspeed_sdhci.c            |   4 +-
>  hw/sd/ssi-sd.c                  |   3 +-
>  hw/usb/bus.c                    |   3 +-
>  hw/virtio/virtio-rng-pci.c      |   5 +-
>  qdev-monitor.c                  |   3 +-
>  65 files changed, 248 insertions(+), 768 deletions(-)
> 
> diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
> index 52e0d83760..3e45aa4141 100644
> --- a/hw/arm/allwinner-a10.c
> +++ b/hw/arm/allwinner-a10.c
> @@ -72,17 +72,12 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>  {
>      AwA10State *s = AW_A10(dev);
>      SysBusDevice *sysbusdev;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->intc);
> @@ -93,9 +88,7 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>      qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->timer);
> @@ -117,18 +110,14 @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
>          qemu_check_nic_model(&nd_table[0], TYPE_AW_EMAC);
>          qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
>          return;
>      }
>      sysbusdev = SYS_BUS_DEVICE(&s->emac);
>      sysbus_mmio_map(sysbusdev, 0, AW_A10_EMAC_BASE);
>      sysbus_connect_irq(sysbusdev, 0, qdev_get_gpio_in(dev, 55));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sata), 0, AW_A10_SATA_BASE);
> diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
> index e2cf43ee0b..b306d95538 100644
> --- a/hw/arm/armsse.c
> +++ b/hw/arm/armsse.c
> @@ -566,9 +566,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
>                                   "memory", &error_abort);
>          object_property_set_link(cpuobj, OBJECT(s), "idau", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(cpuobj), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(cpuobj), errp)) {
>              return;
>          }
>          /*
> @@ -577,9 +575,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>           * CPU must exist and have been parented into the cluster before
>           * the cluster is realized.
>           */
> -        qdev_realize(DEVICE(&s->cluster[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cluster[i]), NULL, errp)) {
>              return;
>          }
>  
> @@ -613,9 +609,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                      error_propagate(errp, err);
>                      return;
>                  }
> -                qdev_realize(DEVICE(splitter), NULL, &err);
> -                if (err) {
> -                    error_propagate(errp, err);
> +                if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>                      return;
>                  }
>                  for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
> @@ -646,9 +640,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* Security controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->secctl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->secctl), errp)) {
>          return;
>      }
>      sbd_secctl = SYS_BUS_DEVICE(&s->secctl);
> @@ -669,9 +661,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->sec_resp_splitter), NULL, errp)) {
>          return;
>      }
>      dev_splitter = DEVICE(&s->sec_resp_splitter);
> @@ -693,9 +683,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          }
>          object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
>                                   "downstream", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mpc[i]), errp)) {
>              return;
>          }
>          /* Map the upstream end of the MPC into the right place... */
> @@ -716,9 +704,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->mpc_irq_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
> @@ -735,9 +721,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>       * map its upstream ends to the right place in the container.
>       */
>      qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
> @@ -747,9 +731,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>  
>      qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer1), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
> @@ -759,9 +741,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>  
>      qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
> @@ -785,9 +765,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              int cpunum;
>              SysBusDevice *mhu_sbd = SYS_BUS_DEVICE(&s->mhu[i]);
>  
> -            sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->mhu[i]), errp)) {
>                  return;
>              }
>              port = g_strdup_printf("port[%d]", i + 3);
> @@ -812,9 +790,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          }
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc0), errp)) {
>          return;
>      }
>  
> @@ -861,9 +837,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->ppc_irq_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
> @@ -884,9 +858,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              qdev_prop_set_string(DEVICE(&s->cachectrl[i]), "name", name);
>              g_free(name);
>              qdev_prop_set_uint64(DEVICE(&s->cachectrl[i]), "size", 0x1000);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cachectrl[i]), errp)) {
>                  return;
>              }
>  
> @@ -902,9 +874,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              qdev_prop_set_string(DEVICE(&s->cpusecctrl[i]), "name", name);
>              g_free(name);
>              qdev_prop_set_uint64(DEVICE(&s->cpusecctrl[i]), "size", 0x1000);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpusecctrl[i]), errp)) {
>                  return;
>              }
>  
> @@ -917,9 +887,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              MemoryRegion *mr;
>  
>              qdev_prop_set_uint32(DEVICE(&s->cpuid[i]), "CPUID", i);
> -            sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), &err);
> -            if (err) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpuid[i]), errp)) {
>                  return;
>              }
>  
> @@ -933,9 +901,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>       *   0x4002f000: S32K timer
>       */
>      qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
> @@ -944,9 +910,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]",
>                               &error_abort);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->apb_ppc1), errp)) {
>          return;
>      }
>      mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->apb_ppc1), 0);
> @@ -982,9 +946,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysinfo), errp)) {
>          return;
>      }
>      /* System information registers */
> @@ -998,9 +960,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>                              "INITSVTOR0_RST", &error_abort);
>      object_property_set_int(OBJECT(&s->sysctl), s->init_svtor,
>                              "INITSVTOR1_RST", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysctl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctl), 0, 0x50021000);
> @@ -1033,18 +993,14 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(&s->nmi_orgate), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->nmi_orgate), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
>                            qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
>  
>      qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32kwatchdog), 0,
> @@ -1054,9 +1010,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      /* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
>  
>      qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->nswatchdog), 0,
> @@ -1064,9 +1018,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
>  
>      qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->swatchdog), 0,
> @@ -1081,9 +1033,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        qdev_realize(DEVICE(splitter), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>              return;
>          }
>      }
> @@ -1128,9 +1078,7 @@ static void armsse_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        qdev_realize(DEVICE(splitter), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(splitter), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
> index 3308211e9c..5d6bded386 100644
> --- a/hw/arm/armv7m.c
> +++ b/hw/arm/armv7m.c
> @@ -213,16 +213,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
>      s->cpu->env.nvic = &s->nvic;
>      s->nvic.cpu = s->cpu;
>  
> -    qdev_realize(DEVICE(s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s->cpu), NULL, errp)) {
>          return;
>      }
>  
>      /* Note that we must realize the NVIC after the CPU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nvic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvic), errp)) {
>          return;
>      }
>  
> @@ -254,9 +250,7 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
>              }
>              object_property_set_link(obj, OBJECT(s->board_memory),
>                                       "source-memory", &error_abort);
> -            sysbus_realize(SYS_BUS_DEVICE(obj), &err);
> -            if (err != NULL) {
> -                error_propagate(errp, err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
>                  return;
>              }
>  
> diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
> index 59a7a1370b..aa02755d3f 100644
> --- a/hw/arm/aspeed_ast2600.c
> +++ b/hw/arm/aspeed_ast2600.c
> @@ -259,9 +259,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>           * is needed when using -kernel
>           */
>  
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -301,17 +299,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                                  sc->memmap[ASPEED_SRAM], &s->sram);
>  
>      /* SCU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
>  
>      /* RTC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
> @@ -321,9 +315,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      /* Timer */
>      object_property_set_link(OBJECT(&s->timerctrl),
>                               OBJECT(&s->scu), "scu", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
> @@ -343,9 +335,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      /* I2C */
>      object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
> @@ -368,9 +358,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
> @@ -385,9 +373,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                                   "dram", &error_abort);
>          object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
> @@ -398,9 +384,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>      /* EHCI */
>      for (i = 0; i < sc->ehcis_num; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
> @@ -410,9 +394,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* SDMC - SDRAM Memory Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
> @@ -423,9 +405,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->wdt[i]),
>                                   OBJECT(&s->scu), "scu", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
> @@ -436,9 +416,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->macs_num; i++) {
>          object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
> @@ -448,9 +426,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->mii[i]), OBJECT(&s->ftgmac100[i]),
>                                   "nic", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->mii[i]), errp)) {
>              return;
>          }
>  
> @@ -459,9 +435,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* XDMA */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
> @@ -470,18 +444,14 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_XDMA));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
>                         aspeed_soc_get_irq(s, ASPEED_GPIO));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio_1_8v), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio_1_8v), 0,
> @@ -490,9 +460,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_GPIO_1_8V));
>  
>      /* SDHCI */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
> @@ -501,9 +469,7 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_SDHCI));
>  
>      /* eMMC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->emmc), 0, sc->memmap[ASPEED_EMMC]);
> diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
> index 311458aa76..6faffc13cc 100644
> --- a/hw/arm/aspeed_soc.c
> +++ b/hw/arm/aspeed_soc.c
> @@ -230,9 +230,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* CPU */
>      for (i = 0; i < sc->num_cpus; i++) {
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -248,17 +246,13 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                                  sc->memmap[ASPEED_SRAM], &s->sram);
>  
>      /* SCU */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_SCU]);
>  
>      /* VIC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->vic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_VIC]);
> @@ -268,9 +262,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
>      /* RTC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, sc->memmap[ASPEED_RTC]);
> @@ -280,9 +272,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      /* Timer */
>      object_property_set_link(OBJECT(&s->timerctrl),
>                               OBJECT(&s->scu), "scu", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
> @@ -302,9 +292,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      /* I2C */
>      object_property_set_link(OBJECT(&s->i2c), OBJECT(s->dram_mr), "dram",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->i2c), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_I2C]);
> @@ -320,9 +308,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_FMC]);
> @@ -335,9 +321,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->spis_num; i++) {
>          object_property_set_int(OBJECT(&s->spi[i]), 1, "num-cs",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
> @@ -348,9 +332,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* EHCI */
>      for (i = 0; i < sc->ehcis_num; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ehci[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci[i]), 0,
> @@ -360,9 +342,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* SDMC - SDRAM Memory Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdmc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, sc->memmap[ASPEED_SDMC]);
> @@ -373,9 +353,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_link(OBJECT(&s->wdt[i]),
>                                   OBJECT(&s->scu), "scu", &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
> @@ -386,9 +364,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < sc->macs_num; i++) {
>          object_property_set_bool(OBJECT(&s->ftgmac100[i]), true, "aspeed",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->ftgmac100[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0,
> @@ -398,9 +374,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* XDMA */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->xdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->xdma), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->xdma), 0,
> @@ -409,9 +383,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_XDMA));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_GPIO]);
> @@ -419,9 +391,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>                         aspeed_soc_get_irq(s, ASPEED_GPIO));
>  
>      /* SDHCI */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
> index 7ffdf62067..8313410ffe 100644
> --- a/hw/arm/bcm2835_peripherals.c
> +++ b/hw/arm/bcm2835_peripherals.c
> @@ -161,9 +161,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* Interrupt Controller */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ic), errp)) {
>          return;
>      }
>  
> @@ -172,9 +170,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      sysbus_pass_irq(SYS_BUS_DEVICE(s), SYS_BUS_DEVICE(&s->ic));
>  
>      /* Sys Timer */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->systmr), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systmr), errp)) {
>          return;
>      }
>      memory_region_add_subregion(&s->peri_mr, ST_OFFSET,
> @@ -185,9 +181,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>  
>      /* UART0 */
>      qdev_prop_set_chr(DEVICE(&s->uart0), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart0), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart0), errp)) {
>          return;
>      }
>  
> @@ -200,9 +194,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      /* AUX / UART1 */
>      qdev_prop_set_chr(DEVICE(&s->aux), "chardev", serial_hd(1));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->aux), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->aux), errp)) {
>          return;
>      }
>  
> @@ -213,9 +205,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_AUX));
>  
>      /* Mailboxes */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mboxes), errp)) {
>          return;
>      }
>  
> @@ -239,9 +229,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fb), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fb), errp)) {
>          return;
>      }
>  
> @@ -251,9 +239,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                         qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_FB));
>  
>      /* Property channel */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->property), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->property), errp)) {
>          return;
>      }
>  
> @@ -264,9 +250,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                        qdev_get_gpio_in(DEVICE(&s->mboxes), MBOX_CHAN_PROPERTY));
>  
>      /* Random Number Generator */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
>          return;
>      }
>  
> @@ -289,9 +273,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_bool(OBJECT(&s->sdhci), true, "pending-insert-quirk",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
>          return;
>      }
>  
> @@ -302,9 +284,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_ARASANSDIO));
>  
>      /* SDHOST */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhost), errp)) {
>          return;
>      }
>  
> @@ -315,9 +295,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_SDIO));
>  
>      /* DMA Channels */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp)) {
>          return;
>      }
>  
> @@ -334,18 +312,14 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      }
>  
>      /* THERMAL */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->thermal), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->thermal), errp)) {
>          return;
>      }
>      memory_region_add_subregion(&s->peri_mr, THERMAL_OFFSET,
>                  sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->thermal), 0));
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> @@ -355,9 +329,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>      object_property_add_alias(OBJECT(s), "sd-bus", OBJECT(&s->gpio), "sd-bus");
>  
>      /* Mphi */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mphi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mphi), errp)) {
>          return;
>      }
>  
> @@ -368,9 +340,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>                                 INTERRUPT_HOSTPORT));
>  
>      /* DWC2 */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dwc2), errp)) {
>          return;
>      }
>  
> diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
> index ed1793f7b7..51d156f0c5 100644
> --- a/hw/arm/bcm2836.c
> +++ b/hw/arm/bcm2836.c
> @@ -86,9 +86,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>  
>      object_property_add_const_link(OBJECT(&s->peripherals), "ram", obj);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->peripherals), errp)) {
>          return;
>      }
>  
> @@ -99,9 +97,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>                              info->peri_base, 1);
>  
>      /* bcm2836 interrupt controller (and mailboxes, etc.) */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->control), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->control), errp)) {
>          return;
>      }
>  
> @@ -133,9 +129,7 @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
>              return;
>          }
>  
> -        qdev_realize(DEVICE(&s->cpu[n].core), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[n].core), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
> index 5cbd115c53..c720e24ced 100644
> --- a/hw/arm/cubieboard.c
> +++ b/hw/arm/cubieboard.c
> @@ -80,8 +80,7 @@ static void cubieboard_init(MachineState *machine)
>          exit(1);
>      }
>  
> -    qdev_realize(DEVICE(a10), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(a10), NULL, &err)) {
>          error_reportf_err(err, "Couldn't realize Allwinner A10: ");
>          exit(1);
>      }
> diff --git a/hw/arm/digic.c b/hw/arm/digic.c
> index 13a83f7430..9fbb2258c9 100644
> --- a/hw/arm/digic.c
> +++ b/hw/arm/digic.c
> @@ -62,16 +62,12 @@ static void digic_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
>      for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>  
> @@ -80,9 +76,7 @@ static void digic_realize(DeviceState *dev, Error **errp)
>      }
>  
>      qdev_prop_set_chr(DEVICE(&s->uart), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>  
> diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
> index b6452d918c..d5524d3e72 100644
> --- a/hw/arm/digic_boards.c
> +++ b/hw/arm/digic_boards.c
> @@ -62,8 +62,7 @@ static void digic4_board_init(MachineState *machine, DigicBoard *board)
>          exit(EXIT_FAILURE);
>      }
>  
> -    qdev_realize(DEVICE(s), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(s), NULL, &err)) {
>          error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
>          exit(1);
>      }
> diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
> index 7ab5c98fbe..f5418c8c12 100644
> --- a/hw/arm/fsl-imx25.c
> +++ b/hw/arm/fsl-imx25.c
> @@ -85,15 +85,11 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>      uint8_t i;
>      Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX25_AVIC_ADDR);
> @@ -102,9 +98,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX25_CCM_ADDR);
> @@ -124,9 +118,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, serial_table[i].addr);
> @@ -149,9 +141,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          s->gpt[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpt[i]), 0, gpt_table[i].addr);
> @@ -172,9 +162,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->epit[i]), 0, epit_table[i].addr);
> @@ -185,18 +173,14 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>  
>      qdev_set_nic_properties(DEVICE(&s->fec), &nd_table[0]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->fec), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->fec), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->fec), 0, FSL_IMX25_FEC_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->fec), 0,
>                         qdev_get_gpio_in(DEVICE(&s->avic), FSL_IMX25_FEC_IRQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rngc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rngc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rngc), 0, FSL_IMX25_RNGC_ADDR);
> @@ -214,9 +198,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX25_I2C3_ADDR, FSL_IMX25_I2C3_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[i]), 0, i2c_table[i].addr);
> @@ -237,9 +219,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
> @@ -267,9 +247,7 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>          object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
>                                   "vendor",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
> diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
> index 42cca529c3..8326f5ff81 100644
> --- a/hw/arm/fsl-imx31.c
> +++ b/hw/arm/fsl-imx31.c
> @@ -66,15 +66,11 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>      uint16_t i;
>      Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->avic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->avic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->avic), 0, FSL_IMX31_AVIC_ADDR);
> @@ -83,9 +79,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->avic), 1,
>                         qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX31_CCM_ADDR);
> @@ -102,9 +96,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>  
> @@ -116,9 +108,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>      s->gpt.ccm = IMX_CCM(&s->ccm);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
>          return;
>      }
>  
> @@ -138,9 +128,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>  
> @@ -162,9 +150,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>          };
>  
>          /* Initialize the I2C */
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>          /* Map I2C memory */
> @@ -188,9 +174,7 @@ static void fsl_imx31_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_bool(OBJECT(&s->gpio[i]), false, "has-edge-sel",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
> diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
> index 4ae3c3efc2..4c2da277ec 100644
> --- a/hw/arm/fsl-imx6.c
> +++ b/hw/arm/fsl-imx6.c
> @@ -130,9 +130,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                                       "start-powered-off", &error_abort);
>          }
>  
> -        qdev_realize(DEVICE(&s->cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -144,9 +142,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                              FSL_IMX6_MAX_IRQ + GIC_INTERNAL, "num-irq",
>                              &error_abort);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, FSL_IMX6_A9MPCORE_ADDR);
> @@ -158,16 +154,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                             qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ccm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ccm), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ccm), 0, FSL_IMX6_CCM_ADDR);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->src), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->src), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->src), 0, FSL_IMX6_SRC_ADDR);
> @@ -187,9 +179,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>  
> @@ -201,9 +191,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>      s->gpt.ccm = IMX_CCM(&s->ccm);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpt), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpt), errp)) {
>          return;
>      }
>  
> @@ -224,9 +212,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>  
>          s->epit[i].ccm = IMX_CCM(&s->ccm);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->epit[i]), errp)) {
>              return;
>          }
>  
> @@ -247,9 +233,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>              { FSL_IMX6_I2C3_ADDR, FSL_IMX6_I2C3_IRQ }
>          };
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c[i]), errp)) {
>              return;
>          }
>  
> @@ -307,9 +291,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>                                   &error_abort);
>          object_property_set_bool(OBJECT(&s->gpio[i]), true, "has-upper-pin-irq",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), errp)) {
>              return;
>          }
>  
> @@ -343,9 +325,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>          object_property_set_uint(OBJECT(&s->esdhc[i]), SDHCI_VENDOR_IMX,
>                                   "vendor",
>                                   &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->esdhc[i]), 0, esdhc_table[i].addr);
> @@ -390,9 +370,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>          };
>  
>          /* Initialize the SPI */
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -403,9 +381,7 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
>      }
>  
>      qdev_set_nic_properties(DEVICE(&s->eth), &nd_table[0]);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->eth), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->eth), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->eth), 0, FSL_IMX6_ENET_ADDR);
> diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
> index 3235c76194..b6143fba92 100644
> --- a/hw/arm/msf2-soc.c
> +++ b/hw/arm/msf2-soc.c
> @@ -93,7 +93,6 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      MSF2State *s = MSF2_SOC(dev_soc);
>      DeviceState *dev, *armv7m;
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      int i;
>  
>      MemoryRegion *system_memory = get_system_memory();
> @@ -125,9 +124,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
> @@ -153,9 +150,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->timer);
>      /* APB0 clock is the timer input clock */
>      qdev_prop_set_uint32(dev, "clock-frequency", s->m3clk / s->apb0div);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->timer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -168,9 +163,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->sysreg);
>      qdev_prop_set_uint32(dev, "apb0divisor", s->apb0div);
>      qdev_prop_set_uint32(dev, "apb1divisor", s->apb1div);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sysreg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -179,9 +172,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < MSF2_NUM_SPIS; i++) {
>          gchar *bus_name;
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -199,9 +190,7 @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
>      dev = DEVICE(&s->emac);
>      object_property_set_link(OBJECT(&s->emac), OBJECT(get_system_memory()),
>                               "ahb-bus", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->emac), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->emac), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
> index 20dd8b5897..a398bdfab8 100644
> --- a/hw/arm/nrf51_soc.c
> +++ b/hw/arm/nrf51_soc.c
> @@ -67,9 +67,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      object_property_set_link(OBJECT(&s->cpu), OBJECT(&s->container), "memory",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->cpu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
>          return;
>      }
>  
> @@ -84,9 +82,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>      memory_region_add_subregion(&s->container, NRF51_SRAM_BASE, &s->sram);
>  
>      /* UART */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>      mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0);
> @@ -96,9 +92,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>                         BASE_TO_IRQ(NRF51_UART_BASE)));
>  
>      /* RNG */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rng), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng), errp)) {
>          return;
>      }
>  
> @@ -116,9 +110,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>          return;
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->nvm), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->nvm), errp)) {
>          return;
>      }
>  
> @@ -132,9 +124,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>      memory_region_add_subregion_overlap(&s->container, NRF51_FLASH_BASE, mr, 0);
>  
>      /* GPIO */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> @@ -151,9 +141,7 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>  
> diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
> index 56aef686c9..5b008722e5 100644
> --- a/hw/arm/stm32f205_soc.c
> +++ b/hw/arm/stm32f205_soc.c
> @@ -81,7 +81,6 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      STM32F205State *s = STM32F205_SOC(dev_soc);
>      DeviceState *dev, *armv7m;
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      int i;
>  
>      MemoryRegion *system_memory = get_system_memory();
> @@ -107,17 +106,13 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(get_system_memory()),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
>      /* System configuration controller */
>      dev = DEVICE(&s->syscfg);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -128,9 +123,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_USARTS; i++) {
>          dev = DEVICE(&(s->usart[i]));
>          qdev_prop_set_chr(dev, "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -142,9 +135,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_TIMERS; i++) {
>          dev = DEVICE(&(s->timer[i]));
>          qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -155,9 +146,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* ADC 1 to 3 */
>      object_property_set_int(OBJECT(s->adc_irqs), STM_NUM_ADCS,
>                              "num-lines", &error_abort);
> -    qdev_realize(DEVICE(s->adc_irqs), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s->adc_irqs), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(s->adc_irqs), 0,
> @@ -165,9 +154,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      for (i = 0; i < STM_NUM_ADCS; i++) {
>          dev = DEVICE(&(s->adc[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -179,9 +166,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* SPI 1 and 2 */
>      for (i = 0; i < STM_NUM_SPIS; i++) {
>          dev = DEVICE(&(s->spi[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
> index cf9228d8e7..48b7181665 100644
> --- a/hw/arm/stm32f405_soc.c
> +++ b/hw/arm/stm32f405_soc.c
> @@ -118,17 +118,13 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      qdev_prop_set_bit(armv7m, "enable-bitband", true);
>      object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
>                                       "memory", &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), errp)) {
>          return;
>      }
>  
>      /* System configuration controller */
>      dev = DEVICE(&s->syscfg);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> @@ -139,9 +135,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_USARTS; i++) {
>          dev = DEVICE(&(s->usart[i]));
>          qdev_prop_set_chr(dev, "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -153,9 +147,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      for (i = 0; i < STM_NUM_TIMERS; i++) {
>          dev = DEVICE(&(s->timer[i]));
>          qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -173,9 +165,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      }
>      object_property_set_int(OBJECT(&s->adc_irqs), STM_NUM_ADCS,
>                              "num-lines", &error_abort);
> -    qdev_realize(DEVICE(&s->adc_irqs), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->adc_irqs), NULL, errp)) {
>          return;
>      }
>      qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
> @@ -183,9 +173,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      for (i = 0; i < STM_NUM_ADCS; i++) {
>          dev = DEVICE(&(s->adc[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -197,9 +185,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>      /* SPI devices */
>      for (i = 0; i < STM_NUM_SPIS; i++) {
>          dev = DEVICE(&(s->spi[i]));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>          busdev = SYS_BUS_DEVICE(dev);
> @@ -209,9 +195,7 @@ static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
>  
>      /* EXTI device */
>      dev = DEVICE(&s->exti);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->exti), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->exti), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(dev);
> diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
> index 1de9d4a89d..33e63a2c4e 100644
> --- a/hw/arm/xlnx-zynqmp.c
> +++ b/hw/arm/xlnx-zynqmp.c
> @@ -176,7 +176,6 @@ static inline int arm_gic_ppi_index(int cpu_nr, int ppi_index)
>  static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
>                                     const char *boot_cpu, Error **errp)
>  {
> -    Error *err = NULL;
>      int i;
>      int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS,
>                         XLNX_ZYNQMP_NUM_RPU_CPUS);
> @@ -209,9 +208,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
>  
>          object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs",
>                                   &error_abort);
> -        qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->rpu_cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
> @@ -367,16 +364,12 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>                                  "reset-cbar", &error_abort);
>          object_property_set_int(OBJECT(&s->apu_cpu[i]), num_apus,
>                                  "core-count", &error_abort);
> -        qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->apu_cpu[i]), NULL, errp)) {
>              return;
>          }
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -470,9 +463,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>                                  &error_abort);
>          object_property_set_int(OBJECT(&s->gem[i]), 2, "num-priority-queues",
>                                  &error_abort);
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem[i]), 0, gem_addr[i]);
> @@ -482,9 +473,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>  
>      for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
>          qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hd(i));
> -        sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart[i]), errp)) {
>              return;
>          }
>          sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart[i]), 0, uart_addr[i]);
> @@ -494,9 +483,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>  
>      object_property_set_int(OBJECT(&s->sata), SATA_NUM_PORTS, "num-ports",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->sata), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->sata), errp)) {
>          return;
>      }
>  
> @@ -528,9 +515,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(sdhci), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(sdhci), errp)) {
>              return;
>          }
>          sysbus_mmio_map(sbd, 0, sdhci_addr[i]);
> @@ -545,9 +530,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      for (i = 0; i < XLNX_ZYNQMP_NUM_SPIS; i++) {
>          gchar *bus_name;
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
>              return;
>          }
>  
> @@ -562,9 +545,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>          g_free(bus_name);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->qspi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
> @@ -584,17 +565,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>          g_free(target_bus);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dp), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dp), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->dp), 0, DP_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dp), 0, gic_spi[DP_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->dpdma), errp)) {
>          return;
>      }
>      object_property_set_link(OBJECT(&s->dp), OBJECT(&s->dpdma), "dpdma",
> @@ -602,17 +579,13 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->dpdma), 0, DPDMA_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->dpdma), 0, gic_spi[DPDMA_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->ipi), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->ipi), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->ipi), 0, IPI_ADDR);
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->ipi), 0, gic_spi[IPI_IRQ]);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->rtc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR);
> @@ -624,9 +597,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>              error_propagate(errp, err);
>              return;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
>              return;
>          }
>  
> @@ -636,9 +607,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
>      }
>  
>      for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA_CH; i++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), errp)) {
>              return;
>          }
>  
> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
> index f4493d6afa..fe0ae2d146 100644
> --- a/hw/block/fdc.c
> +++ b/hw/block/fdc.c
> @@ -2574,9 +2574,7 @@ static void fdctrl_connect_drives(FDCtrl *fdctrl, DeviceState *fdc_dev,
>              return;
>          }
>  
> -        qdev_realize_and_unref(dev, &fdctrl->bus.bus, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize_and_unref(dev, &fdctrl->bus.bus, errp)) {
>              return;
>          }
>      }
> diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
> index 1b7bc5de08..10c44dfda2 100644
> --- a/hw/block/xen-block.c
> +++ b/hw/block/xen-block.c
> @@ -961,8 +961,7 @@ static void xen_block_device_create(XenBackendInstance *backend,
>      blockdev->iothread = iothread;
>      blockdev->drive = drive;
>  
> -    qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err);
> -    if (local_err) {
> +    if (!qdev_realize_and_unref(DEVICE(xendev), BUS(xenbus), &local_err)) {
>          error_propagate_prepend(errp, local_err,
>                                  "realization of device %s failed: ",
>                                  type);
> diff --git a/hw/char/serial-pci-multi.c b/hw/char/serial-pci-multi.c
> index 56f915e7c9..2cf3e44177 100644
> --- a/hw/char/serial-pci-multi.c
> +++ b/hw/char/serial-pci-multi.c
> @@ -95,7 +95,6 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
>      PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
>      PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
>      SerialState *s;
> -    Error *err = NULL;
>      size_t i, nports = multi_serial_get_port_count(pc);
>  
>      pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
> @@ -106,9 +105,7 @@ static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
>  
>      for (i = 0; i < nports; i++) {
>          s = pci->state + i;
> -        qdev_realize(DEVICE(s), NULL, &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(s), NULL, errp)) {
>              multi_serial_pci_exit(dev);
>              return;
>          }
> diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
> index 298f3adba7..cd56924a43 100644
> --- a/hw/char/serial-pci.c
> +++ b/hw/char/serial-pci.c
> @@ -47,11 +47,8 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
>  {
>      PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
>      SerialState *s = &pci->state;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/char/serial.c b/hw/char/serial.c
> index 9eebcb27e7..2386479492 100644
> --- a/hw/char/serial.c
> +++ b/hw/char/serial.c
> @@ -989,11 +989,8 @@ static void serial_io_realize(DeviceState *dev, Error **errp)
>  {
>      SerialIO *sio = SERIAL_IO(dev);
>      SerialState *s = &sio->serial;
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> @@ -1096,11 +1093,8 @@ static void serial_mm_realize(DeviceState *dev, Error **errp)
>  {
>      SerialMM *smm = SERIAL_MM(dev);
>      SerialState *s = &smm->serial;
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(s), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(s), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/core/cpu.c b/hw/core/cpu.c
> index 0f23409f1d..594441a150 100644
> --- a/hw/core/cpu.c
> +++ b/hw/core/cpu.c
> @@ -59,8 +59,7 @@ CPUState *cpu_create(const char *typename)
>  {
>      Error *err = NULL;
>      CPUState *cpu = CPU(object_new(typename));
> -    qdev_realize(DEVICE(cpu), NULL, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(cpu), NULL, &err)) {
>          error_report_err(err);
>          object_unref(OBJECT(cpu));
>          exit(EXIT_FAILURE);
> diff --git a/hw/cpu/a15mpcore.c b/hw/cpu/a15mpcore.c
> index e6085f5d44..c377be398d 100644
> --- a/hw/cpu/a15mpcore.c
> +++ b/hw/cpu/a15mpcore.c
> @@ -53,7 +53,6 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *gicdev;
>      SysBusDevice *busdev;
>      int i;
> -    Error *err = NULL;
>      bool has_el3;
>      bool has_el2 = false;
>      Object *cpuobj;
> @@ -76,9 +75,7 @@ static void a15mp_priv_realize(DeviceState *dev, Error **errp)
>          qdev_prop_set_bit(gicdev, "has-virtualization-extensions", has_el2);
>      }
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(&s->gic);
> diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
> index 642363d2f4..351295e518 100644
> --- a/hw/cpu/a9mpcore.c
> +++ b/hw/cpu/a9mpcore.c
> @@ -50,16 +50,13 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *scudev, *gicdev, *gtimerdev, *mptimerdev, *wdtdev;
>      SysBusDevice *scubusdev, *gicbusdev, *gtimerbusdev, *mptimerbusdev,
>                   *wdtbusdev;
> -    Error *err = NULL;
>      int i;
>      bool has_el3;
>      Object *cpuobj;
>  
>      scudev = DEVICE(&s->scu);
>      qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>      scubusdev = SYS_BUS_DEVICE(&s->scu);
> @@ -78,9 +75,7 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>          object_property_get_bool(cpuobj, "has_el3", &error_abort);
>      qdev_prop_set_bit(gicdev, "has-security-extensions", has_el3);
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      gicbusdev = SYS_BUS_DEVICE(&s->gic);
> @@ -93,27 +88,21 @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
>  
>      gtimerdev = DEVICE(&s->gtimer);
>      qdev_prop_set_uint32(gtimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gtimer), errp)) {
>          return;
>      }
>      gtimerbusdev = SYS_BUS_DEVICE(&s->gtimer);
>  
>      mptimerdev = DEVICE(&s->mptimer);
>      qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
>          return;
>      }
>      mptimerbusdev = SYS_BUS_DEVICE(&s->mptimer);
>  
>      wdtdev = DEVICE(&s->wdt);
>      qdev_prop_set_uint32(wdtdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt), errp)) {
>          return;
>      }
>      wdtbusdev = SYS_BUS_DEVICE(&s->wdt);
> diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
> index a2afb992fb..89c4e35143 100644
> --- a/hw/cpu/arm11mpcore.c
> +++ b/hw/cpu/arm11mpcore.c
> @@ -76,12 +76,9 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>      DeviceState *gicdev = DEVICE(&s->gic);
>      DeviceState *mptimerdev = DEVICE(&s->mptimer);
>      DeviceState *wdtimerdev = DEVICE(&s->wdtimer);
> -    Error *err = NULL;
>  
>      qdev_prop_set_uint32(scudev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->scu), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
>          return;
>      }
>  
> @@ -91,9 +88,7 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>                           ARM11MPCORE_NUM_GIC_PRIORITY_BITS);
>  
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -104,16 +99,12 @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
>      qdev_init_gpio_in(dev, mpcore_priv_set_irq, s->num_irq - 32);
>  
>      qdev_prop_set_uint32(mptimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mptimer), errp)) {
>          return;
>      }
>  
>      qdev_prop_set_uint32(wdtimerdev, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdtimer), errp)) {
>          return;
>      }
>  
> diff --git a/hw/cpu/realview_mpcore.c b/hw/cpu/realview_mpcore.c
> index d2e426fa45..96f4d2517a 100644
> --- a/hw/cpu/realview_mpcore.c
> +++ b/hw/cpu/realview_mpcore.c
> @@ -65,14 +65,11 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
>      DeviceState *priv = DEVICE(&s->priv);
>      DeviceState *gic;
>      SysBusDevice *gicbusdev;
> -    Error *err = NULL;
>      int n;
>      int i;
>  
>      qdev_prop_set_uint32(priv, "num-cpu", s->num_cpu);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->priv), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->priv), errp)) {
>          return;
>      }
>      sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->priv));
> @@ -81,9 +78,7 @@ static void realview_mpcore_realize(DeviceState *dev, Error **errp)
>      }
>      /* ??? IRQ routing is hardcoded to "normal" mode.  */
>      for (n = 0; n < 4; n++) {
> -        sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic[n]), errp)) {
>              return;
>          }
>          gic = DEVICE(&s->gic[n]);
> diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c
> index 41b88b878d..93ba5956ed 100644
> --- a/hw/display/virtio-gpu-pci.c
> +++ b/hw/display/virtio-gpu-pci.c
> @@ -31,13 +31,9 @@ static void virtio_gpu_pci_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>      VirtIOGPUBase *g = vgpu->vgpu;
>      DeviceState *vdev = DEVICE(g);
>      int i;
> -    Error *local_error = NULL;
>  
>      virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), &local_error);
> -
> -    if (local_error) {
> -        error_propagate(errp, local_error);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c
> index 67f409e106..fd550b35c8 100644
> --- a/hw/display/virtio-vga.c
> +++ b/hw/display/virtio-vga.c
> @@ -93,7 +93,6 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>      VirtIOVGABase *vvga = VIRTIO_VGA_BASE(vpci_dev);
>      VirtIOGPUBase *g = vvga->vgpu;
>      VGACommonState *vga = &vvga->vga;
> -    Error *err = NULL;
>      uint32_t offset;
>      int i;
>  
> @@ -138,9 +137,7 @@ static void virtio_vga_base_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>  
>      /* init virtio bits */
>      virtio_pci_force_virtio_1(vpci_dev);
> -    qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(g), BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
> index af9f4c5a85..3c4b6e6d70 100644
> --- a/hw/intc/armv7m_nvic.c
> +++ b/hw/intc/armv7m_nvic.c
> @@ -2619,7 +2619,6 @@ static void nvic_systick_trigger(void *opaque, int n, int level)
>  static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>  {
>      NVICState *s = NVIC(dev);
> -    Error *err = NULL;
>      int regionlen;
>  
>      /* The armv7m container object will have set our CPU pointer */
> @@ -2640,9 +2639,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>  
>      s->num_prio_bits = arm_feature(&s->cpu->env, ARM_FEATURE_V7) ? 8 : 2;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
>          return;
>      }
>      sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), 0,
> @@ -2657,9 +2654,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
>          object_initialize_child(OBJECT(dev), "systick-reg-s",
>                                  &s->systick[M_REG_S], TYPE_SYSTICK);
>  
> -        sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_S]), errp)) {
>              return;
>          }
>          sysbus_connect_irq(SYS_BUS_DEVICE(&s->systick[M_REG_S]), 0,
> diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
> index 85ba0b4655..7d33457e81 100644
> --- a/hw/intc/pnv_xive.c
> +++ b/hw/intc/pnv_xive.c
> @@ -1833,9 +1833,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> @@ -1843,9 +1841,7 @@ static void pnv_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/intc/realview_gic.c b/hw/intc/realview_gic.c
> index f11fb5259a..9b12116b2a 100644
> --- a/hw/intc/realview_gic.c
> +++ b/hw/intc/realview_gic.c
> @@ -26,7 +26,6 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
>      SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
>      RealViewGICState *s = REALVIEW_GIC(dev);
>      SysBusDevice *busdev;
> -    Error *err = NULL;
>      /* The GICs on the RealView boards have a fixed nonconfigurable
>       * number of interrupt lines, so we don't need to expose this as
>       * a qdev property.
> @@ -34,9 +33,7 @@ static void realview_gic_realize(DeviceState *dev, Error **errp)
>      int numirq = 96;
>  
>      qdev_prop_set_uint32(DEVICE(&s->gic), "num-irq", numirq);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>      busdev = SYS_BUS_DEVICE(&s->gic);
> diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
> index b7fc8dde7a..4e9ee90353 100644
> --- a/hw/intc/spapr_xive.c
> +++ b/hw/intc/spapr_xive.c
> @@ -312,9 +312,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>      sysbus_init_mmio(SYS_BUS_DEVICE(xive), &xsrc->esb_mmio);
> @@ -326,9 +324,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
>                              &error_fatal);
>      object_property_set_link(OBJECT(end_xsrc), OBJECT(xive), "xive",
>                               &error_abort);
> -    qdev_realize(DEVICE(end_xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(end_xsrc), NULL, errp)) {
>          return;
>      }
>      sysbus_init_mmio(SYS_BUS_DEVICE(xive), &end_xsrc->esb_mmio);
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index d365eeca66..0d336fb033 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -376,7 +376,6 @@ static const TypeInfo icp_info = {
>  
>  Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
>  {
> -    Error *local_err = NULL;
>      Object *obj;
>  
>      obj = object_new(type);
> @@ -384,10 +383,8 @@ Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Error **errp)
>      object_unref(obj);
>      object_property_set_link(obj, OBJECT(xi), ICP_PROP_XICS, &error_abort);
>      object_property_set_link(obj, cpu, ICP_PROP_CPU, &error_abort);
> -    qdev_realize(DEVICE(obj), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(obj), NULL, errp)) {
>          object_unparent(obj);
> -        error_propagate(errp, local_err);
>          obj = NULL;
>      }
>  
> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
> index 2c30dc53d8..8e167306e7 100644
> --- a/hw/intc/xive.c
> +++ b/hw/intc/xive.c
> @@ -765,8 +765,7 @@ Object *xive_tctx_create(Object *cpu, XivePresenter *xptr, Error **errp)
>      object_unref(obj);
>      object_property_set_link(obj, cpu, "cpu", &error_abort);
>      object_property_set_link(obj, OBJECT(xptr), "presenter", &error_abort);
> -    qdev_realize(DEVICE(obj), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(obj), NULL, &local_err)) {
>          goto error;
>      }
>  
> diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
> index f634bcb2d1..ac044afa95 100644
> --- a/hw/isa/piix4.c
> +++ b/hw/isa/piix4.c
> @@ -150,7 +150,6 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
>      PIIX4State *s = PIIX4_PCI_DEVICE(dev);
>      ISABus *isa_bus;
>      qemu_irq *i8259_out_irq;
> -    Error *err = NULL;
>  
>      isa_bus = isa_bus_new(DEVICE(dev), pci_address_space(dev),
>                            pci_address_space_io(dev), errp);
> @@ -183,9 +182,7 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
>  
>      /* RTC */
>      qdev_prop_set_int32(DEVICE(&s->rtc), "base_year", 2000);
> -    qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->rtc), BUS(isa_bus), errp)) {
>          return;
>      }
>      isa_init_irq(ISA_DEVICE(&s->rtc), &s->rtc.irq, RTC_ISA_IRQ);
> diff --git a/hw/microblaze/xlnx-zynqmp-pmu.c b/hw/microblaze/xlnx-zynqmp-pmu.c
> index abebc7e2ef..cd4f3427d8 100644
> --- a/hw/microblaze/xlnx-zynqmp-pmu.c
> +++ b/hw/microblaze/xlnx-zynqmp-pmu.c
> @@ -76,7 +76,6 @@ static void xlnx_zynqmp_pmu_soc_init(Object *obj)
>  static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>  {
>      XlnxZynqMPPMUSoCState *s = XLNX_ZYNQMP_PMU_SOC(dev);
> -    Error *err = NULL;
>  
>      object_property_set_uint(OBJECT(&s->cpu), XLNX_ZYNQMP_PMU_ROM_ADDR,
>                               "base-vectors", &error_abort);
> @@ -96,9 +95,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>      object_property_set_str(OBJECT(&s->cpu), "8.40.b", "version",
>                              &error_abort);
>      object_property_set_uint(OBJECT(&s->cpu), 0, "pvr", &error_abort);
> -    qdev_realize(DEVICE(&s->cpu), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cpu), NULL, errp)) {
>          return;
>      }
>  
> @@ -108,9 +105,7 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_uint(OBJECT(&s->intc), 0xffff, "intc-positive",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->intc), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->intc), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->intc), 0, XLNX_ZYNQMP_PMU_INTC_ADDR);
> diff --git a/hw/mips/cps.c b/hw/mips/cps.c
> index 0d7f3cf673..b4f2306596 100644
> --- a/hw/mips/cps.c
> +++ b/hw/mips/cps.c
> @@ -71,7 +71,6 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>      CPUMIPSState *env;
>      MIPSCPU *cpu;
>      int i;
> -    Error *err = NULL;
>      target_ulong gcr_base;
>      bool itu_present = false;
>      bool saar_present = false;
> @@ -109,9 +108,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>          if (saar_present) {
>              s->itu.saar = &env->CP0_SAAR;
>          }
> -        sysbus_realize(SYS_BUS_DEVICE(&s->itu), &err);
> -        if (err != NULL) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(&s->itu), errp)) {
>              return;
>          }
>  
> @@ -125,9 +122,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                              &error_abort);
>      object_property_set_int(OBJECT(&s->cpc), 1, "vp-start-running",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->cpc), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpc), errp)) {
>          return;
>      }
>  
> @@ -140,9 +135,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                              &error_abort);
>      object_property_set_int(OBJECT(&s->gic), 128, "num-irq",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gic), errp)) {
>          return;
>      }
>  
> @@ -163,9 +156,7 @@ static void mips_cps_realize(DeviceState *dev, Error **errp)
>                               &error_abort);
>      object_property_set_link(OBJECT(&s->gcr), OBJECT(&s->cpc.mr), "cpc",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gcr), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
>          return;
>      }
>  
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 47aa3b0552..0d29d53116 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -524,13 +524,10 @@ static void cuda_reset(DeviceState *dev)
>  static void cuda_realize(DeviceState *dev, Error **errp)
>  {
>      CUDAState *s = CUDA(dev);
> -    Error *err = NULL;
>      SysBusDevice *sbd;
>      struct tm tm;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_cuda), errp)) {
>          return;
>      }
>  
> diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
> index 3251c79f46..7cfe357cc4 100644
> --- a/hw/misc/macio/macio.c
> +++ b/hw/misc/macio/macio.c
> @@ -98,11 +98,8 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
>  {
>      MacIOState *s = MACIO(d);
>      SysBusDevice *sysbus_dev;
> -    Error *err = NULL;
>  
> -    qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->dbdma), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&s->dbdma);
> @@ -116,9 +113,7 @@ static void macio_common_realize(PCIDevice *d, Error **errp)
>      qdev_prop_set_chr(DEVICE(&s->escc), "chrB", serial_hd(1));
>      qdev_prop_set_uint32(DEVICE(&s->escc), "chnBtype", escc_serial);
>      qdev_prop_set_uint32(DEVICE(&s->escc), "chnAtype", escc_serial);
> -    qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->escc), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>  
> @@ -159,9 +154,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
>  
>      qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
>                           s->frequency);
> -    qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
> @@ -176,9 +169,7 @@ static void macio_oldworld_realize(PCIDevice *d, Error **errp)
>      sysbus_connect_irq(sysbus_dev, 1, qdev_get_gpio_in(pic_dev,
>                                                         OLDWORLD_ESCCA_IRQ));
>  
> -    qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(&os->nvram), BUS(&s->macio_bus), errp)) {
>          return;
>      }
>      sysbus_dev = SYS_BUS_DEVICE(&os->nvram);
> @@ -345,9 +336,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>          object_property_set_link(OBJECT(&s->pmu), OBJECT(sysbus_dev), "gpio",
>                                   &error_abort);
>          qdev_prop_set_bit(DEVICE(&s->pmu), "has-adb", ns->has_adb);
> -        qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->pmu), BUS(&s->macio_bus), errp)) {
>              return;
>          }
>          sysbus_dev = SYS_BUS_DEVICE(&s->pmu);
> @@ -363,9 +352,7 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)
>          qdev_prop_set_uint64(DEVICE(&s->cuda), "timebase-frequency",
>                               s->frequency);
>  
> -        qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!qdev_realize(DEVICE(&s->cuda), BUS(&s->macio_bus), errp)) {
>              return;
>          }
>          sysbus_dev = SYS_BUS_DEVICE(&s->cuda);
> diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
> index 41b626c46c..4b0983697c 100644
> --- a/hw/misc/macio/pmu.c
> +++ b/hw/misc/macio/pmu.c
> @@ -741,13 +741,10 @@ static void pmu_reset(DeviceState *dev)
>  static void pmu_realize(DeviceState *dev, Error **errp)
>  {
>      PMUState *s = VIA_PMU(dev);
> -    Error *err = NULL;
>      SysBusDevice *sbd;
>      struct tm tm;
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->mos6522_pmu), errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c
> index 3ec904a55f..d85ca709d9 100644
> --- a/hw/pci-host/pnv_phb3.c
> +++ b/hw/pci-host/pnv_phb3.c
> @@ -990,7 +990,6 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>      PnvPHB3 *phb = PNV_PHB3(dev);
>      PCIHostState *pci = PCI_HOST_BRIDGE(dev);
>      PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
> -    Error *local_err = NULL;
>      int i;
>  
>      if (phb->phb_id >= PNV8_CHIP_PHB3_MAX) {
> @@ -1003,9 +1002,7 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>                                     &error_abort);
>      object_property_set_int(OBJECT(&phb->lsis), PNV_PHB3_NUM_LSI, "nr-irqs",
>                              &error_abort);
> -    qdev_realize(DEVICE(&phb->lsis), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->lsis), NULL, errp)) {
>          return;
>      }
>  
> @@ -1022,18 +1019,14 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp)
>                                     &error_abort);
>      object_property_set_int(OBJECT(&phb->msis), PHB3_MAX_MSI, "nr-irqs",
>                              &error_abort);
> -    qdev_realize(DEVICE(&phb->msis), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->msis), NULL, errp)) {
>          return;
>      }
>  
>      /* Power Bus Common Queue */
>      object_property_set_link(OBJECT(&phb->pbcq), OBJECT(phb), "phb",
>                                     &error_abort);
> -    qdev_realize(DEVICE(&phb->pbcq), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&phb->pbcq), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c
> index 10716d759d..7739fd5984 100644
> --- a/hw/pci-host/pnv_phb4.c
> +++ b/hw/pci-host/pnv_phb4.c
> @@ -1169,7 +1169,6 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
>      PnvPHB4 *phb = PNV_PHB4(dev);
>      PCIHostState *pci = PCI_HOST_BRIDGE(dev);
>      XiveSource *xsrc = &phb->xsrc;
> -    Error *local_err = NULL;
>      int nr_irqs;
>      char name[32];
>  
> @@ -1218,9 +1217,7 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp)
>      }
>      object_property_set_int(OBJECT(xsrc), nr_irqs, "nr-irqs", &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(phb), "xive", &error_fatal);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c
> index 2d634c838e..40f993bd06 100644
> --- a/hw/pci-host/pnv_phb4_pec.c
> +++ b/hw/pci-host/pnv_phb4_pec.c
> @@ -377,7 +377,6 @@ static void pnv_pec_instance_init(Object *obj)
>  static void pnv_pec_realize(DeviceState *dev, Error **errp)
>  {
>      PnvPhb4PecState *pec = PNV_PHB4_PEC(dev);
> -    Error *local_err = NULL;
>      char name[64];
>      int i;
>  
> @@ -390,9 +389,7 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp)
>  
>          object_property_set_int(stk_obj, i, "stack-no", &error_abort);
>          object_property_set_link(stk_obj, OBJECT(pec), "pec", &error_abort);
> -        qdev_realize(DEVICE(stk_obj), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) {
>              return;
>          }
>      }
> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
> index 51bf95b303..5448d101d9 100644
> --- a/hw/ppc/e500.c
> +++ b/hw/ppc/e500.c
> @@ -764,16 +764,13 @@ static DeviceState *ppce500_init_mpic_qemu(PPCE500MachineState *pms,
>  static DeviceState *ppce500_init_mpic_kvm(const PPCE500MachineClass *pmc,
>                                            IrqLines *irqs, Error **errp)
>  {
> -    Error *err = NULL;
>      DeviceState *dev;
>      CPUState *cs;
>  
>      dev = qdev_new(TYPE_KVM_OPENPIC);
>      qdev_prop_set_uint32(dev, "model", pmc->mpic_version);
>  
> -    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
>          object_unparent(OBJECT(dev));
>          return NULL;
>      }
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 8bd03f3b10..392aa138de 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -1137,9 +1137,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>                              "bar", &error_fatal);
>      object_property_set_link(OBJECT(&chip8->psi), OBJECT(chip8->xics),
>                               ICS_PROP_XICS, &error_abort);
> -    qdev_realize(DEVICE(&chip8->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE,
> @@ -1168,9 +1166,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>      /* Create the simplified OCC model */
>      object_property_set_link(OBJECT(&chip8->occ), OBJECT(&chip8->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip8->occ), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->occ), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_regs);
> @@ -1182,9 +1178,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>      /* HOMER */
>      object_property_set_link(OBJECT(&chip8->homer), OBJECT(chip), "chip",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip8->homer), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip8->homer), NULL, errp)) {
>          return;
>      }
>      /* Homer Xscom region */
> @@ -1202,9 +1196,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
>          object_property_set_int(OBJECT(phb), i, "index", &error_fatal);
>          object_property_set_int(OBJECT(phb), chip->chip_id, "chip-id",
>                                  &error_fatal);
> -        sysbus_realize(SYS_BUS_DEVICE(phb), &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!sysbus_realize(SYS_BUS_DEVICE(phb), errp)) {
>              return;
>          }
>  
> @@ -1359,7 +1351,6 @@ static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
>  static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>  {
>      Pnv9Chip *chip9 = PNV9_CHIP(chip);
> -    Error *local_err = NULL;
>      int i, j;
>      int phb_id = 0;
>  
> @@ -1381,9 +1372,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>                                   &error_fatal);
>          object_property_set_link(OBJECT(pec), OBJECT(get_system_memory()),
>                                   "system-memory", &error_abort);
> -        qdev_realize(DEVICE(pec), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(pec), NULL, errp)) {
>              return;
>          }
>  
> @@ -1406,9 +1395,7 @@ static void pnv_chip_power9_phb_realize(PnvChip *chip, Error **errp)
>              object_property_set_int(obj, PNV_PHB4_DEVICE_ID, "device-id",
>                                      &error_fatal);
>              object_property_set_link(obj, OBJECT(stack), "stack", &error_abort);
> -            sysbus_realize(SYS_BUS_DEVICE(obj), &local_err);
> -            if (local_err) {
> -                error_propagate(errp, local_err);
> +            if (!sysbus_realize(SYS_BUS_DEVICE(obj), errp)) {
>                  return;
>              }
>  
> @@ -1466,9 +1453,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>                              "tm-bar", &error_fatal);
>      object_property_set_link(OBJECT(&chip9->xive), OBJECT(chip), "chip",
>                               &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&chip9->xive), errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
> @@ -1477,9 +1462,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* Processor Service Interface (PSI) Host Bridge */
>      object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
>                              "bar", &error_fatal);
> -    qdev_realize(DEVICE(&chip9->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
> @@ -1488,9 +1471,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* LPC */
>      object_property_set_link(OBJECT(&chip9->lpc), OBJECT(&chip9->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->lpc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->lpc), NULL, errp)) {
>          return;
>      }
>      memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip),
> @@ -1502,9 +1483,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* Create the simplified OCC model */
>      object_property_set_link(OBJECT(&chip9->occ), OBJECT(&chip9->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->occ), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->occ), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_regs);
> @@ -1516,9 +1495,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
>      /* HOMER */
>      object_property_set_link(OBJECT(&chip9->homer), OBJECT(chip), "chip",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip9->homer), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip9->homer), NULL, errp)) {
>          return;
>      }
>      /* Homer Xscom region */
> @@ -1598,9 +1575,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>      /* Processor Service Interface (PSI) Host Bridge */
>      object_property_set_int(OBJECT(&chip10->psi), PNV10_PSIHB_BASE(chip),
>                              "bar", &error_fatal);
> -    qdev_realize(DEVICE(&chip10->psi), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip10->psi), NULL, errp)) {
>          return;
>      }
>      pnv_xscom_add_subregion(chip, PNV10_XSCOM_PSIHB_BASE,
> @@ -1609,9 +1584,7 @@ static void pnv_chip_power10_realize(DeviceState *dev, Error **errp)
>      /* LPC */
>      object_property_set_link(OBJECT(&chip10->lpc), OBJECT(&chip10->psi), "psi",
>                               &error_abort);
> -    qdev_realize(DEVICE(&chip10->lpc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&chip10->lpc), NULL, errp)) {
>          return;
>      }
>      memory_region_add_subregion(get_system_memory(), PNV10_LPCM_BASE(chip),
> diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
> index c986c16db1..4724ddf96c 100644
> --- a/hw/ppc/pnv_core.c
> +++ b/hw/ppc/pnv_core.c
> @@ -173,9 +173,7 @@ static void pnv_core_cpu_realize(PnvCore *pc, PowerPCCPU *cpu, Error **errp)
>      Error *local_err = NULL;
>      PnvChipClass *pcc = PNV_CHIP_GET_CLASS(pc->chip);
>  
> -    qdev_realize(DEVICE(cpu), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(cpu), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> index 75b8ae9703..08756a79cd 100644
> --- a/hw/ppc/pnv_psi.c
> +++ b/hw/ppc/pnv_psi.c
> @@ -510,9 +510,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
>          error_propagate(errp, err);
>          return;
>      }
> -    qdev_realize(DEVICE(ics), NULL, &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(DEVICE(ics), NULL, errp)) {
>          return;
>      }
>  
> @@ -842,7 +840,6 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
>  {
>      PnvPsi *psi = PNV_PSI(dev);
>      XiveSource *xsrc = &PNV9_PSI(psi)->source;
> -    Error *local_err = NULL;
>      int i;
>  
>      /* This is the only device with 4k ESB pages */
> @@ -851,9 +848,7 @@ static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
>      object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
>                              &error_fatal);
>      object_property_set_link(OBJECT(xsrc), OBJECT(psi), "xive", &error_abort);
> -    qdev_realize(DEVICE(xsrc), NULL, &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(xsrc), NULL, errp)) {
>          return;
>      }
>  
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 26ad566f42..85330d08a1 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -239,8 +239,7 @@ static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
>      CPUState *cs = CPU(cpu);
>      Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(cpu), NULL, &local_err);
> -    if (local_err) {
> +    if (!qdev_realize(DEVICE(cpu), NULL, &local_err)) {
>          goto error;
>      }
>  
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 897bf98587..a61d39ad71 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -302,7 +302,6 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
>      spapr_irq_msi_init(spapr);
>  
>      if (spapr->irq->xics) {
> -        Error *local_err = NULL;
>          Object *obj;
>  
>          obj = object_new(TYPE_ICS_SPAPR);
> @@ -311,9 +310,7 @@ void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
>          object_property_set_link(obj, OBJECT(spapr), ICS_PROP_XICS,
>                                   &error_abort);
>          object_property_set_int(obj, smc->nr_xirqs, "nr-irqs", &error_abort);
> -        qdev_realize(DEVICE(obj), NULL, &local_err);
> -        if (local_err) {
> -            error_propagate(errp, local_err);
> +        if (!qdev_realize(DEVICE(obj), NULL, errp)) {
>              return;
>          }
>  
> diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
> index 19223e4c29..d40f065a6a 100644
> --- a/hw/riscv/opentitan.c
> +++ b/hw/riscv/opentitan.c
> @@ -106,7 +106,6 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
>      MachineState *ms = MACHINE(qdev_get_machine());
>      LowRISCIbexSoCState *s = RISCV_IBEX_SOC(dev_soc);
>      MemoryRegion *sys_mem = get_system_memory();
> -    Error *err = NULL;
>  
>      object_property_set_str(OBJECT(&s->cpus), ms->cpu_type, "cpu-type",
>                              &error_abort);
> @@ -127,18 +126,14 @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
>                                  &s->flash_mem);
>  
>      /* PLIC */
> -    sysbus_realize(SYS_BUS_DEVICE(&s->plic), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->plic), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->plic), 0, memmap[IBEX_PLIC].base);
>  
>      /* UART */
>      qdev_prop_set_chr(DEVICE(&(s->uart)), "chardev", serial_hd(0));
> -    sysbus_realize(SYS_BUS_DEVICE(&s->uart), &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->uart), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->uart), 0, memmap[IBEX_UART].base);
> diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
> index 0cb66ac4e2..416adfcce0 100644
> --- a/hw/riscv/sifive_e.c
> +++ b/hw/riscv/sifive_e.c
> @@ -185,8 +185,6 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      const struct MemmapEntry *memmap = sifive_e_memmap;
> -    Error *err = NULL;
> -
>      SiFiveESoCState *s = RISCV_E_SOC(dev);
>      MemoryRegion *sys_mem = get_system_memory();
>  
> @@ -221,9 +219,7 @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
>  
>      /* GPIO */
>  
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gpio), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
>          return;
>      }
>  
> diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
> index a1d2edfe13..12cd91b227 100644
> --- a/hw/riscv/sifive_u.c
> +++ b/hw/riscv/sifive_u.c
> @@ -608,7 +608,6 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
>      char *plic_hart_config;
>      size_t plic_hart_config_len;
>      int i;
> -    Error *err = NULL;
>      NICInfo *nd = &nd_table[0];
>  
>      sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
> @@ -710,9 +709,7 @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
>      }
>      object_property_set_int(OBJECT(&s->gem), GEM_REVISION, "revision",
>                              &error_abort);
> -    sysbus_realize(SYS_BUS_DEVICE(&s->gem), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem), errp)) {
>          return;
>      }
>      sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem), 0, memmap[SIFIVE_U_GEM].base);
> diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
> index 164b1fd295..645b4080c5 100644
> --- a/hw/s390x/event-facility.c
> +++ b/hw/s390x/event-facility.c
> @@ -442,18 +442,13 @@ static void init_event_facility(Object *obj)
>  static void realize_event_facility(DeviceState *dev, Error **errp)
>  {
>      SCLPEventFacility *event_facility = EVENT_FACILITY(dev);
> -    Error *local_err = NULL;
>  
> -    qdev_realize(DEVICE(&event_facility->quiesce),
> -                 BUS(&event_facility->sbus), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&event_facility->quiesce),
> +                      BUS(&event_facility->sbus), errp)) {
>          return;
>      }
> -    qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> -                 BUS(&event_facility->sbus), &local_err);
> -    if (local_err) {
> -        error_propagate(errp, local_err);
> +    if (!qdev_realize(DEVICE(&event_facility->cpu_hotplug),
> +                      BUS(&event_facility->sbus), errp)) {
>          qdev_unrealize(DEVICE(&event_facility->quiesce));
>          return;
>      }
> diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
> index 142e52a8ff..0517901024 100644
> --- a/hw/s390x/s390-pci-bus.c
> +++ b/hw/s390x/s390-pci-bus.c
> @@ -829,8 +829,7 @@ static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
>                                  "zPCI device could not be created: ");
>          return NULL;
>      }
> -    qdev_realize_and_unref(dev, BUS(s->bus), &local_err);
> -    if (local_err) {
> +    if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) {
>          object_unparent(OBJECT(dev));
>          error_propagate_prepend(errp, local_err,
>                                  "zPCI device could not be created: ");
> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
> index d39f6d7785..03364343eb 100644
> --- a/hw/s390x/sclp.c
> +++ b/hw/s390x/sclp.c
> @@ -338,8 +338,7 @@ static void sclp_realize(DeviceState *dev, Error **errp)
>       * as we can't find a fitting bus via the qom tree, we have to add the
>       * event facility to the sysbus, so e.g. a sclp console can be created.
>       */
> -    sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err);
> -    if (err) {
> +    if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err)) {
>          goto out;
>      }
>  
> diff --git a/hw/s390x/virtio-ccw-crypto.c b/hw/s390x/virtio-ccw-crypto.c
> index ca6753bff3..438626cf37 100644
> --- a/hw/s390x/virtio-ccw-crypto.c
> +++ b/hw/s390x/virtio-ccw-crypto.c
> @@ -19,11 +19,8 @@ static void virtio_ccw_crypto_realize(VirtioCcwDevice *ccw_dev, Error **errp)
>  {
>      VirtIOCryptoCcw *dev = VIRTIO_CRYPTO_CCW(ccw_dev);
>      DeviceState *vdev = DEVICE(&dev->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/s390x/virtio-ccw-rng.c b/hw/s390x/virtio-ccw-rng.c
> index 4077160f49..aefe6b1b51 100644
> --- a/hw/s390x/virtio-ccw-rng.c
> +++ b/hw/s390x/virtio-ccw-rng.c
> @@ -20,11 +20,8 @@ static void virtio_ccw_rng_realize(VirtioCcwDevice *ccw_dev, Error **errp)
>  {
>      VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev);
>      DeviceState *vdev = DEVICE(&dev->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&ccw_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&ccw_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index b878a08080..f3d2d63de8 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -293,9 +293,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk,
>      qdev_prop_set_enum(dev, "rerror", rerror);
>      qdev_prop_set_enum(dev, "werror", werror);
>  
> -    qdev_realize_and_unref(dev, &bus->qbus, &err);
> -    if (err != NULL) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
>          object_unparent(OBJECT(dev));
>          return NULL;
>      }
> diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
> index 538d3bad3d..ad0bb6fdb4 100644
> --- a/hw/sd/aspeed_sdhci.c
> +++ b/hw/sd/aspeed_sdhci.c
> @@ -145,9 +145,7 @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
>              return;
>          }
>  
> -        sysbus_realize(sbd_slot, &err);
> -        if (err) {
> -            error_propagate(errp, err);
> +        if (!sysbus_realize(sbd_slot, errp)) {
>              return;
>          }
>  
> diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
> index 25cec2ddea..0df0edb51d 100644
> --- a/hw/sd/ssi-sd.c
> +++ b/hw/sd/ssi-sd.c
> @@ -266,8 +266,7 @@ static void ssi_sd_realize(SSISlave *d, Error **errp)
>          goto fail;
>      }
>  
> -    qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err);
> -    if (err) {
> +    if (!qdev_realize_and_unref(carddev, BUS(&s->sdbus), &err)) {
>          goto fail;
>      }
>  
> diff --git a/hw/usb/bus.c b/hw/usb/bus.c
> index 957559b18d..ba27afe9f2 100644
> --- a/hw/usb/bus.c
> +++ b/hw/usb/bus.c
> @@ -704,8 +704,7 @@ USBDevice *usbdevice_create(const char *cmdline)
>          error_report("Failed to create USB device '%s'", f->name);
>          return NULL;
>      }
> -    usb_realize_and_unref(dev, bus, &err);
> -    if (err) {
> +    if (!usb_realize_and_unref(dev, bus, &err)) {
>          error_reportf_err(err, "Failed to initialize USB device '%s': ",
>                            f->name);
>          object_unparent(OBJECT(dev));
> diff --git a/hw/virtio/virtio-rng-pci.c b/hw/virtio/virtio-rng-pci.c
> index cf1afb47a6..b6cb0199a3 100644
> --- a/hw/virtio/virtio-rng-pci.c
> +++ b/hw/virtio/virtio-rng-pci.c
> @@ -34,11 +34,8 @@ static void virtio_rng_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
>  {
>      VirtIORngPCI *vrng = VIRTIO_RNG_PCI(vpci_dev);
>      DeviceState *vdev = DEVICE(&vrng->vdev);
> -    Error *err = NULL;
>  
> -    qdev_realize(vdev, BUS(&vpci_dev->bus), &err);
> -    if (err) {
> -        error_propagate(errp, err);
> +    if (!qdev_realize(vdev, BUS(&vpci_dev->bus), errp)) {
>          return;
>      }
>  
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 22da107484..13a13a811a 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -676,8 +676,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
>      }
>  
>      dev->opts = opts;
> -    qdev_realize(DEVICE(dev), bus, &err);
> -    if (err != NULL) {
> +    if (!qdev_realize(DEVICE(dev), bus, &err)) {
>          dev->opts = NULL;
>          goto err_del_dev;
>      }



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

* Re: [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void
  2020-06-24 16:43 ` [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void Markus Armbruster
  2020-06-24 19:55   ` Eric Blake
@ 2020-06-29 11:15   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29 11:15 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> See recent commit "error: Document Error API usage rules" for
> rationale.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>

Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>


-- 
Best regards,
Vladimir


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

* Re: [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle
  2020-06-24 16:43 ` [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle Markus Armbruster
  2020-06-24 20:08   ` Eric Blake
@ 2020-06-29 13:58   ` Vladimir Sementsov-Ogievskiy
  1 sibling, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-06-29 13:58 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: pbonzini, berrange, ehabkost, qemu-block, peter.maydell

24.06.2020 19:43, Markus Armbruster wrote:
> The previous commit enables conversion of
> 
>      foo(..., &err);
>      if (err) {
>          ...
>      }
> 
> to
> 
>      if (!foo(..., &err)) {
>          ...
>      }
> 
> for QemuOpts functions that now return true / false on success /
> error.  Coccinelle script:
> 
>      @@
>      identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, qemu_opts_validate};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      identifier errp;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, errp, args2)) {
> 	       ... when != err
>      -	   error_propagate(errp, err);
> 	       ...
> 	   }
> 
>      @@
>      identifier fun = {opts_do_parse, parse_option_bool, parse_option_number, parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set, qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict, qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set, qemu_opts_validate};
>      expression list args, args2;
>      typedef Error;
>      Error *err;
>      @@
>      -      fun(args, &err, args2);
>      -      if (err) {
>      +      if (!fun(args, &err, args2)) {
> 	       ...
> 	   }
> 
> Eliminate error_propagate() that are now unnecessary.  Delete @err
> that are now unused.  Tidy up line breaks and whitespace.
> 
> Signed-off-by: Markus Armbruster<armbru@redhat.com>


Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

-- 
Best regards,
Vladimir


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

* Re: [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-25 15:09     ` Markus Armbruster
@ 2020-06-29 14:38       ` Philippe Mathieu-Daudé
  2020-07-01  9:15         ` Markus Armbruster
  0 siblings, 1 reply; 157+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-06-29 14:38 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

On 6/25/20 5:09 PM, Markus Armbruster wrote:
> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
> 
>> On 6/24/20 6:43 PM, Markus Armbruster wrote:
>>> Don't handle object_property_get_link() failure that can't happen
>>> unless the programmer screwed up, pass &error_abort.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>  hw/arm/bcm2835_peripherals.c |  7 +------
>>>  hw/arm/bcm2836.c             |  7 +------
>>>  hw/display/bcm2835_fb.c      |  8 +-------
>>>  hw/dma/bcm2835_dma.c         |  9 +--------
>>>  hw/gpio/bcm2835_gpio.c       | 15 ++-------------
>>>  hw/intc/nios2_iic.c          |  8 +-------
>>>  hw/misc/bcm2835_mbox.c       |  9 +--------
>>>  hw/misc/bcm2835_property.c   | 17 ++---------------
>>>  hw/usb/hcd-dwc2.c            |  9 +--------
>>>  9 files changed, 11 insertions(+), 78 deletions(-)
>>>
>>> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
>>> index 8313410ffe..3c40bda91e 100644
>>> --- a/hw/arm/bcm2835_peripherals.c
>>> +++ b/hw/arm/bcm2835_peripherals.c
>>> @@ -134,12 +134,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>>>      uint64_t ram_size, vcram_size;
>>>      int n;
>>>  
>>> -    obj = object_property_get_link(OBJECT(dev), "ram", &err);
>>> -    if (obj == NULL) {
>>> -        error_setg(errp, "%s: required ram link not found: %s",
>>> -                   __func__, error_get_pretty(err));
>>> -        return;
>>> -    }
>>> +    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
>> [...]
>>
>> Should we now add an assert(errp) in object_property_get_link()?
>> Basically this would force forks to adapt their code when
>> rebasing.
> 
> Functions should not place additional restrictions @errp arguments
> without a compelling reason.

My compelling reason is you spent quite some time cleaning, then we'll
merge old patches based on examples previous your cleanup, and either
you'll have to clean again, or the codebase will get inconsistent again.

> What if you want genuinely don't need the
> error details when object_property_get_link() fails?  Passing null is
> better than passing &err only to error_free(err).

So what about:

-- >8 --
--- a/qom/object.c
+++ b/qom/object.c
@@ -1372,9 +1372,11 @@ void object_property_set_link(Object *obj, Object
*value,
 Object *object_property_get_link(Object *obj, const char *name,
                                  Error **errp)
 {
-    char *str = object_property_get_str(obj, name, errp);
+    char *str;
     Object *target = NULL;

+    assert(errp == NULL || errp == &error_abort || errp == &error_fatal);
+    str = object_property_get_str(obj, name, errp);
     if (str && *str) {
         target = object_resolve_path(str, NULL);
         if (!target) {
---

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



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

* Re: [PATCH 10/46] qemu-option: Check return value instead of @err where convenient
  2020-06-29  9:11   ` Vladimir Sementsov-Ogievskiy
@ 2020-07-01  8:02     ` Markus Armbruster
  2020-07-02  9:28       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 1 reply; 157+ messages in thread
From: Markus Armbruster @ 2020-07-01  8:02 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Convert uses like
>>
>>      opts = qemu_opts_create(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      opts = qemu_opts_create(..., &err);
>>      if (!opts) {
>>          ...
>>      }
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   block/parallels.c  |  4 ++--
>>   blockdev.c         |  5 ++---
>>   qdev-monitor.c     |  6 ++----
>>   util/qemu-config.c | 10 ++++------
>>   util/qemu-option.c | 12 ++++--------
>>   5 files changed, 14 insertions(+), 23 deletions(-)
>>
>> diff --git a/block/parallels.c b/block/parallels.c
>> index 860dbb80a2..b15c9ac28d 100644
>> --- a/block/parallels.c
>> +++ b/block/parallels.c
>> @@ -823,8 +823,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
>>           }
>>       }
>>   -    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0,
>> &local_err);
>> -    if (local_err != NULL) {
>> +    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
>> +    if (!opts) {
>>           goto fail_options;
>>       }
>
> Honestly, I don't like this hunk. as already complicated code (crossing gotos) becomes more
> complicated (add one more pattern to fail_options path: no-op error_propagate).
>
> At least, we'll need a follow-up patch, refactoring parallels_open() to drop "fail_options"
> label completely.

For what it's worth, this is how it looks at the end of the series:

    static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
                              Error **errp)
    {
        BDRVParallelsState *s = bs->opaque;
        ParallelsHeader ph;
        int ret, size, i;
        QemuOpts *opts = NULL;
        Error *local_err = NULL;
        char *buf;

        bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
                                   BDRV_CHILD_IMAGE, false, errp);
        if (!bs->file) {
            return -EINVAL;
        }

        ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph));
        if (ret < 0) {
            goto fail;
        }

        bs->total_sectors = le64_to_cpu(ph.nb_sectors);

        if (le32_to_cpu(ph.version) != HEADER_VERSION) {
            goto fail_format;
        }
        if (!memcmp(ph.magic, HEADER_MAGIC, 16)) {
            s->off_multiplier = 1;
            bs->total_sectors = 0xffffffff & bs->total_sectors;
        } else if (!memcmp(ph.magic, HEADER_MAGIC2, 16)) {
            s->off_multiplier = le32_to_cpu(ph.tracks);
        } else {
            goto fail_format;
        }

        s->tracks = le32_to_cpu(ph.tracks);
        if (s->tracks == 0) {
            error_setg(errp, "Invalid image: Zero sectors per track");
            ret = -EINVAL;
            goto fail;
        }
        if (s->tracks > INT32_MAX/513) {
            error_setg(errp, "Invalid image: Too big cluster");
            ret = -EFBIG;
            goto fail;
        }

        s->bat_size = le32_to_cpu(ph.bat_entries);
        if (s->bat_size > INT_MAX / sizeof(uint32_t)) {
            error_setg(errp, "Catalog too large");
            ret = -EFBIG;
            goto fail;
        }

        size = bat_entry_off(s->bat_size);
        s->header_size = ROUND_UP(size, bdrv_opt_mem_align(bs->file->bs));
        s->header = qemu_try_blockalign(bs->file->bs, s->header_size);
        if (s->header == NULL) {
            ret = -ENOMEM;
            goto fail;
        }
        s->data_end = le32_to_cpu(ph.data_off);
        if (s->data_end == 0) {
            s->data_end = ROUND_UP(bat_entry_off(s->bat_size), BDRV_SECTOR_SIZE);
        }
        if (s->data_end < s->header_size) {
            /* there is not enough unused space to fit to block align between BAT
               and actual data. We can't avoid read-modify-write... */
            s->header_size = size;
        }

        ret = bdrv_pread(bs->file, 0, s->header, s->header_size);
        if (ret < 0) {
            goto fail;
        }
        s->bat_bitmap = (uint32_t *)(s->header + 1);

        for (i = 0; i < s->bat_size; i++) {
            int64_t off = bat2sect(s, i);
            if (off >= s->data_end) {
                s->data_end = off + s->tracks;
            }
        }

        if (le32_to_cpu(ph.inuse) == HEADER_INUSE_MAGIC) {
            /* Image was not closed correctly. The check is mandatory */
            s->header_unclean = true;
            if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_CHECK)) {
                error_setg(errp, "parallels: Image was not closed correctly; "
                           "cannot be opened read/write");
                ret = -EACCES;
                goto fail;
            }
        }

        opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
        if (!opts) {
            goto fail_options;
        }

        if (!qemu_opts_absorb_qdict(opts, options, errp)) {
            goto fail_options;
        }

        s->prealloc_size =
            qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
        s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
        buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
        /* prealloc_mode can be downgraded later during allocate_clusters */
        s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,
                                           PRL_PREALLOC_MODE_FALLOCATE,
                                           &local_err);
        g_free(buf);
        if (local_err != NULL) {
            error_propagate(errp, local_err);
            goto fail_options;
        }

        if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_INACTIVE)) {
            s->header->inuse = cpu_to_le32(HEADER_INUSE_MAGIC);
            ret = parallels_update_header(bs);
            if (ret < 0) {
                goto fail;
            }
        }

        s->bat_dirty_block = 4 * qemu_real_host_page_size;
        s->bat_dirty_bmap =
            bitmap_new(DIV_ROUND_UP(s->header_size, s->bat_dirty_block));

        /* Disable migration until bdrv_invalidate_cache method is added */
        error_setg(&s->migration_blocker, "The Parallels format used by node '%s' "
                   "does not support live migration",
                   bdrv_get_device_or_node_name(bs));
        ret = migrate_add_blocker(s->migration_blocker, errp);
        if (ret < 0) {
            error_free(s->migration_blocker);
            goto fail;
        }
        qemu_co_mutex_init(&s->lock);
        return 0;

    fail_format:
        error_setg(errp, "Image not in Parallels format");
    fail_options:
        ret = -EINVAL;
    fail:
        qemu_vfree(s->header);
        return ret;
    }

Care to suggest further improvements?

> Still, it should work and the rest is fine, so:
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Thanks!



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

* Re: [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar
  2020-06-29  9:47     ` Vladimir Sementsov-Ogievskiy
@ 2020-07-01  8:07       ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-01  8:07 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 29.06.2020 12:36, Vladimir Sementsov-Ogievskiy wrote:
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> This is to make the next commit easier to review.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>   util/qemu-option.c | 32 ++++++++++++++++++--------------
>>>   1 file changed, 18 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>>> index 6119f971a4..9941005c91 100644
>>> --- a/util/qemu-option.c
>>> +++ b/util/qemu-option.c
>>> @@ -270,6 +270,7 @@ static void qemu_opt_del_all(QemuOpts *opts, const char *name)
>>>   const char *qemu_opt_get(QemuOpts *opts, const char *name)
>>>   {
>>>       QemuOpt *opt;
>>> +    const QemuOptDesc *desc;
>> Honestly, I don't see how this hunk helps with the following patch, which is simple anyway.
>> Keeping desc variable scope smaller seems better for me, as well as further scope of
>> def_val. (Still, keep my r-b if you don't want to change it).
>>
>
> Aha, I see, we have more similar patterns and you want them to look similarly. Still, it's
> better to keep scope of variable smaller. May be a follow-up.

The variable goes away in the next patch.

I don't expect you to read PATCH n+1 before reviewing PATCH n :)



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

* Re: [PATCH 14/46] qemu-option: Factor out helper opt_create()
  2020-06-29 10:09   ` Vladimir Sementsov-Ogievskiy
@ 2020-07-01  8:13     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-01  8:13 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> There is just one use so far.  The next commit will add more.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>   util/qemu-option.c | 27 ++++++++++++++++++---------
>>   1 file changed, 18 insertions(+), 9 deletions(-)
>>
>> diff --git a/util/qemu-option.c b/util/qemu-option.c
>> index d9293814b4..3cdf0c0800 100644
>> --- a/util/qemu-option.c
>> +++ b/util/qemu-option.c
>> @@ -502,6 +502,23 @@ int qemu_opt_unset(QemuOpts *opts, const char *name)
>>       }
>>   }
>>   +static QemuOpt *opt_create(QemuOpts *opts, const char *name, char
>> *value,
>> +                           bool prepend)
>> +{
>> +    QemuOpt *opt = g_malloc0(sizeof(*opt));
>
> I'd prefer g_new0(QemuOpt, 1)

I generally prefer g_new0() over g_malloc0(), too.  But the pattern

    lhs = g_malloc0(sizeof(*lhs))

is fine with me, provided sizeof(*lhs) is at least as readable as the
type of *lhs.  Looks like a wash here, so I'm refraining from messing
with the moved code.

> anyway:
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Thanks!



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

* Re: [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure
  2020-06-29 10:37   ` Vladimir Sementsov-Ogievskiy
@ 2020-07-01  9:01     ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-01  9:01 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> opt_set() frees its argument @value on failure.  Slightly unclean;
>> functions ideally do nothing on failure.
>>
>> To tidy this up, move opt_create() from opt_set() into its callers,
>> along with the cleanup.
>
> Hmm, let me think a bit..
>
> So, prior to this patch:
>
> opt_set gets name/value pair and sets the option in opts object, it
> seems absolutely obvious and standard behavior for Map-like object.
>
> The fact that for setting an option we create a QemuOpt object, and
> somehow register it inside opts object is an implementation detail.

You explain behavior on success.  The issue is behavior on failure.

> after the patch:
>
> opt_set gets opt object, which is already registered in opts. So,
> it seems like option is "partly" set already, and opt_set only
> finalize the processing.

Yes, opt_set() becomes a bit of a misnomer: it doesn't add a QemuOpt to
@opts, it validates a QemuOpt against its key's description, if @opts
has descriptions.

Hmm, opt_set() is now almost identical to qemu_opts_validate()'s loop
body.  Perhaps I can de-duplicate.

> And, as opt_set() only finalize the "set" operation, on opt_set
> failure we need additional roll-back of "set" operation first step.
>
> Additional fact, indirectly showing that something is unclear here
> is that we pass "opts" to opt_set twice: as "opts" parameter and
> inside opt: (opt->opts must be the same, assertion won't hurt if
> you decide to keep the patch).

Valid point.

> =====
>
> Semantics before the patch seems clearer to me.
>
> To improve the situation around "value", we can just g_strdup it
> in opt_create as well as "name" argument (and use const char*
> type for "value" argument as well)

We don't strdup() there because opts_do_parse() extracts the value with
get_opt_name(), which strdup()s it.  strdup()ing it some more isn't
wrong, I just dislike it.

Let me try the de-duplication, and then we'll see whether you still
dislike the patch.



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

* Re: [PATCH 34/46] qom: Don't handle impossible object_property_get_link() failure
  2020-06-29 14:38       ` Philippe Mathieu-Daudé
@ 2020-07-01  9:15         ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-01  9:15 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

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

> On 6/25/20 5:09 PM, Markus Armbruster wrote:
>> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
>> 
>>> On 6/24/20 6:43 PM, Markus Armbruster wrote:
>>>> Don't handle object_property_get_link() failure that can't happen
>>>> unless the programmer screwed up, pass &error_abort.
>>>>
>>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>>> ---
>>>>  hw/arm/bcm2835_peripherals.c |  7 +------
>>>>  hw/arm/bcm2836.c             |  7 +------
>>>>  hw/display/bcm2835_fb.c      |  8 +-------
>>>>  hw/dma/bcm2835_dma.c         |  9 +--------
>>>>  hw/gpio/bcm2835_gpio.c       | 15 ++-------------
>>>>  hw/intc/nios2_iic.c          |  8 +-------
>>>>  hw/misc/bcm2835_mbox.c       |  9 +--------
>>>>  hw/misc/bcm2835_property.c   | 17 ++---------------
>>>>  hw/usb/hcd-dwc2.c            |  9 +--------
>>>>  9 files changed, 11 insertions(+), 78 deletions(-)
>>>>
>>>> diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
>>>> index 8313410ffe..3c40bda91e 100644
>>>> --- a/hw/arm/bcm2835_peripherals.c
>>>> +++ b/hw/arm/bcm2835_peripherals.c
>>>> @@ -134,12 +134,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
>>>>      uint64_t ram_size, vcram_size;
>>>>      int n;
>>>>  
>>>> -    obj = object_property_get_link(OBJECT(dev), "ram", &err);
>>>> -    if (obj == NULL) {
>>>> -        error_setg(errp, "%s: required ram link not found: %s",
>>>> -                   __func__, error_get_pretty(err));
>>>> -        return;
>>>> -    }
>>>> +    obj = object_property_get_link(OBJECT(dev), "ram", &error_abort);
>>> [...]
>>>
>>> Should we now add an assert(errp) in object_property_get_link()?
>>> Basically this would force forks to adapt their code when
>>> rebasing.
>> 
>> Functions should not place additional restrictions @errp arguments
>> without a compelling reason.
>
> My compelling reason is you spent quite some time cleaning, then we'll
> merge old patches based on examples previous your cleanup, and either
> you'll have to clean again, or the codebase will get inconsistent again.

We might also merge patches that ignore errors for perfectly sane
reasons.  We'll then debug the crash, and take out the assertion again.

>> What if you want genuinely don't need the
>> error details when object_property_get_link() fails?  Passing null is
>> better than passing &err only to error_free(err).
>
> So what about:
>
> -- >8 --
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1372,9 +1372,11 @@ void object_property_set_link(Object *obj, Object
> *value,
>  Object *object_property_get_link(Object *obj, const char *name,
>                                   Error **errp)
>  {
> -    char *str = object_property_get_str(obj, name, errp);
> +    char *str;
>      Object *target = NULL;
>
> +    assert(errp == NULL || errp == &error_abort || errp == &error_fatal);
> +    str = object_property_get_str(obj, name, errp);
>      if (str && *str) {
>          target = object_resolve_path(str, NULL);
>          if (!target) {
> ---

Consider an @obj that comes in two flavours, one with and one without
the link.  Code handles both, but we still want the Error object for
tracing purposes:

    linked_obj = object_property_get_link(obj, "some-link-prop", &err);
    if (!linked_obj) {
        char *obj_name = object_get_canonical_path_component(obj);
        trace_frob_get_som_link_prop_failed(obj_name, error_get_pretty(err));
        g_free(obj_name);
        error_free(err);
    }

Such use of Error objects just for tracing exists in the tree already.

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



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

* Re: [PATCH 10/46] qemu-option: Check return value instead of @err where convenient
  2020-07-01  8:02     ` Markus Armbruster
@ 2020-07-02  9:28       ` Vladimir Sementsov-Ogievskiy
  0 siblings, 0 replies; 157+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2020-07-02  9:28 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

01.07.2020 11:02, Markus Armbruster wrote:
> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
> 
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> Convert uses like
>>>
>>>       opts = qemu_opts_create(..., &err);
>>>       if (err) {
>>>           ...
>>>       }
>>>
>>> to
>>>
>>>       opts = qemu_opts_create(..., &err);
>>>       if (!opts) {
>>>           ...
>>>       }
>>>
>>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>>> that are now unused.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>    block/parallels.c  |  4 ++--
>>>    blockdev.c         |  5 ++---
>>>    qdev-monitor.c     |  6 ++----
>>>    util/qemu-config.c | 10 ++++------
>>>    util/qemu-option.c | 12 ++++--------
>>>    5 files changed, 14 insertions(+), 23 deletions(-)
>>>
>>> diff --git a/block/parallels.c b/block/parallels.c
>>> index 860dbb80a2..b15c9ac28d 100644
>>> --- a/block/parallels.c
>>> +++ b/block/parallels.c
>>> @@ -823,8 +823,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
>>>            }
>>>        }
>>>    -    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0,
>>> &local_err);
>>> -    if (local_err != NULL) {
>>> +    opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
>>> +    if (!opts) {
>>>            goto fail_options;
>>>        }
>>
>> Honestly, I don't like this hunk. as already complicated code (crossing gotos) becomes more
>> complicated (add one more pattern to fail_options path: no-op error_propagate).
>>
>> At least, we'll need a follow-up patch, refactoring parallels_open() to drop "fail_options"
>> label completely.
> 
> For what it's worth, this is how it looks at the end of the series:
> 
>      static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
>                                Error **errp)
>      {
>          BDRVParallelsState *s = bs->opaque;
>          ParallelsHeader ph;
>          int ret, size, i;
>          QemuOpts *opts = NULL;
>          Error *local_err = NULL;
>          char *buf;
> 
>          bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
>                                     BDRV_CHILD_IMAGE, false, errp);
>          if (!bs->file) {
>              return -EINVAL;
>          }
> 
>          ret = bdrv_pread(bs->file, 0, &ph, sizeof(ph));
>          if (ret < 0) {
>              goto fail;
>          }
> 
>          bs->total_sectors = le64_to_cpu(ph.nb_sectors);
> 
>          if (le32_to_cpu(ph.version) != HEADER_VERSION) {
>              goto fail_format;
>          }
>          if (!memcmp(ph.magic, HEADER_MAGIC, 16)) {
>              s->off_multiplier = 1;
>              bs->total_sectors = 0xffffffff & bs->total_sectors;
>          } else if (!memcmp(ph.magic, HEADER_MAGIC2, 16)) {
>              s->off_multiplier = le32_to_cpu(ph.tracks);
>          } else {
>              goto fail_format;
>          }
> 
>          s->tracks = le32_to_cpu(ph.tracks);
>          if (s->tracks == 0) {
>              error_setg(errp, "Invalid image: Zero sectors per track");
>              ret = -EINVAL;
>              goto fail;
>          }
>          if (s->tracks > INT32_MAX/513) {
>              error_setg(errp, "Invalid image: Too big cluster");
>              ret = -EFBIG;
>              goto fail;
>          }
> 
>          s->bat_size = le32_to_cpu(ph.bat_entries);
>          if (s->bat_size > INT_MAX / sizeof(uint32_t)) {
>              error_setg(errp, "Catalog too large");
>              ret = -EFBIG;
>              goto fail;
>          }
> 
>          size = bat_entry_off(s->bat_size);
>          s->header_size = ROUND_UP(size, bdrv_opt_mem_align(bs->file->bs));
>          s->header = qemu_try_blockalign(bs->file->bs, s->header_size);
>          if (s->header == NULL) {
>              ret = -ENOMEM;
>              goto fail;
>          }
>          s->data_end = le32_to_cpu(ph.data_off);
>          if (s->data_end == 0) {
>              s->data_end = ROUND_UP(bat_entry_off(s->bat_size), BDRV_SECTOR_SIZE);
>          }
>          if (s->data_end < s->header_size) {
>              /* there is not enough unused space to fit to block align between BAT
>                 and actual data. We can't avoid read-modify-write... */
>              s->header_size = size;
>          }
> 
>          ret = bdrv_pread(bs->file, 0, s->header, s->header_size);
>          if (ret < 0) {
>              goto fail;
>          }
>          s->bat_bitmap = (uint32_t *)(s->header + 1);
> 
>          for (i = 0; i < s->bat_size; i++) {
>              int64_t off = bat2sect(s, i);
>              if (off >= s->data_end) {
>                  s->data_end = off + s->tracks;
>              }
>          }
> 
>          if (le32_to_cpu(ph.inuse) == HEADER_INUSE_MAGIC) {
>              /* Image was not closed correctly. The check is mandatory */
>              s->header_unclean = true;
>              if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_CHECK)) {
>                  error_setg(errp, "parallels: Image was not closed correctly; "
>                             "cannot be opened read/write");
>                  ret = -EACCES;
>                  goto fail;
>              }
>          }
> 
>          opts = qemu_opts_create(&parallels_runtime_opts, NULL, 0, errp);
>          if (!opts) {
>              goto fail_options;
>          }
> 
>          if (!qemu_opts_absorb_qdict(opts, options, errp)) {
>              goto fail_options;
>          }
> 
>          s->prealloc_size =
>              qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
>          s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
>          buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
>          /* prealloc_mode can be downgraded later during allocate_clusters */
>          s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,
>                                             PRL_PREALLOC_MODE_FALLOCATE,
>                                             &local_err);
>          g_free(buf);
>          if (local_err != NULL) {
>              error_propagate(errp, local_err);
>              goto fail_options;
>          }
> 
>          if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_INACTIVE)) {
>              s->header->inuse = cpu_to_le32(HEADER_INUSE_MAGIC);
>              ret = parallels_update_header(bs);
>              if (ret < 0) {
>                  goto fail;
>              }
>          }
> 
>          s->bat_dirty_block = 4 * qemu_real_host_page_size;
>          s->bat_dirty_bmap =
>              bitmap_new(DIV_ROUND_UP(s->header_size, s->bat_dirty_block));
> 
>          /* Disable migration until bdrv_invalidate_cache method is added */
>          error_setg(&s->migration_blocker, "The Parallels format used by node '%s' "
>                     "does not support live migration",
>                     bdrv_get_device_or_node_name(bs));
>          ret = migrate_add_blocker(s->migration_blocker, errp);
>          if (ret < 0) {
>              error_free(s->migration_blocker);
>              goto fail;
>          }
>          qemu_co_mutex_init(&s->lock);
>          return 0;
> 
>      fail_format:
>          error_setg(errp, "Image not in Parallels format");
>      fail_options:
>          ret = -EINVAL;
>      fail:
>          qemu_vfree(s->header);
>          return ret;
>      }
> 
> Care to suggest further improvements?

Looks good, no crossing gotos neither no-op error propagation, nothig to do then. Thanks!

> 
>> Still, it should work and the rest is fine, so:
>> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> 
> Thanks!
> 


-- 
Best regards,
Vladimir


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

* Re: [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure
  2020-06-25 15:05     ` Markus Armbruster
@ 2020-07-02 12:11       ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-02 12:11 UTC (permalink / raw)
  To: Eric Blake
  Cc: peter.maydell, vsementsov, berrange, ehabkost, qemu-block,
	qemu-devel, pbonzini

Markus Armbruster <armbru@redhat.com> writes:

> Eric Blake <eblake@redhat.com> writes:
>
>> On 6/24/20 11:43 AM, Markus Armbruster wrote:
>>> Pass &error_abort instead of NULL where the returned value is
>>> dereferenced or asserted to be non-null.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>
>>> @@ -63,8 +64,8 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
>>>           return -1;
>>>       }
>>>   -    parent_mr = object_property_get_link(OBJECT(sbdev_mr),
>>> "container", NULL);
>>> -
>>> +    parent_mr = object_property_get_link(OBJECT(sbdev_mr), "container",
>>> +                                         &error_abort);
>>>       assert(parent_mr);
>>
>> Do we still need to keep the assert?
>
> Not really, I guess.
>
>>> +++ b/hw/ppc/spapr_pci_nvlink2.c
>>> @@ -141,9 +141,10 @@ static void spapr_phb_pci_collect_nvgpu(PCIBus *bus, PCIDevice *pdev,
>>>       if (tgt) {
>>>           Error *local_err = NULL;
>>>           SpaprPhbPciNvGpuConfig *nvgpus = opaque;
>>> -        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]", NULL);
>>> +        Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]",
>>> +                                                  &error_abort);
>>>           Object *mr_npu = object_property_get_link(po, "nvlink2-atsd-mr[0]",
>>> -                                                  NULL);
>>> +                                                  &error_abort);
>>>             g_assert(mr_gpu || mr_npu);
>>
>> Likewise.
>
> I'll drop both unless somebody objects.

The second hunk needs to be dropped instead: either of the two
object_property_get_link() may fail, just not both.



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

* Re: [PATCH 07/46] error: Avoid more error_propagate() when error is not used here
  2020-06-27 12:18     ` Markus Armbruster
@ 2020-07-02 12:54       ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-02 12:54 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Markus Armbruster <armbru@redhat.com> writes:

> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
>
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> When all we do with an Error we receive into a local variable is
>>> propagating to somewhere else, we can just as well receive it there
>>> right away.  The previous commit did that for simple cases with
>>> Coccinelle.  Do it for a few more manually.
>>>
>>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>>> ---
>>>   blockdev.c     |  5 +----
>>>   hw/core/numa.c | 44 ++++++++++++++------------------------------
>>>   qdev-monitor.c | 11 ++++-------
>>>   3 files changed, 19 insertions(+), 41 deletions(-)
>>>
>>> diff --git a/blockdev.c b/blockdev.c
>>> index b66863c42a..73736a4eaf 100644
>>> --- a/blockdev.c
>>> +++ b/blockdev.c
>>> @@ -1009,13 +1009,10 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type,
>>>       }
>>>         /* Actual block device init: Functionality shared with
>>> blockdev-add */
>>> -    blk = blockdev_init(filename, bs_opts, &local_err);
>>> +    blk = blockdev_init(filename, bs_opts, errp);
>>>       bs_opts = NULL;
>>>       if (!blk) {
>>> -        error_propagate(errp, local_err);
>>>           goto fail;
>>> -    } else {
>>> -        assert(!local_err);
>>>       }
>>>         /* Create legacy DriveInfo */
>>> diff --git a/hw/core/numa.c b/hw/core/numa.c
>>> index 5f81900f88..aa8c6be210 100644
>>> --- a/hw/core/numa.c
>>> +++ b/hw/core/numa.c
>>> @@ -449,40 +449,33 @@ void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node,
>>>     void set_numa_options(MachineState *ms, NumaOptions *object,
>>> Error **errp)
>>>   {
>>> -    Error *err = NULL;
>>> -
>>>       if (!ms->numa_state) {
>>>           error_setg(errp, "NUMA is not supported by this machine-type");
>>> -        goto end;
>>> +        return;
>>>       }
>>>         switch (object->type) {
>>>       case NUMA_OPTIONS_TYPE_NODE:
>>> -        parse_numa_node(ms, &object->u.node, &err);
>>> -        if (err) {
>>> -            goto end;
>>> -        }
>>> +        parse_numa_node(ms, &object->u.node, errp);
>>>           break;
>>
>> Could we use return here and and for other "break" operators here, to stress, that we
>> are not going to do something more in case of failure (as well as in case of
>> success)? To prevent the future addition of some code after the switch without
>> handling the error carefully here.
>
> Can do.

Second thoughts: I'd prefer not to mess with it now.

The sane way to add code after the switch is to make the
parse_numa_FOO() return bool, then bail out like this:

             if (!parse_numa_node(ms, &object->u.node, errp)) {
                 return;
             }

Too much for me right now.  I'm having a hard time getting this ready in
time of the freeze.  We can always improve on top.

[...]



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-26  6:19     ` Markus Armbruster
@ 2020-07-02 14:56       ` Markus Armbruster
  0 siblings, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-02 14:56 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, qemu-devel, pbonzini

Markus Armbruster <armbru@redhat.com> writes:

> Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
>
>> 24.06.2020 19:43, Markus Armbruster wrote:
>>> Convert
>>>
>>>      foo(..., &err);
>>>      if (err) {
>>>          ...
>>>      }
>>>
>>> to
>>>
>>>      if (!foo(..., &err)) {
>>>          ...
>>>      }
>>>
>>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>>> Coccinelle script:
>>
>> Please, also mention a command to run the script
>>
>>>
>>>      @@
>>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>>      expression list args, args2;
>>>      typedef Error;
>>>      Error *err;
>>>      identifier errp;
>>>      @@
>>>      -      fun(args, &err, args2);
>>>      -      if (err) {
>>>      +      if (!fun(args, errp, args2)) {
>>> 	       ... when != err
>>>      -	   error_propagate(errp, err);
>>> 	       ...
>>> 	   }
>>>
>>>      @@
>>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>>      expression list args, args2;
>>>      typedef Error;
>>>      Error *err;
>>>      @@
>>>      -      fun(args, &err, args2);
>>>      -      if (err) {
>>>      +      if (!fun(args, &err, args2)) {
>>> 	       ...
>>> 	   }
>>>
>>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>>> ARMSSE being used both as typedef and function-like macro there.
>>> Convert manually.
>>>
>>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>>> that are now unused.  Clean up whitespace.
>>>
>>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>>> ---
>>>   hw/arm/allwinner-a10.c          |  21 ++-----
>>>   hw/arm/armsse.c                 | 104 ++++++++------------------------
>>>   hw/arm/armv7m.c                 |  12 +---
>>>   hw/arm/aspeed_ast2600.c         |  68 ++++++---------------
>>>   hw/arm/aspeed_soc.c             |  60 +++++-------------
>>>   hw/arm/bcm2835_peripherals.c    |  60 +++++-------------
>>>   hw/arm/bcm2836.c                |  12 +---
>>>   hw/arm/cubieboard.c             |   3 +-
>>>   hw/arm/digic.c                  |  12 +---
>>>   hw/arm/digic_boards.c           |   3 +-
>>>   hw/arm/fsl-imx25.c              |  44 ++++----------
>>>   hw/arm/fsl-imx31.c              |  32 +++-------
>>>   hw/arm/fsl-imx6.c               |  48 ++++-----------
>>>   hw/arm/msf2-soc.c               |  21 ++-----
>>>   hw/arm/nrf51_soc.c              |  24 ++------
>>>   hw/arm/stm32f205_soc.c          |  29 +++------
>>>   hw/arm/stm32f405_soc.c          |  32 +++-------
>>>   hw/arm/xlnx-zynqmp.c            |  61 +++++--------------
>>>   hw/block/fdc.c                  |   4 +-
>>>   hw/block/xen-block.c            |   3 +-
>>>   hw/char/serial-pci-multi.c      |   5 +-
>>>   hw/char/serial-pci.c            |   5 +-
>>>   hw/char/serial.c                |  10 +--
>>>   hw/core/cpu.c                   |   3 +-
>>>   hw/cpu/a15mpcore.c              |   5 +-
>>>   hw/cpu/a9mpcore.c               |  21 ++-----
>>>   hw/cpu/arm11mpcore.c            |  17 ++----
>>>   hw/cpu/realview_mpcore.c        |   9 +--
>>>   hw/display/virtio-gpu-pci.c     |   6 +-
>>>   hw/display/virtio-vga.c         |   5 +-
>>>   hw/intc/armv7m_nvic.c           |   9 +--
>>>   hw/intc/pnv_xive.c              |   8 +--
>>>   hw/intc/realview_gic.c          |   5 +-
>>>   hw/intc/spapr_xive.c            |   8 +--
>>>   hw/intc/xics.c                  |   5 +-
>>>   hw/intc/xive.c                  |   3 +-
>>>   hw/isa/piix4.c                  |   5 +-
>>>   hw/microblaze/xlnx-zynqmp-pmu.c |   9 +--
>>>   hw/mips/cps.c                   |  17 ++----
>>>   hw/misc/macio/cuda.c            |   5 +-
>>>   hw/misc/macio/macio.c           |  25 ++------
>>>   hw/misc/macio/pmu.c             |   5 +-
>>>   hw/pci-host/pnv_phb3.c          |  13 +---
>>>   hw/pci-host/pnv_phb4.c          |   5 +-
>>>   hw/pci-host/pnv_phb4_pec.c      |   5 +-
>>>   hw/ppc/e500.c                   |   5 +-
>>>   hw/ppc/pnv.c                    |  53 ++++------------
>>>   hw/ppc/pnv_core.c               |   4 +-
>>>   hw/ppc/pnv_psi.c                |   9 +--
>>>   hw/ppc/spapr_cpu_core.c         |   3 +-
>>>   hw/ppc/spapr_irq.c              |   5 +-
>>>   hw/riscv/opentitan.c            |   9 +--
>>>   hw/riscv/sifive_e.c             |   6 +-
>>>   hw/riscv/sifive_u.c             |   5 +-
>>>   hw/s390x/event-facility.c       |  13 ++--
>>>   hw/s390x/s390-pci-bus.c         |   3 +-
>>>   hw/s390x/sclp.c                 |   3 +-
>>>   hw/s390x/virtio-ccw-crypto.c    |   5 +-
>>>   hw/s390x/virtio-ccw-rng.c       |   5 +-
>>>   hw/scsi/scsi-bus.c              |   4 +-
>>>   hw/sd/aspeed_sdhci.c            |   4 +-
>>>   hw/sd/ssi-sd.c                  |   3 +-
>>>   hw/usb/bus.c                    |   3 +-
>>>   hw/virtio/virtio-rng-pci.c      |   5 +-
>>>   qdev-monitor.c                  |   3 +-
>>>  65 files changed, 248 insertions(+), 768 deletions(-)
>>
>> Almost all of this diff-stat may be generated by more obvious script:
>>
>> @rule1@
>> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
>> expression list args;
>> typedef Error;
>> Error *err;
>> identifier errp;
>> @@
>>
>> -      fun(args, &err);
>> -      if (err)
>> +      if (!fun(args, errp))
>>        {
>> -              error_propagate(errp, err);
>>            return;
>>        }
>>
>> @depends on rule1@
>> identifier err;
>> @@
>>
>> -    Error *err = NULL;
>>      ... when != err
>>
>>
>> ===
>> Script started by command
>> spatch --sp-file x.cocci --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff --max-width 80 --use-gitgrep hw
>>
>> You see, I consider only obvious case, where we have only error_propagate + return in the if. I suggest to make a separate generated patch, based on my cocci script (it's mostly yours, actually), and as a second patch - the remaining of your patch. I do think that this will simplify the review.
>
> I can try this idea.  It's not just this patch, though, it's four more:
> PATCH 17+23+38+42.

I did this instead for v2:

* Use a trivial, safe script for converting to use the returned bool to
  check for failure.

  65 files changed, 248 insertions(+), 495 deletions(-)
  32 files changed, 71 insertions(+), 132 deletions(-)
  46 files changed, 97 insertions(+), 188 deletions(-)
  28 files changed, 96 insertions(+), 142 deletions(-)
  3 files changed, 4 insertions(+), 7 deletions(-)

* Use a an admittedly more complex script for eliminating many
  error_propagate().  I consider the script safe.  I believe it's
  reasonably easy to understand.

  114 files changed, 376 insertions(+), 884 deletions(-)

* Use an unsafe variant of the same script for eliminating a few more:

  23 files changed, 32 insertions(+), 78 deletions(-)

Even though rather I like how it came out, it may have been a bad idea,
because time's awfully short now.



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

* Re: [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends
  2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
  2020-06-26  6:19     ` Markus Armbruster
@ 2020-07-03 10:41     ` Markus Armbruster
  1 sibling, 0 replies; 157+ messages in thread
From: Markus Armbruster @ 2020-07-03 10:41 UTC (permalink / raw)
  To: Vladimir Sementsov-Ogievskiy
  Cc: peter.maydell, berrange, ehabkost, qemu-block, Markus Armbruster,
	qemu-devel, pbonzini

Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:

> 24.06.2020 19:43, Markus Armbruster wrote:
>> Convert
>>
>>      foo(..., &err);
>>      if (err) {
>>          ...
>>      }
>>
>> to
>>
>>      if (!foo(..., &err)) {
>>          ...
>>      }
>>
>> for qdev_realize(), qdev_realize_and_unref(), qbus_realize() and their
>> wrappers isa_realize_and_unref(), pci_realize_and_unref(),
>> sysbus_realize(), sysbus_realize_and_unref(), usb_realize_and_unref().
>> Coccinelle script:
>
> Please, also mention a command to run the script
>
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      identifier errp;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, errp, args2)) {
>> 	       ... when != err
>>      -	   error_propagate(errp, err);
>> 	       ...
>> 	   }
>>
>>      @@
>>      identifier fun = {isa_realize_and_unref, pci_realize_and_unref, qbus_realize, qdev_realize, qdev_realize_and_unref, sysbus_realize, sysbus_realize_and_unref, usb_realize_and_unref};
>>      expression list args, args2;
>>      typedef Error;
>>      Error *err;
>>      @@
>>      -      fun(args, &err, args2);
>>      -      if (err) {
>>      +      if (!fun(args, &err, args2)) {
>> 	       ...
>> 	   }
>>
>> Fails to convert hw/arm/armsse.c, because Coccinelle gets confused by
>> ARMSSE being used both as typedef and function-like macro there.
>> Convert manually.
>>
>> Eliminate error_propagate() that are now unnecessary.  Delete @err
>> that are now unused.  Clean up whitespace.
>>
>> Signed-off-by: Markus Armbruster<armbru@redhat.com>
>> ---
[...]
>>  65 files changed, 248 insertions(+), 768 deletions(-)
>
> Almost all of this diff-stat may be generated by more obvious script:
>
> @rule1@
> identifier fun = {qdev_realize, qdev_realize_and_unref, sysbus_realize};
> expression list args;
> typedef Error;
> Error *err;
> identifier errp;
> @@
>
> -      fun(args, &err);
> -      if (err)
> +      if (!fun(args, errp))
>        {

Funny: the placement of { makes a difference.

When I use

  -      if (err) {
  +      if (!fun(args, errp)) {

out of QEMU coding style habit, I get an extra line containing only
spaces in the output.  Easy enough to clean up with sed, but putting the
brace in the place where Coccinelle doesn't produce such litter is
better.

> -              error_propagate(errp, err);
>            return;
>        }
>
[...]



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

end of thread, other threads:[~2020-07-03 10:42 UTC | newest]

Thread overview: 157+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-24 16:42 [PATCH 00/46] Less clumsy error checking Markus Armbruster
2020-06-24 16:42 ` [PATCH 01/46] error: Improve examples in error.h's big comment Markus Armbruster
2020-06-24 16:59   ` Eric Blake
2020-06-25 14:43   ` Vladimir Sementsov-Ogievskiy
2020-06-25 14:44   ` Greg Kurz
2020-06-25 15:28     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 02/46] error: Document Error API usage rules Markus Armbruster
2020-06-24 17:51   ` Eric Blake
2020-06-25  7:16   ` Vladimir Sementsov-Ogievskiy
2020-06-25 11:23     ` Markus Armbruster
2020-06-25 11:46       ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:17   ` Greg Kurz
2020-06-25 15:30     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 03/46] qdev: Smooth error checking of qdev_realize() & friends Markus Armbruster
2020-06-24 18:03   ` Eric Blake
2020-06-25 11:36     ` Markus Armbruster
2020-06-25 12:39   ` Markus Armbruster
2020-06-25 19:00   ` Vladimir Sementsov-Ogievskiy
2020-06-26  6:19     ` Markus Armbruster
2020-07-02 14:56       ` Markus Armbruster
2020-07-03 10:41     ` Markus Armbruster
2020-06-29 10:40   ` Greg Kurz
2020-06-24 16:43 ` [PATCH 04/46] macio: Tidy up error handling in macio_newworld_realize() Markus Armbruster
2020-06-24 21:52   ` Eric Blake
2020-06-24 23:54   ` David Gibson
2020-06-25 19:09   ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 05/46] virtio-crypto-pci: Tidy up virtio_crypto_pci_realize() Markus Armbruster
2020-06-24 21:52   ` Eric Blake
2020-06-25 19:12   ` Vladimir Sementsov-Ogievskiy
2020-06-28  0:50   ` Gonglei (Arei)
2020-06-24 16:43 ` [PATCH 06/46] error: Avoid error_propagate() when error is not used here Markus Armbruster
2020-06-24 18:17   ` Eric Blake
2020-06-25 12:39     ` Markus Armbruster
2020-06-26 14:36   ` Vladimir Sementsov-Ogievskiy
2020-06-27 11:57     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 07/46] error: Avoid more " Markus Armbruster
2020-06-24 18:21   ` Eric Blake
2020-06-25 12:50     ` Markus Armbruster
2020-06-25 14:41       ` Eric Blake
2020-06-26 17:21   ` Vladimir Sementsov-Ogievskiy
2020-06-27 12:18     ` Markus Armbruster
2020-07-02 12:54       ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 08/46] error: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
2020-06-24 18:32   ` Eric Blake
2020-06-25 13:05     ` Markus Armbruster
2020-06-26 18:22   ` Vladimir Sementsov-Ogievskiy
2020-06-27 11:56     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 09/46] error: Avoid error_propagate() after migrate_add_blocker() Markus Armbruster
2020-06-24 19:34   ` Eric Blake
2020-06-29  8:29   ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 10/46] qemu-option: Check return value instead of @err where convenient Markus Armbruster
2020-06-24 19:36   ` Eric Blake
2020-06-29  9:11   ` Vladimir Sementsov-Ogievskiy
2020-07-01  8:02     ` Markus Armbruster
2020-07-02  9:28       ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 11/46] qemu-option: Make uses of find_desc_by_name() more similar Markus Armbruster
2020-06-24 19:37   ` Eric Blake
2020-06-29  9:25   ` Vladimir Sementsov-Ogievskiy
2020-06-29  9:36   ` Vladimir Sementsov-Ogievskiy
2020-06-29  9:47     ` Vladimir Sementsov-Ogievskiy
2020-07-01  8:07       ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 12/46] qemu-option: Factor out helper find_default_by_name() Markus Armbruster
2020-06-24 19:38   ` Eric Blake
2020-06-29  9:46   ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 13/46] qemu-option: Simplify around find_default_by_name() Markus Armbruster
2020-06-24 19:46   ` Eric Blake
2020-06-25 13:12     ` Markus Armbruster
2020-06-29 10:02       ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 14/46] qemu-option: Factor out helper opt_create() Markus Armbruster
2020-06-24 19:47   ` Eric Blake
2020-06-29 10:09   ` Vladimir Sementsov-Ogievskiy
2020-07-01  8:13     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 15/46] qemu-option: Tidy up opt_set() not to free arguments on failure Markus Armbruster
2020-06-24 19:50   ` Eric Blake
2020-06-29 10:37   ` Vladimir Sementsov-Ogievskiy
2020-07-01  9:01     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 16/46] qemu-option: Make functions taking Error ** return bool, not void Markus Armbruster
2020-06-24 19:55   ` Eric Blake
2020-06-29 11:15   ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 17/46] qemu-option: Smooth error checking with Coccinelle Markus Armbruster
2020-06-24 20:08   ` Eric Blake
2020-06-25 13:33     ` Markus Armbruster
2020-06-29 13:58   ` Vladimir Sementsov-Ogievskiy
2020-06-24 16:43 ` [PATCH 18/46] qemu-option: Smooth error checking manually Markus Armbruster
2020-06-24 20:10   ` Eric Blake
2020-06-25 13:46     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 19/46] block: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
2020-06-24 20:12   ` Eric Blake
2020-06-24 16:43 ` [PATCH 20/46] block: Avoid error accumulation in bdrv_img_create() Markus Armbruster
2020-06-24 20:14   ` Eric Blake
2020-06-25 13:47     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 21/46] hmp: Eliminate a variable in hmp_migrate_set_parameter() Markus Armbruster
2020-06-24 20:15   ` Eric Blake
2020-06-24 16:43 ` [PATCH 22/46] qapi: Make visitor functions taking Error ** return bool, not void Markus Armbruster
2020-06-24 20:43   ` Eric Blake
2020-06-25 14:56     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 23/46] qapi: Smooth error checking with Coccinelle Markus Armbruster
2020-06-24 20:50   ` Eric Blake
2020-06-25 15:03     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 24/46] qapi: Smooth error checking manually Markus Armbruster
2020-06-24 20:53   ` Eric Blake
2020-06-24 16:43 ` [PATCH 25/46] qapi: Smooth visitor error checking in generated code Markus Armbruster
2020-06-24 20:58   ` Eric Blake
2020-06-24 16:43 ` [PATCH 26/46] qapi: Smooth another visitor error checking pattern Markus Armbruster
2020-06-24 21:02   ` Eric Blake
2020-06-24 16:43 ` [PATCH 27/46] qapi: Purge error_propagate() from QAPI core Markus Armbruster
2020-06-24 21:03   ` Eric Blake
2020-06-24 16:43 ` [PATCH 28/46] block/parallels: Simplify parallels_open() after previous commit Markus Armbruster
2020-06-24 21:03   ` Eric Blake
2020-06-24 16:43 ` [PATCH 29/46] acpi: Avoid unnecessary error_propagate() after error_setg() Markus Armbruster
2020-06-24 21:04   ` Eric Blake
2020-06-24 16:43 ` [PATCH 30/46] s390x/pci: Fix harmless mistake in zpci's property fid's setter Markus Armbruster
2020-06-24 19:31   ` Matthew Rosato
2020-06-25  7:03   ` Cornelia Huck
2020-06-24 16:43 ` [PATCH 31/46] qom: Use error_reportf_err() instead of g_printerr() in examples Markus Armbruster
2020-06-24 21:05   ` Eric Blake
2020-06-24 16:43 ` [PATCH 32/46] qom: Rename qdev_get_type() to object_get_type() Markus Armbruster
2020-06-24 21:06   ` Eric Blake
2020-06-25  6:33   ` Philippe Mathieu-Daudé
2020-06-24 16:43 ` [PATCH 33/46] qom: Crash more nicely on object_property_get_link() failure Markus Armbruster
2020-06-24 21:07   ` Eric Blake
2020-06-25 15:05     ` Markus Armbruster
2020-07-02 12:11       ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 34/46] qom: Don't handle impossible " Markus Armbruster
2020-06-24 21:13   ` Eric Blake
2020-06-25  6:36   ` Philippe Mathieu-Daudé
2020-06-25 15:09     ` Markus Armbruster
2020-06-29 14:38       ` Philippe Mathieu-Daudé
2020-07-01  9:15         ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 35/46] qom: Use return values to check for error where that's simpler Markus Armbruster
2020-06-24 21:24   ` Eric Blake
2020-06-24 16:43 ` [PATCH 36/46] qom: Put name parameter before value / visitor parameter Markus Armbruster
2020-06-24 21:27   ` Eric Blake
2020-06-25 15:14     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 37/46] qom: Make functions taking Error ** return bool, not void Markus Armbruster
2020-06-24 21:32   ` Eric Blake
2020-06-25 15:14     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 38/46] qom: Smooth error checking with Coccinelle Markus Armbruster
2020-06-24 21:35   ` Eric Blake
2020-06-24 16:43 ` [PATCH 39/46] qom: Smooth error checking manually Markus Armbruster
2020-06-24 21:38   ` Eric Blake
2020-06-24 16:43 ` [PATCH 40/46] qom: Make functions taking Error ** return bool, not 0/-1 Markus Armbruster
2020-06-24 21:40   ` Eric Blake
2020-06-24 16:43 ` [PATCH 41/46] qdev: Make functions taking Error ** return bool, not void Markus Armbruster
2020-06-24 21:40   ` Eric Blake
2020-06-24 16:43 ` [PATCH 42/46] qdev: Smooth error checking with Coccinelle Markus Armbruster
2020-06-24 21:41   ` Eric Blake
2020-06-24 16:43 ` [PATCH 43/46] qdev: Smooth error checking manually Markus Armbruster
2020-06-24 21:42   ` Eric Blake
2020-06-25 15:15     ` Markus Armbruster
2020-06-24 16:43 ` [PATCH 44/46] qemu-img: Ignore Error objects where the return value suffices Markus Armbruster
2020-06-24 21:49   ` Eric Blake
2020-06-24 16:43 ` [PATCH 45/46] qdev: " Markus Armbruster
2020-06-24 21:50   ` Eric Blake
2020-06-24 16:43 ` [PATCH 46/46] hmp: " Markus Armbruster
2020-06-24 21:51   ` Eric Blake
2020-06-24 16:58 ` [PATCH 00/46] Less clumsy error checking Paolo Bonzini

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.