Convert the *_orphan() device-creation calls in hw/scsi to the new
parented API introduced earlier in this series, so every onboard
device gets a stable path in the composition tree instead of landing
in /machine/unattached with an unstable device[N] name.

The parent for each device is the object that owns its lifetime: the
machine for board-created devices, the containing device for
composite children.  Names follow existing QOM conventions.

Per-site rationale (reviewers: dispute the modeling here):

hw/scsi/lasi_ncr710.c:234 | qdev_new | parent | "scsi" | thread Object *parent 
as first arg; single caller in hw/hppa/machine.c board init passes 
OBJECT(machine)
hw/scsi/ncr53c710.c:2379 | qdev_new | parent | "scsi" | thread Object *parent 
as first arg; no in-tree callers, header updated
hw/scsi/ncr53c710.c:2397 | qdev_new | parent | "scsi" | thread Object *parent 
as first arg; no in-tree callers, header updated
hw/scsi/scsi-bus.c:448 | qdev_new | OBJECT(bus) | name | collapse existing 
object_property_add_child(OBJECT(bus), name, dev); keep dynamic legacy[%d] name
hw/scsi/spapr_vscsi.c:1238 | qdev_new | parent | "vscsi[*]" | thread Object 
*parent as first arg; single caller in hw/ppc/spapr.c board init loop passes 
OBJECT(spapr)

Link: https://lore.kernel.org/qemu-devel/[email protected]/
AI-used-for: code (refactoring)
Signed-off-by: Alexander Graf <[email protected]>
---
 hw/hppa/machine.c          |  2 +-
 hw/ppc/spapr.c             |  2 +-
 hw/scsi/lasi_ncr710.c      |  8 ++++----
 hw/scsi/lasi_ncr710.h      |  4 ++--
 hw/scsi/ncr53c710.c        | 15 ++++++++-------
 hw/scsi/ncr53c710.h        |  7 ++++---
 hw/scsi/scsi-bus.c         |  5 ++---
 hw/scsi/spapr_vscsi.c      |  6 +++---
 include/hw/ppc/spapr_vio.h |  2 +-
 9 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index e50f9adf41..e3c9053bf2 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -631,7 +631,7 @@ static void machine_HP_715_init(MachineState *machine)
                                                        1));
     /* SCSI disk setup. */
     if (drive_get_max_bus(IF_SCSI) >= 0) {
-        dev = lasi_ncr710_init(addr_space,
+        dev = lasi_ncr710_init(OBJECT(machine), addr_space,
                                translate(NULL, LASI_HPA_715 + 0x6000),
                                qdev_get_gpio_in(lasi_dev, LASI_IRQ_SCSI_HPA));
         assert(dev);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e09b529ebc..91f9d873b8 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3062,7 +3062,7 @@ static void spapr_machine_init(MachineState *machine)
     pci_init_nic_devices(phb->bus, NULL);
 
     for (i = 0; i <= drive_get_max_bus(IF_SCSI); i++) {
-        spapr_vscsi_create(spapr->vio_bus);
+        spapr_vscsi_create(OBJECT(spapr), spapr->vio_bus);
     }
 
     /* Graphics */
diff --git a/hw/scsi/lasi_ncr710.c b/hw/scsi/lasi_ncr710.c
index e1a1f68aaa..d40bc62157 100644
--- a/hw/scsi/lasi_ncr710.c
+++ b/hw/scsi/lasi_ncr710.c
@@ -224,18 +224,18 @@ void lasi_ncr710_handle_legacy_cmdline(DeviceState 
*lasi_dev)
     }
 }
 
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
-                               qemu_irq irq)
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+                              hwaddr hpa, qemu_irq irq)
 {
     DeviceState *dev;
     LasiNCR710State *s;
     SysBusDevice *sbd;
 
-    dev = qdev_new_orphan(TYPE_LASI_NCR710);
+    dev = qdev_new(parent, "scsi", TYPE_LASI_NCR710);
     s = LASI_NCR710(dev);
     sbd = SYS_BUS_DEVICE(dev);
     s->lasi_irq = irq;
-    sysbus_realize_and_unref(sbd, &error_fatal);
+    sysbus_realize(sbd, &error_fatal);
     memory_region_add_subregion(addr_space, hpa,
                                sysbus_mmio_get_region(sbd, 0));
     return dev;
diff --git a/hw/scsi/lasi_ncr710.h b/hw/scsi/lasi_ncr710.h
index 450fb7e1c3..e963a6511f 100644
--- a/hw/scsi/lasi_ncr710.h
+++ b/hw/scsi/lasi_ncr710.h
@@ -48,8 +48,8 @@ typedef struct LasiNCR710State {
     NCR710State ncr710;
 } LasiNCR710State;
 
-DeviceState *lasi_ncr710_init(MemoryRegion *addr_space, hwaddr hpa,
-                               qemu_irq irq);
+DeviceState *lasi_ncr710_init(Object *parent, MemoryRegion *addr_space,
+                              hwaddr hpa, qemu_irq irq);
 void lasi_ncr710_handle_legacy_cmdline(DeviceState *lasi_dev);
 
 #endif
diff --git a/hw/scsi/ncr53c710.c b/hw/scsi/ncr53c710.c
index 54ce2df641..633a76c70b 100644
--- a/hw/scsi/ncr53c710.c
+++ b/hw/scsi/ncr53c710.c
@@ -2371,22 +2371,23 @@ static const VMStateDescription vmstate_sysbus_ncr710 = 
{
     }
 };
 
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq)
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+                                          qemu_irq irq)
 {
     DeviceState *dev;
     SysBusDevice *sysbus;
 
-    dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+    dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
     sysbus = SYS_BUS_DEVICE(dev);
 
-    qdev_realize_and_unref(dev, NULL, &error_abort);
+    qdev_realize(dev, NULL, &error_abort);
     sysbus_mmio_map(sysbus, 0, addr);
     sysbus_connect_irq(sysbus, 0, irq);
     return dev;
 }
 
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
-                             qemu_irq irq)
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+                            hwaddr addr, qemu_irq irq)
 {
     DeviceState *dev;
     SysBusDevice *sysbus;
@@ -2394,10 +2395,10 @@ DeviceState *ncr53c710_init(MemoryRegion 
*address_space, hwaddr addr,
 
     /* trace_ncr710_device_init(addr); */
 
-    dev = qdev_new_orphan(TYPE_SYSBUS_NCR710_SCSI);
+    dev = qdev_new(parent, "scsi", TYPE_SYSBUS_NCR710_SCSI);
     sysbus = SYS_BUS_DEVICE(dev);
 
-    qdev_realize_and_unref(dev, NULL, &error_abort);
+    qdev_realize(dev, NULL, &error_abort);
     sysbus_mmio_map(sysbus, 0, addr);
     sysbus_connect_irq(sysbus, 0, irq);
 
diff --git a/hw/scsi/ncr53c710.h b/hw/scsi/ncr53c710.h
index 00b6a01577..6e466d6a36 100644
--- a/hw/scsi/ncr53c710.h
+++ b/hw/scsi/ncr53c710.h
@@ -229,9 +229,10 @@ static inline SysBusNCR710State 
*sysbus_from_ncr710(NCR710State *s)
     return container_of(s, SysBusNCR710State, ncr710);
 }
 
-DeviceState *ncr53c710_init(MemoryRegion *address_space, hwaddr addr,
-                             qemu_irq irq);
-DeviceState *ncr710_device_create_sysbus(hwaddr addr, qemu_irq irq);
+DeviceState *ncr53c710_init(Object *parent, MemoryRegion *address_space,
+                            hwaddr addr, qemu_irq irq);
+DeviceState *ncr710_device_create_sysbus(Object *parent, hwaddr addr,
+                                          qemu_irq irq);
 void ncr710_reg_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);
 uint64_t ncr710_reg_read(void *opaque, hwaddr addr, unsigned size);
 void ncr710_soft_reset(NCR710State *s);
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 806a20baee..bc7cfea6ed 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -445,9 +445,8 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, 
BlockBackend *blk,
             driver = "scsi-hd";
         }
     }
