If we want to add some info to errp (by error_prepend() or error_append_hint()), we must use the ERRP_AUTO_PROPAGATE macro. Otherwise, this info will not be added when errp == &fatal_err (the program will exit prior to the error_append_hint() or error_prepend() call). Fix such cases.
If we want to check error after errp-function call, we need to introduce local_err and than propagate it to errp. Instead, use ERRP_AUTO_PROPAGATE macro, benefits are: 1. No need of explicit error_propagate call 2. No need of explicit local_err variable: use errp directly 3. ERRP_AUTO_PROPAGATE leaves errp as is if it's not NULL or &error_fatel, this means that we don't break error_abort (we'll abort on error_set, not on error_propagate) This commit (together with its neighbors) was generated by for f in $(git grep -l errp \*.[ch]); do \ spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \ --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff $f; \ done; then fix a bit of compilation problems: coccinelle for some reason leaves several f() { ... goto out; ... out: } patterns, with "out:" at function end. then ./python/commit-per-subsystem.py MAINTAINERS "$(< auto-msg)" (auto-msg was a file with this commit message) Still, for backporting it may be more comfortable to use only the first command and then do one huge commit. Reported-by: Kevin Wolf <kw...@redhat.com> Reported-by: Greg Kurz <gr...@kaod.org> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- hw/scsi/esp-pci.c | 7 +++---- hw/scsi/mptsas.c | 13 ++++++------- hw/scsi/scsi-bus.c | 24 ++++++++++-------------- hw/scsi/scsi-disk.c | 8 ++++---- hw/scsi/scsi-generic.c | 1 + hw/scsi/virtio-scsi.c | 7 +++---- 6 files changed, 27 insertions(+), 33 deletions(-) diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c index d5a1f9e017..eab48e3b38 100644 --- a/hw/scsi/esp-pci.c +++ b/hw/scsi/esp-pci.c @@ -468,16 +468,15 @@ static void dc390_write_config(PCIDevice *dev, static void dc390_scsi_realize(PCIDevice *dev, Error **errp) { + ERRP_AUTO_PROPAGATE(); DC390State *pci = DC390(dev); - Error *err = NULL; uint8_t *contents; uint16_t chksum = 0; int i; /* init base class */ - esp_pci_scsi_realize(dev, &err); - if (err) { - error_propagate(errp, err); + esp_pci_scsi_realize(dev, errp); + if (*errp) { return; } diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c index b8a4b37cf3..a14cfb3b74 100644 --- a/hw/scsi/mptsas.c +++ b/hw/scsi/mptsas.c @@ -1272,28 +1272,27 @@ static const struct SCSIBusInfo mptsas_scsi_info = { static void mptsas_scsi_realize(PCIDevice *dev, Error **errp) { + ERRP_AUTO_PROPAGATE(); MPTSASState *s = MPT_SAS(dev); - Error *err = NULL; int ret; dev->config[PCI_LATENCY_TIMER] = 0; dev->config[PCI_INTERRUPT_PIN] = 0x01; if (s->msi != ON_OFF_AUTO_OFF) { - ret = msi_init(dev, 0, 1, true, false, &err); + ret = msi_init(dev, 0, 1, true, false, errp); /* Any error other than -ENOTSUP(board's MSI support is broken) * is a programming error */ assert(!ret || ret == -ENOTSUP); if (ret && s->msi == ON_OFF_AUTO_ON) { /* Can't satisfy user's explicit msi=on request, fail */ - error_append_hint(&err, "You have to use msi=auto (default) or " - "msi=off with this machine type.\n"); - error_propagate(errp, err); + error_append_hint(errp, "You have to use msi=auto (default) or " + "msi=off with this machine type.\n"); return; } - assert(!err || s->msi == ON_OFF_AUTO_AUTO); + assert(!*errp || s->msi == ON_OFF_AUTO_AUTO); /* With msi=auto, we fall back to MSI off silently */ - error_free(err); + error_free_errp(errp); /* Only used for migration. */ s->msi_in_use = (ret == 0); diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index bccb7cc4c6..b8ec65fd25 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -154,10 +154,10 @@ static void scsi_dma_restart_cb(void *opaque, int running, RunState state) static void scsi_qdev_realize(DeviceState *qdev, Error **errp) { + ERRP_AUTO_PROPAGATE(); SCSIDevice *dev = SCSI_DEVICE(qdev); SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus); SCSIDevice *d; - Error *local_err = NULL; if (dev->channel > bus->info->max_channel) { error_setg(errp, "bad scsi channel id: %d", dev->channel); @@ -205,9 +205,8 @@ static void scsi_qdev_realize(DeviceState *qdev, Error **errp) } QTAILQ_INIT(&dev->requests); - scsi_device_realize(dev, &local_err); - if (local_err) { - error_propagate(errp, local_err); + scsi_device_realize(dev, errp); + if (*errp) { return; } dev->vmsentry = qdev_add_vm_change_state_handler(DEVICE(dev), @@ -234,10 +233,10 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk, BlockdevOnError werror, const char *serial, Error **errp) { + ERRP_AUTO_PROPAGATE(); const char *driver; char *name; DeviceState *dev; - Error *err = NULL; driver = blk_is_sg(blk) ? "scsi-generic" : "scsi-disk"; dev = qdev_create(&bus->qbus, driver); @@ -256,15 +255,13 @@ 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(dev, "drive", blk, &err); - if (err) { - error_propagate(errp, err); + qdev_prop_set_drive(dev, "drive", blk, errp); + if (*errp) { object_unparent(OBJECT(dev)); return NULL; } - object_property_set_bool(OBJECT(dev), share_rw, "share-rw", &err); - if (err != NULL) { - error_propagate(errp, err); + object_property_set_bool(OBJECT(dev), share_rw, "share-rw", errp); + if (*errp) { object_unparent(OBJECT(dev)); return NULL; } @@ -272,9 +269,8 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockBackend *blk, qdev_prop_set_enum(dev, "rerror", rerror); qdev_prop_set_enum(dev, "werror", werror); - object_property_set_bool(OBJECT(dev), true, "realized", &err); - if (err != NULL) { - error_propagate(errp, err); + object_property_set_bool(OBJECT(dev), true, "realized", errp); + if (*errp) { object_unparent(OBJECT(dev)); return NULL; } diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 915641a0f1..2f3064d8da 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2455,13 +2455,12 @@ static void scsi_cd_realize(SCSIDevice *dev, Error **errp) static void scsi_disk_realize(SCSIDevice *dev, Error **errp) { + ERRP_AUTO_PROPAGATE(); DriveInfo *dinfo; - Error *local_err = NULL; if (!dev->conf.blk) { - scsi_realize(dev, &local_err); - assert(local_err); - error_propagate(errp, local_err); + scsi_realize(dev, errp); + assert(*errp); return; } @@ -2597,6 +2596,7 @@ static int get_device_type(SCSIDiskState *s) static void scsi_block_realize(SCSIDevice *dev, Error **errp) { + ERRP_AUTO_PROPAGATE(); SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev); AioContext *ctx; int sg_version; diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c index e7798ebcd0..4c7543801f 100644 --- a/hw/scsi/scsi-generic.c +++ b/hw/scsi/scsi-generic.c @@ -653,6 +653,7 @@ static void scsi_generic_reset(DeviceState *dev) static void scsi_generic_realize(SCSIDevice *s, Error **errp) { + ERRP_AUTO_PROPAGATE(); int rc; int sg_version; struct sg_scsi_id scsiid; diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index ee52aa7d17..86c71f93fd 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -905,17 +905,16 @@ void virtio_scsi_common_realize(DeviceState *dev, static void virtio_scsi_device_realize(DeviceState *dev, Error **errp) { + ERRP_AUTO_PROPAGATE(); VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtIOSCSI *s = VIRTIO_SCSI(dev); - Error *err = NULL; virtio_scsi_common_realize(dev, virtio_scsi_handle_ctrl, virtio_scsi_handle_event, virtio_scsi_handle_cmd, - &err); - if (err != NULL) { - error_propagate(errp, err); + errp); + if (*errp) { return; } -- 2.21.0