@@ -44,8 +44,8 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
Error **errp),
const char *name, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
- Error *local_err = NULL;
void **ptr = qdev_get_prop_ptr(dev, prop);
char *str;
@@ -54,9 +54,8 @@ static void set_pointer(Object *obj, Visitor *v, Property *prop,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
if (!*str) {
@@ -221,8 +220,8 @@ static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,
static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
- Error *local_err = NULL;
Property *prop = opaque;
CharBackend *be = qdev_get_prop_ptr(dev, prop);
Chardev *s;
@@ -233,9 +232,8 @@ static void set_chr(Object *obj, Visitor *v, const char *name, void *opaque,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -289,12 +287,12 @@ static void get_netdev(Object *obj, Visitor *v, const char *name,
static void set_netdev(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
NetClientState **ncs = peers_ptr->ncs;
NetClientState *peers[MAX_QUEUE_NUM];
- Error *local_err = NULL;
int queues, err = 0, i = 0;
char *str;
@@ -303,9 +301,8 @@ static void set_netdev(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -370,11 +367,11 @@ static void get_audiodev(Object *obj, Visitor *v, const char* name,
static void set_audiodev(Object *obj, Visitor *v, const char* name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop);
AudioState *state;
- Error *local_err = NULL;
int err = 0;
char *str;
@@ -383,9 +380,8 @@ static void set_audiodev(Object *obj, Visitor *v, const char* name,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -114,9 +114,9 @@ static void prop_get_bit(Object *obj, Visitor *v, const char *name,
static void prop_set_bit(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
- Error *local_err = NULL;
bool value;
if (dev->realized) {
@@ -124,9 +124,8 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_bool(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_bool(v, name, &value, errp);
+ if (*errp) {
return;
}
bit_prop_set(dev, prop, value);
@@ -178,9 +177,9 @@ static void prop_get_bit64(Object *obj, Visitor *v, const char *name,
static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
- Error *local_err = NULL;
bool value;
if (dev->realized) {
@@ -188,9 +187,8 @@ static void prop_set_bit64(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_bool(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_bool(v, name, &value, errp);
+ if (*errp) {
return;
}
bit64_prop_set(dev, prop, value);
@@ -474,10 +472,10 @@ static void get_string(Object *obj, Visitor *v, const char *name,
static void set_string(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
char **ptr = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
char *str;
if (dev->realized) {
@@ -485,9 +483,8 @@ static void set_string(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
g_free(*ptr);
@@ -534,10 +531,10 @@ static void get_mac(Object *obj, Visitor *v, const char *name, void *opaque,
static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
MACAddr *mac = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
int i, pos;
char *str, *p;
@@ -546,9 +543,8 @@ static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -656,11 +652,11 @@ const PropertyInfo qdev_prop_fdc_drive_type = {
static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
int32_t value, *ptr = qdev_get_prop_ptr(dev, prop);
unsigned int slot, fn, n;
- Error *local_err = NULL;
char *str;
if (dev->realized) {
@@ -668,13 +664,11 @@ static void set_pci_devfn(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_free(local_err);
- local_err = NULL;
- visit_type_int32(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
+ error_free_errp(errp);
+ visit_type_int32(v, name, &value, errp);
+ if (*errp) {
} else if (value < -1 || value > 255) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
name ? name : "null", "pci_devfn");
@@ -728,10 +722,10 @@ const PropertyInfo qdev_prop_pci_devfn = {
static void set_blocksize(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
const int64_t min = 512;
const int64_t max = 32768;
@@ -740,9 +734,8 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_uint16(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_uint16(v, name, &value, errp);
+ if (*errp) {
return;
}
/* value of 0 means "unset" */
@@ -803,10 +796,10 @@ static void get_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
char *str, *p;
char *e;
unsigned long val;
@@ -818,9 +811,8 @@ static void set_pci_host_devaddr(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -907,10 +899,10 @@ static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
QemuUUID *uuid = qdev_get_prop_ptr(dev, prop);
- Error *local_err = NULL;
char *str;
if (dev->realized) {
@@ -918,9 +910,8 @@ static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque,
return;
}
- visit_type_str(v, name, &str, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &str, errp);
+ if (*errp) {
return;
}
@@ -977,6 +968,7 @@ static void array_element_release(Object *obj, const char *name, void *opaque)
static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
/* Setter for the property which defines the length of a
* variable-sized property array. As well as actually setting the
* array-length field in the device struct, we have to create the
@@ -986,7 +978,6 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
Property *prop = opaque;
uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
void **arrayptr = (void *)dev + prop->arrayoffset;
- Error *local_err = NULL;
void *eltptr;
const char *arrayname;
int i;
@@ -1000,9 +991,8 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
name);
return;
}
- visit_type_uint32(v, name, alenptr, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_uint32(v, name, alenptr, errp);
+ if (*errp) {
return;
}
if (!*alenptr) {
@@ -1039,9 +1029,8 @@ static void set_prop_arraylen(Object *obj, Visitor *v, const char *name,
arrayprop->prop.info->get,
arrayprop->prop.info->set,
array_element_release,
- arrayprop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ arrayprop, errp);
+ if (*errp) {
return;
}
}
@@ -1322,20 +1311,19 @@ static void get_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
static void set_prop_pcielinkspeed(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
PCIExpLinkSpeed *p = qdev_get_prop_ptr(dev, prop);
int speed;
- Error *local_err = NULL;
if (dev->realized) {
qdev_prop_set_after_realize(dev, name, errp);
return;
}
- visit_type_enum(v, prop->name, &speed, prop->info->enum_table, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_enum(v, prop->name, &speed, prop->info->enum_table, errp);
+ if (*errp) {
return;
}
@@ -1410,20 +1398,19 @@ static void get_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
static void set_prop_pcielinkwidth(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
PCIExpLinkWidth *p = qdev_get_prop_ptr(dev, prop);
int width;
- Error *local_err = NULL;
if (dev->realized) {
qdev_prop_set_after_realize(dev, name, errp);
return;
}
- visit_type_enum(v, prop->name, &width, prop->info->enum_table, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_enum(v, prop->name, &width, prop->info->enum_table, errp);
+ if (*errp) {
return;
}
@@ -709,11 +709,11 @@ static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
void qdev_property_add_static(DeviceState *dev, Property *prop,
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
Object *obj = OBJECT(dev);
if (prop->info->create) {
- prop->info->create(obj, prop, &local_err);
+ prop->info->create(obj, prop, errp);
} else {
/*
* TODO qdev_prop_ptr does not have getters or setters. It must
@@ -726,11 +726,10 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
object_property_add(obj, prop->name, prop->info->name,
prop->info->get, prop->info->set,
prop->info->release,
- prop, &local_err);
+ prop, errp);
}
- if (local_err) {
- error_propagate(errp, local_err);
+ if (*errp) {
return;
}
@@ -812,11 +811,11 @@ static bool check_only_migratable(Object *obj, Error **errp)
static void device_set_realized(Object *obj, bool value, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceState *dev = DEVICE(obj);
DeviceClass *dc = DEVICE_GET_CLASS(dev);
HotplugHandler *hotplug_ctrl;
BusState *bus;
- Error *local_err = NULL;
bool unattached_parent = false;
static int unattached_count;
@@ -826,7 +825,7 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
}
if (value && !dev->realized) {
- if (!check_only_migratable(obj, &local_err)) {
+ if (!check_only_migratable(obj, errp)) {
goto fail;
}
@@ -842,15 +841,15 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
hotplug_ctrl = qdev_get_hotplug_handler(dev);
if (hotplug_ctrl) {
- hotplug_handler_pre_plug(hotplug_ctrl, dev, &local_err);
- if (local_err != NULL) {
+ hotplug_handler_pre_plug(hotplug_ctrl, dev, errp);
+ if (*errp) {
goto fail;
}
}
if (dc->realize) {
- dc->realize(dev, &local_err);
- if (local_err != NULL) {
+ dc->realize(dev, errp);
+ if (*errp) {
goto fail;
}
}
@@ -868,15 +867,15 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
if (vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
dev->instance_id_alias,
dev->alias_required_for_version,
- &local_err) < 0) {
+ errp) < 0) {
goto post_realize_fail;
}
}
QLIST_FOREACH(bus, &dev->child_bus, sibling) {
object_property_set_bool(OBJECT(bus), true, "realized",
- &local_err);
- if (local_err != NULL) {
+ errp);
+ if (*errp) {
goto child_realize_fail;
}
}
@@ -886,8 +885,8 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
dev->pending_deleted_event = false;
if (hotplug_ctrl) {
- hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
- if (local_err != NULL) {
+ hotplug_handler_plug(hotplug_ctrl, dev, errp);
+ if (*errp) {
goto child_realize_fail;
}
}
@@ -896,23 +895,23 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
/* We want to catch in local_err only first error */
QLIST_FOREACH(bus, &dev->child_bus, sibling) {
object_property_set_bool(OBJECT(bus), false, "realized",
- local_err ? NULL : &local_err);
+ *errp ? NULL : errp);
}
if (qdev_get_vmsd(dev)) {
vmstate_unregister(dev, qdev_get_vmsd(dev), dev);
}
if (dc->unrealize) {
- dc->unrealize(dev, local_err ? NULL : &local_err);
+ dc->unrealize(dev, *errp ? NULL : errp);
}
dev->pending_deleted_event = true;
DEVICE_LISTENER_CALL(unrealize, Reverse, dev);
- if (local_err != NULL) {
+ if (*errp) {
goto fail;
}
}
- assert(local_err == NULL);
+ assert(*errp == NULL);
dev->realized = value;
return;
@@ -934,7 +933,6 @@ post_realize_fail:
}
fail:
- error_propagate(errp, local_err);
if (unattached_parent) {
object_unparent(OBJECT(dev));
unattached_count--;
@@ -170,17 +170,16 @@ static void qdev_print_devinfos(bool show_no_user)
static int set_property(void *opaque, const char *name, const char *value,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
Object *obj = opaque;
- Error *err = NULL;
if (strcmp(name, "driver") == 0)
return 0;
if (strcmp(name, "bus") == 0)
return 0;
- object_property_parse(obj, value, name, &err);
- if (err != NULL) {
- error_propagate(errp, err);
+ object_property_parse(obj, value, name, errp);
+ if (*errp) {
return -1;
}
return 0;
@@ -564,11 +563,11 @@ void qdev_set_id(DeviceState *dev, const char *id)
DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceClass *dc;
const char *driver, *path;
DeviceState *dev;
BusState *bus = NULL;
- Error *err = NULL;
driver = qemu_opt_get(opts, "driver");
if (!driver) {
@@ -616,9 +615,9 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
dev = DEVICE(object_new(driver));
/* Check whether the hotplug is allowed by the machine */
- if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) {
+ if (qdev_hotplug && !qdev_hotplug_allowed(dev, errp)) {
/* Error must be set in the machine hook */
- assert(err);
+ assert(*errp);
goto err_del_dev;
}
@@ -626,7 +625,7 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
qdev_set_parent_bus(dev, bus);
} else if (qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) {
/* No bus, no machine hotplug handler --> device is not hotpluggable */
- error_setg(&err, "Device '%s' can not be hotplugged on this machine",
+ error_setg(errp, "Device '%s' can not be hotplugged on this machine",
driver);
goto err_del_dev;
}
@@ -634,20 +633,19 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp)
qdev_set_id(dev, qemu_opts_id(opts));
/* set properties */
- if (qemu_opt_foreach(opts, set_property, dev, &err)) {
+ if (qemu_opt_foreach(opts, set_property, dev, errp)) {
goto err_del_dev;
}
dev->opts = opts;
- object_property_set_bool(OBJECT(dev), true, "realized", &err);
- if (err != NULL) {
+ object_property_set_bool(OBJECT(dev), true, "realized", errp);
+ if (*errp) {
dev->opts = NULL;
goto err_del_dev;
}
return dev;
err_del_dev:
- error_propagate(errp, err);
object_unparent(OBJECT(dev));
object_unref(OBJECT(dev));
return NULL;
@@ -749,22 +747,20 @@ void hmp_info_qdm(Monitor *mon, const QDict *qdict)
void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
QemuOpts *opts;
DeviceState *dev;
- opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ opts = qemu_opts_from_qdict(qemu_find_opts("device"), qdict, errp);
+ if (*errp) {
return;
}
if (!monitor_cur_is_qmp() && qdev_device_help(opts)) {
qemu_opts_del(opts);
return;
}
- dev = qdev_device_add(opts, &local_err);
+ dev = qdev_device_add(opts, errp);
if (!dev) {
- error_propagate(errp, local_err);
qemu_opts_del(opts);
return;
}
@@ -802,10 +798,10 @@ static DeviceState *find_device_state(const char *id, Error **errp)
void qdev_unplug(DeviceState *dev, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
DeviceClass *dc = DEVICE_GET_CLASS(dev);
HotplugHandler *hotplug_ctrl;
HotplugHandlerClass *hdc;
- Error *local_err = NULL;
if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
@@ -834,14 +830,13 @@ void qdev_unplug(DeviceState *dev, Error **errp)
* otherwise just remove it synchronously */
hdc = HOTPLUG_HANDLER_GET_CLASS(hotplug_ctrl);
if (hdc->unplug_request) {
- hotplug_handler_unplug_request(hotplug_ctrl, dev, &local_err);
+ hotplug_handler_unplug_request(hotplug_ctrl, dev, errp);
} else {
- hotplug_handler_unplug(hotplug_ctrl, dev, &local_err);
- if (!local_err) {
+ hotplug_handler_unplug(hotplug_ctrl, dev, errp);
+ if (!*errp) {
object_unparent(OBJECT(dev));
}
}
- error_propagate(errp, local_err);
}
void qmp_device_del(const char *id, Error **errp)
@@ -374,6 +374,7 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
int i;
if (!props) {
@@ -382,7 +383,6 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
for (i = 0; i < props->len; i++) {
GlobalProperty *p = g_ptr_array_index(props, i);
- Error *err = NULL;
if (object_dynamic_cast(obj, p->driver) == NULL) {
continue;
@@ -391,9 +391,9 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
continue;
}
p->used = true;
- object_property_parse(obj, p->value, p->property, &err);
- if (err != NULL) {
- error_prepend(&err, "can't apply global %s.%s=%s: ",
+ object_property_parse(obj, p->value, p->property, errp);
+ if (*errp) {
+ error_prepend(errp, "can't apply global %s.%s=%s: ",
p->driver, p->property, p->value);
/*
* If errp != NULL, propagate error and return.
@@ -401,10 +401,9 @@ void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp
* with the remaining globals.
*/
if (errp) {
- error_propagate(errp, err);
return;
} else {
- warn_report_err(err);
+ warn_report_errp(errp);
}
}
}
@@ -496,27 +495,27 @@ void object_initialize_childv(Object *parentobj, const char *propname,
void *childobj, size_t size, const char *type,
Error **errp, va_list vargs)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
Object *obj;
UserCreatable *uc;
object_initialize(childobj, size, type);
obj = OBJECT(childobj);
- object_set_propv(obj, &local_err, vargs);
- if (local_err) {
+ object_set_propv(obj, errp, vargs);
+ if (*errp) {
goto out;
}
- object_property_add_child(parentobj, propname, obj, &local_err);
- if (local_err) {
+ object_property_add_child(parentobj, propname, obj, errp);
+ if (*errp) {
goto out;
}
uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
if (uc) {
- user_creatable_complete(uc, &local_err);
- if (local_err) {
+ user_creatable_complete(uc, errp);
+ if (*errp) {
object_unparent(obj);
goto out;
}
@@ -530,8 +529,7 @@ void object_initialize_childv(Object *parentobj, const char *propname,
object_unref(obj);
out:
- if (local_err) {
- error_propagate(errp, local_err);
+ if (*errp) {
object_unref(obj);
}
}
@@ -670,9 +668,9 @@ Object *object_new_with_propv(const char *typename,
Error **errp,
va_list vargs)
{
+ ERRP_AUTO_PROPAGATE();
Object *obj;
ObjectClass *klass;
- Error *local_err = NULL;
UserCreatable *uc;
klass = object_class_by_name(typename);
@@ -687,21 +685,21 @@ Object *object_new_with_propv(const char *typename,
}
obj = object_new_with_type(klass->type);
- if (object_set_propv(obj, &local_err, vargs) < 0) {
+ if (object_set_propv(obj, errp, vargs) < 0) {
goto error;
}
if (id != NULL) {
- object_property_add_child(parent, id, obj, &local_err);
- if (local_err) {
+ object_property_add_child(parent, id, obj, errp);
+ if (*errp) {
goto error;
}
}
uc = (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
if (uc) {
- user_creatable_complete(uc, &local_err);
- if (local_err) {
+ user_creatable_complete(uc, errp);
+ if (*errp) {
if (id != NULL) {
object_unparent(obj);
}
@@ -713,7 +711,6 @@ Object *object_new_with_propv(const char *typename,
return obj;
error:
- error_propagate(errp, local_err);
object_unref(obj);
return NULL;
}
@@ -738,17 +735,16 @@ int object_set_propv(Object *obj,
Error **errp,
va_list vargs)
{
+ ERRP_AUTO_PROPAGATE();
const char *propname;
- Error *local_err = NULL;
propname = va_arg(vargs, char *);
while (propname != NULL) {
const char *value = va_arg(vargs, char *);
g_assert(value != NULL);
- object_property_parse(obj, value, propname, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ object_property_parse(obj, value, propname, errp);
+ if (*errp) {
return -1;
}
propname = va_arg(vargs, char *);
@@ -1430,7 +1426,7 @@ typedef struct EnumProperty {
int object_property_get_enum(Object *obj, const char *name,
const char *typename, Error **errp)
{
- Error *err = NULL;
+ ERRP_AUTO_PROPAGATE();
Visitor *v;
char *str;
int ret;
@@ -1451,9 +1447,8 @@ int object_property_get_enum(Object *obj, const char *name,
enumprop = prop->opaque;
v = string_output_visitor_new(false, &str);
- object_property_get(obj, v, name, &err);
- if (err) {
- error_propagate(errp, err);
+ object_property_get(obj, v, name, errp);
+ if (*errp) {
visit_free(v);
return 0;
}
@@ -1471,14 +1466,13 @@ int object_property_get_enum(Object *obj, const char *name,
void object_property_get_uint16List(Object *obj, const char *name,
uint16List **list, Error **errp)
{
- Error *err = NULL;
+ ERRP_AUTO_PROPAGATE();
Visitor *v;
char *str;
v = string_output_visitor_new(false, &str);
- object_property_get(obj, v, name, &err);
- if (err) {
- error_propagate(errp, err);
+ object_property_get(obj, v, name, errp);
+ if (*errp) {
goto out;
}
visit_complete(v, &str);
@@ -1502,14 +1496,13 @@ void object_property_parse(Object *obj, const char *string,
char *object_property_print(Object *obj, const char *name, bool human,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
Visitor *v;
char *string = NULL;
- Error *local_err = NULL;
v = string_output_visitor_new(human, &string);
- object_property_get(obj, v, name, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ object_property_get(obj, v, name, errp);
+ if (*errp) {
goto out;
}
@@ -1589,7 +1582,7 @@ static void object_finalize_child_property(Object *obj, const char *name,
void object_property_add_child(Object *obj, const char *name,
Object *child, Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
gchar *type;
ObjectProperty *op;
@@ -1601,9 +1594,8 @@ void object_property_add_child(Object *obj, const char *name,
type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
op = object_property_add(obj, name, type, object_get_child_property, NULL,
- object_finalize_child_property, child, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ object_finalize_child_property, child, errp);
+ if (*errp) {
goto out;
}
@@ -1689,28 +1681,26 @@ static void object_set_link_property(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
LinkProperty *prop = opaque;
Object **child = prop->child;
Object *old_target = *child;
Object *new_target = NULL;
char *path = NULL;
- visit_type_str(v, name, &path, &local_err);
+ visit_type_str(v, name, &path, errp);
- if (!local_err && strcmp(path, "") != 0) {
- new_target = object_resolve_link(obj, name, path, &local_err);
+ if (!*errp && strcmp(path, "") != 0) {
+ new_target = object_resolve_link(obj, name, path, errp);
}
g_free(path);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (*errp) {
return;
}
- prop->check(obj, name, new_target, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop->check(obj, name, new_target, errp);
+ if (*errp) {
return;
}
@@ -1746,7 +1736,7 @@ void object_property_add_link(Object *obj, const char *name,
ObjectPropertyLinkFlags flags,
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
LinkProperty *prop = g_malloc(sizeof(*prop));
gchar *full_type;
ObjectProperty *op;
@@ -1762,9 +1752,8 @@ void object_property_add_link(Object *obj, const char *name,
check ? object_set_link_property : NULL,
object_release_link_property,
prop,
- &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ errp);
+ if (*errp) {
g_free(prop);
goto out;
}
@@ -1959,13 +1948,12 @@ typedef struct StringProperty
static void property_get_str(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
StringProperty *prop = opaque;
char *value;
- Error *err = NULL;
- value = prop->get(obj, &err);
- if (err) {
- error_propagate(errp, err);
+ value = prop->get(obj, errp);
+ if (*errp) {
return;
}
@@ -1976,13 +1964,12 @@ static void property_get_str(Object *obj, Visitor *v, const char *name,
static void property_set_str(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
StringProperty *prop = opaque;
char *value;
- Error *local_err = NULL;
- visit_type_str(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_str(v, name, &value, errp);
+ if (*errp) {
return;
}
@@ -2002,7 +1989,7 @@ void object_property_add_str(Object *obj, const char *name,
void (*set)(Object *, const char *, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
StringProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2012,9 +1999,8 @@ void object_property_add_str(Object *obj, const char *name,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
property_release_str,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2025,7 +2011,7 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
StringProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2035,9 +2021,8 @@ void object_class_property_add_str(ObjectClass *klass, const char *name,
get ? property_get_str : NULL,
set ? property_set_str : NULL,
property_release_str,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2051,13 +2036,12 @@ typedef struct BoolProperty
static void property_get_bool(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
BoolProperty *prop = opaque;
bool value;
- Error *err = NULL;
- value = prop->get(obj, &err);
- if (err) {
- error_propagate(errp, err);
+ value = prop->get(obj, errp);
+ if (*errp) {
return;
}
@@ -2067,13 +2051,12 @@ static void property_get_bool(Object *obj, Visitor *v, const char *name,
static void property_set_bool(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
BoolProperty *prop = opaque;
bool value;
- Error *local_err = NULL;
- visit_type_bool(v, name, &value, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ visit_type_bool(v, name, &value, errp);
+ if (*errp) {
return;
}
@@ -2092,7 +2075,7 @@ void object_property_add_bool(Object *obj, const char *name,
void (*set)(Object *, bool, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
BoolProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2102,9 +2085,8 @@ void object_property_add_bool(Object *obj, const char *name,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
property_release_bool,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2114,7 +2096,7 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
void (*set)(Object *, bool, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
BoolProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2124,9 +2106,8 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
get ? property_get_bool : NULL,
set ? property_set_bool : NULL,
property_release_bool,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2134,13 +2115,12 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
static void property_get_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
EnumProperty *prop = opaque;
int value;
- Error *err = NULL;
- value = prop->get(obj, &err);
- if (err) {
- error_propagate(errp, err);
+ value = prop->get(obj, errp);
+ if (*errp) {
return;
}
@@ -2150,13 +2130,12 @@ static void property_get_enum(Object *obj, Visitor *v, const char *name,
static void property_set_enum(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
EnumProperty *prop = opaque;
int value;
- Error *err = NULL;
- visit_type_enum(v, name, &value, prop->lookup, &err);
- if (err) {
- error_propagate(errp, err);
+ visit_type_enum(v, name, &value, prop->lookup, errp);
+ if (*errp) {
return;
}
prop->set(obj, value, errp);
@@ -2176,7 +2155,7 @@ void object_property_add_enum(Object *obj, const char *name,
void (*set)(Object *, int, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
EnumProperty *prop = g_malloc(sizeof(*prop));
prop->lookup = lookup;
@@ -2187,9 +2166,8 @@ void object_property_add_enum(Object *obj, const char *name,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
property_release_enum,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2201,7 +2179,7 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
void (*set)(Object *, int, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
EnumProperty *prop = g_malloc(sizeof(*prop));
prop->lookup = lookup;
@@ -2212,9 +2190,8 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
get ? property_get_enum : NULL,
set ? property_set_enum : NULL,
property_release_enum,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2226,48 +2203,46 @@ typedef struct TMProperty {
static void property_get_tm(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
TMProperty *prop = opaque;
- Error *err = NULL;
struct tm value;
- prop->get(obj, &value, &err);
- if (err) {
- goto out;
+ prop->get(obj, &value, errp);
+ if (*errp) {
+ return;
}
- visit_start_struct(v, name, NULL, 0, &err);
- if (err) {
- goto out;
+ visit_start_struct(v, name, NULL, 0, errp);
+ if (*errp) {
+ return;
}
- visit_type_int32(v, "tm_year", &value.tm_year, &err);
- if (err) {
+ visit_type_int32(v, "tm_year", &value.tm_year, errp);
+ if (*errp) {
goto out_end;
}
- visit_type_int32(v, "tm_mon", &value.tm_mon, &err);
- if (err) {
+ visit_type_int32(v, "tm_mon", &value.tm_mon, errp);
+ if (*errp) {
goto out_end;
}
- visit_type_int32(v, "tm_mday", &value.tm_mday, &err);
- if (err) {
+ visit_type_int32(v, "tm_mday", &value.tm_mday, errp);
+ if (*errp) {
goto out_end;
}
- visit_type_int32(v, "tm_hour", &value.tm_hour, &err);
- if (err) {
+ visit_type_int32(v, "tm_hour", &value.tm_hour, errp);
+ if (*errp) {
goto out_end;
}
- visit_type_int32(v, "tm_min", &value.tm_min, &err);
- if (err) {
+ visit_type_int32(v, "tm_min", &value.tm_min, errp);
+ if (*errp) {
goto out_end;
}
- visit_type_int32(v, "tm_sec", &value.tm_sec, &err);
- if (err) {
+ visit_type_int32(v, "tm_sec", &value.tm_sec, errp);
+ if (*errp) {
goto out_end;
}
- visit_check_struct(v, &err);
+ visit_check_struct(v, errp);
out_end:
visit_end_struct(v, NULL);
-out:
- error_propagate(errp, err);
}
@@ -2282,7 +2257,7 @@ void object_property_add_tm(Object *obj, const char *name,
void (*get)(Object *, struct tm *, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
TMProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2290,9 +2265,8 @@ void object_property_add_tm(Object *obj, const char *name,
object_property_add(obj, name, "struct tm",
get ? property_get_tm : NULL, NULL,
property_release_tm,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2301,7 +2275,7 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
void (*get)(Object *, struct tm *, Error **),
Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
TMProperty *prop = g_malloc0(sizeof(*prop));
prop->get = get;
@@ -2309,9 +2283,8 @@ void object_class_property_add_tm(ObjectClass *klass, const char *name,
object_class_property_add(klass, name, "struct tm",
get ? property_get_tm : NULL, NULL,
property_release_tm,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
}
}
@@ -2446,11 +2419,11 @@ void object_property_add_alias(Object *obj, const char *name,
Object *target_obj, const char *target_name,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
AliasProperty *prop;
ObjectProperty *op;
ObjectProperty *target_prop;
gchar *prop_type;
- Error *local_err = NULL;
target_prop = object_property_find(target_obj, target_name, errp);
if (!target_prop) {
@@ -2472,9 +2445,8 @@ void object_property_add_alias(Object *obj, const char *name,
property_get_alias,
property_set_alias,
property_release_alias,
- prop, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ prop, errp);
+ if (*errp) {
g_free(prop);
goto out;
}
@@ -33,10 +33,10 @@ Object *user_creatable_add_type(const char *type, const char *id,
const QDict *qdict,
Visitor *v, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
Object *obj;
ObjectClass *klass;
const QDictEntry *e;
- Error *local_err = NULL;
klass = object_class_by_name(type);
if (!klass) {
@@ -57,34 +57,34 @@ Object *user_creatable_add_type(const char *type, const char *id,
assert(qdict);
obj = object_new(type);
- visit_start_struct(v, NULL, NULL, 0, &local_err);
- if (local_err) {
+ visit_start_struct(v, NULL, NULL, 0, errp);
+ if (*errp) {
goto out;
}
for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
- object_property_set(obj, v, e->key, &local_err);
- if (local_err) {
+ object_property_set(obj, v, e->key, errp);
+ if (*errp) {
break;
}
}
- if (!local_err) {
- visit_check_struct(v, &local_err);
+ if (!*errp) {
+ visit_check_struct(v, errp);
}
visit_end_struct(v, NULL);
- if (local_err) {
+ if (*errp) {
goto out;
}
if (id != NULL) {
object_property_add_child(object_get_objects_root(),
- id, obj, &local_err);
- if (local_err) {
+ id, obj, errp);
+ if (*errp) {
goto out;
}
}
- user_creatable_complete(USER_CREATABLE(obj), &local_err);
- if (local_err) {
+ user_creatable_complete(USER_CREATABLE(obj), errp);
+ if (*errp) {
if (id != NULL) {
object_property_del(object_get_objects_root(),
id, &error_abort);
@@ -92,8 +92,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
goto out;
}
out:
- if (local_err) {
- error_propagate(errp, local_err);
+ if (*errp) {
object_unref(obj);
return NULL;
}
@@ -30,16 +30,15 @@ void object_property_set_qobject(Object *obj, QObject *value,
QObject *object_property_get_qobject(Object *obj, const char *name,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
QObject *ret = NULL;
- Error *local_err = NULL;
Visitor *v;
v = qobject_output_visitor_new(&ret);
- object_property_get(obj, v, name, &local_err);
- if (!local_err) {
+ object_property_get(obj, v, name, errp);
+ if (!*errp) {
visit_complete(v, &ret);
}
- error_propagate(errp, local_err);
visit_free(v);
return ret;
}
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 <kwolf@redhat.com> Reported-by: Greg Kurz <groug@kaod.org> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- hw/core/qdev-properties-system.c | 28 ++-- hw/core/qdev-properties.c | 89 +++++------ hw/core/qdev.c | 40 +++-- qdev-monitor.c | 41 +++--- qom/object.c | 246 ++++++++++++++----------------- qom/object_interfaces.c | 27 ++-- qom/qom-qobject.c | 7 +- 7 files changed, 212 insertions(+), 266 deletions(-)