-    dev = qdev_new_orphan(driver);
     name = g_strdup_printf("legacy[%d]", unit);
-    object_property_add_child(OBJECT(bus), name, OBJECT(dev));
+    dev = qdev_new(OBJECT(bus), name, driver);
     g_free(name);
 
     s = SCSI_DEVICE(dev);
@@ -473,7 +472,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, 
BlockBackend *blk,
         return NULL;
     }
 
-    if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) {
+    if (!qdev_realize(dev, &bus->qbus, errp)) {
         object_unparent(OBJECT(dev));
         return NULL;
     }
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 492d7d18a2..95cd21ffbb 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -1231,13 +1231,13 @@ static void spapr_vscsi_realize(SpaprVioDevice *dev, 
Error **errp)
     qbus_set_hotplug_handler(BUS(&s->bus), NULL);
 }
 
-void spapr_vscsi_create(SpaprVioBus *bus)
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus)
 {
     DeviceState *dev;
 
-    dev = qdev_new_orphan("spapr-vscsi");
+    dev = qdev_new(parent, "vscsi[*]", "spapr-vscsi");
 
-    qdev_realize_and_unref(dev, &bus->bus, &error_fatal);
+    qdev_realize(dev, &bus->bus, &error_fatal);
     scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus);
 }
 
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index 0ea0dbae8b..72baef6919 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -139,7 +139,7 @@ SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, 
target_ulong reg);
 void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
 void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
 void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd);
-void spapr_vscsi_create(SpaprVioBus *bus);
+void spapr_vscsi_create(Object *parent, SpaprVioBus *bus);
 
 SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus);
 
-- 
2.47.1


Reply via email to