aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-11-15 10:01:16 +0000
committerPeter Maydell <peter.maydell@linaro.org>2018-11-15 10:01:16 +0000
commit18d30e7b59b0b0c6555bfbf464617652a50a0d0f (patch)
treed441f376f6421b8cb1aa63f731936065196c80ea
parentcb968d275c145467c8b385a3618a207ec111eab1 (diff)
parentb6e67ecc7b6e8938982ab94820c079f24845f623 (diff)
downloadqemu-18d30e7b59b0b0c6555bfbf464617652a50a0d0f.zip
qemu-18d30e7b59b0b0c6555bfbf464617652a50a0d0f.tar.gz
qemu-18d30e7b59b0b0c6555bfbf464617652a50a0d0f.tar.bz2
Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20181114' into staging
Fix error handling during zpci device creation. # gpg: Signature made Wed 14 Nov 2018 10:08:43 GMT # gpg: using RSA key DECF6B93C6F02FAF # gpg: Good signature from "Cornelia Huck <conny@cornelia-huck.de>" # gpg: aka "Cornelia Huck <huckc@linux.vnet.ibm.com>" # gpg: aka "Cornelia Huck <cornelia.huck@de.ibm.com>" # gpg: aka "Cornelia Huck <cohuck@kernel.org>" # gpg: aka "Cornelia Huck <cohuck@redhat.com>" # Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0 18CE DECF 6B93 C6F0 2FAF * remotes/cohuck/tags/s390x-20181114: s390x/pci: properly fail if the zPCI device cannot be created Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--hw/s390x/s390-pci-bus.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index e42e1b8..060ff06 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -780,17 +780,31 @@ static void s390_pci_msix_free(S390PCIBusDevice *pbdev)
}
static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
- const char *target)
+ const char *target, Error **errp)
{
- DeviceState *dev = NULL;
+ Error *local_err = NULL;
+ DeviceState *dev;
dev = qdev_try_create(BUS(s->bus), TYPE_S390_PCI_DEVICE);
if (!dev) {
+ error_setg(errp, "zPCI device could not be created");
return NULL;
}
- qdev_prop_set_string(dev, "target", target);
- qdev_init_nofail(dev);
+ object_property_set_str(OBJECT(dev), target, "target", &local_err);
+ if (local_err) {
+ object_unparent(OBJECT(dev));
+ error_propagate_prepend(errp, local_err,
+ "zPCI device could not be created: ");
+ return NULL;
+ }
+ object_property_set_bool(OBJECT(dev), true, "realized", &local_err);
+ if (local_err) {
+ object_unparent(OBJECT(dev));
+ error_propagate_prepend(errp, local_err,
+ "zPCI device could not be created: ");
+ return NULL;
+ }
return S390_PCI_DEVICE(dev);
}
@@ -865,9 +879,8 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
pbdev = s390_pci_find_dev_by_target(s, dev->id);
if (!pbdev) {
- pbdev = s390_pci_device_new(s, dev->id);
+ pbdev = s390_pci_device_new(s, dev->id, errp);
if (!pbdev) {
- error_setg(errp, "create zpci device failed");
return;
}
}