On Wed, 2016-03-23 at 13:05 +0100, Markus Armbruster wrote: > Wei Jiangang <weijg.f...@cn.fujitsu.com> writes: > > > Firstly, convert pxb_dev_init_common() to Error and rename > > it to pxb_dev_realize_common(). > > Actually, pxb_register_bus() is converted as well. > > > > And then, > > convert pxb_dev_initfn() and pxb_pcie_dev_initfn() to Error, > > rename them to pxb_dev_realize() and pxb_pcie_dev_realize() > > respectively. > > --- > > hw/pci-bridge/pci_expander_bridge.c | 54 > > ++++++++++++++++++------------------- > > 1 file changed, 27 insertions(+), 27 deletions(-) > > > > diff --git a/hw/pci-bridge/pci_expander_bridge.c > > b/hw/pci-bridge/pci_expander_bridge.c > > index ba320bd..6f53a6b 100644 > > --- a/hw/pci-bridge/pci_expander_bridge.c > > +++ b/hw/pci-bridge/pci_expander_bridge.c > > @@ -160,30 +160,25 @@ static const TypeInfo pxb_host_info = { > > }; > > > > /* > > - * Registers the PXB bus as a child of the i440fx root bus. > > - * > > - * Returns 0 on successs, -1 if i440fx host was not > > - * found or the bus number is already in use. > > + * Registers the PXB bus as a child of pci host root bus. > > */ > > -static int pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus) > > +static void pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus, Error **errp) > > { > > PCIBus *bus = dev->bus; > > int pxb_bus_num = pci_bus_num(pxb_bus); > > > > if (bus->parent_dev) { > > - error_report("PXB devices can be attached only to root bus."); > > - return -1; > > + error_setg(errp, "PXB devices can be attached only to root bus"); > > + return; > > } > > > > QLIST_FOREACH(bus, &bus->child, sibling) { > > if (pci_bus_num(bus) == pxb_bus_num) { > > - error_report("Bus %d is already in use.", pxb_bus_num); > > - return -1; > > + error_setg(errp, "Bus %d is already in use", pxb_bus_num); > > + return; > > } > > } > > QLIST_INSERT_HEAD(&dev->bus->child, pxb_bus, sibling); > > - > > - return 0; > > } > > > > static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin) > > @@ -213,17 +208,21 @@ static gint pxb_compare(gconstpointer a, > > gconstpointer b) > > 0; > > } > > > > -static int pxb_dev_init_common(PCIDevice *dev, bool pcie) > > +static void pxb_dev_realize_common(PCIDevice *dev, bool pcie, Error **errp) > > { > > PXBDev *pxb = convert_to_pxb(dev); > > DeviceState *ds, *bds = NULL; > > PCIBus *bus; > > const char *dev_name = NULL; > > + Error *err = NULL; > > > > if (pxb->numa_node != NUMA_NODE_UNASSIGNED && > > pxb->numa_node >= nb_numa_nodes) { > > - error_report("Illegal numa node %d.", pxb->numa_node); > > - return -EINVAL; > > + error_setg(&err, "Illegal numa node %d", pxb->numa_node); > > + if (err) { > > + error_propagate(errp, err); > > + } > > No. v2 got it right. Thanks for your response. OK, Let us discard v3.
> > > + return; > > } > > > > if (dev->qdev.id && *dev->qdev.id) { > [...] > >