qdev_device_new_from_qdict() can be used to create a device from QDict without realizing it.
Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com> --- include/monitor/qdev.h | 2 ++ system/qdev-monitor.c | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/monitor/qdev.h b/include/monitor/qdev.h index 1d57bf6577..013108a7dd 100644 --- a/include/monitor/qdev.h +++ b/include/monitor/qdev.h @@ -11,6 +11,8 @@ int qdev_device_help(QemuOpts *opts); DeviceState *qdev_device_add(QemuOpts *opts, Error **errp); DeviceState *qdev_device_add_from_qdict(const QDict *opts, bool from_json, Error **errp); +DeviceState *qdev_device_new_from_qdict(const QDict *opts, bool from_json, + BusState **busp, Error **errp); /** * qdev_set_id: parent the device and set its id if provided. diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index 42aac94b8c..028b97f2b5 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -618,6 +618,25 @@ const char *qdev_set_id(DeviceState *dev, char *id, Error **errp) DeviceState *qdev_device_add_from_qdict(const QDict *opts, bool from_json, Error **errp) +{ + DeviceState *dev; + BusState *bus; + + dev = qdev_device_new_from_qdict(opts, from_json, &bus, errp); + if (!dev) { + return NULL; + } + + if (!qdev_realize(dev, bus, errp)) { + object_unparent(OBJECT(dev)); + object_unref(OBJECT(dev)); + } + + return dev; +} + +DeviceState *qdev_device_new_from_qdict(const QDict *opts, bool from_json, + BusState **busp, Error **errp) { ERRP_GUARD(); DeviceClass *dc; @@ -720,9 +739,7 @@ DeviceState *qdev_device_add_from_qdict(const QDict *opts, goto err_del_dev; } - if (!qdev_realize(dev, bus, errp)) { - goto err_del_dev; - } + *busp = bus; return dev; err_del_dev: -- 2.43.0