[GEDI] [PATCH v4 04/31] error: auto propagated local_err
Vladimir Sementsov-Ogievskiy
vsementsov at virtuozzo.com
Tue Oct 1 15:52:52 UTC 2019
Here is introduced ERRP_AUTO_PROPAGATE macro, to be used at start of
functions with errp OUT parameter.
It has three goals:
1. Fix issue with error_fatal & error_prepend/error_append_hint: user
can't see this additional information, because exit() happens in
error_setg earlier than information is added. [Reported by Greg Kurz]
2. Fix issue with error_abort & error_propagate: when we wrap
error_abort by local_err+error_propagate, resulting coredump will
refer to error_propagate and not to the place where error happened.
(the macro itself doesn't fix the issue, but it allows to [3.] drop all
local_err+error_propagate pattern, which will definitely fix the issue)
[Reported by Kevin Wolf]
3. Drop local_err+error_propagate pattern, which is used to workaround
void functions with errp parameter, when caller wants to know resulting
status. (Note: actually these functions could be merely updated to
return int error code).
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov at virtuozzo.com>
---
CC: kwolf at redhat.com
CC: mreitz at redhat.com
CC: jsnow at redhat.com
CC: fam at euphon.net
CC: sw at weilnetz.de
CC: codyprime at gmail.com
CC: marcandre.lureau at redhat.com
CC: pbonzini at redhat.com
CC: groug at kaod.org
CC: sundeep.lkml at gmail.com
CC: peter.maydell at linaro.org
CC: stefanha at redhat.com
CC: pburton at wavecomp.com
CC: arikalo at wavecomp.com
CC: berrange at redhat.com
CC: ehabkost at redhat.com
CC: david at gibson.dropbear.id.au
CC: clg at kaod.org
CC: mst at redhat.com
CC: marcel.apfelbaum at gmail.com
CC: mark.cave-ayland at ilande.co.uk
CC: yuval.shaia at oracle.com
CC: cohuck at redhat.com
CC: farman at linux.ibm.com
CC: rth at twiddle.net
CC: david at redhat.com
CC: pasic at linux.ibm.com
CC: borntraeger at de.ibm.com
CC: kraxel at redhat.com
CC: alex.williamson at redhat.com
CC: andrew at aj.id.au
CC: joel at jms.id.au
CC: eblake at redhat.com
CC: armbru at redhat.com
CC: mdroth at linux.vnet.ibm.com
CC: quintela at redhat.com
CC: dgilbert at redhat.com
CC: jasowang at redhat.com
CC: qemu-block at nongnu.org
CC: integration at gluster.org
CC: qemu-arm at nongnu.org
CC: qemu-ppc at nongnu.org
CC: qemu-s390x at nongnu.org
include/qapi/error.h | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/include/qapi/error.h b/include/qapi/error.h
index 9376f59c35..02f967ac1d 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -322,6 +322,43 @@ void error_set_internal(Error **errp,
ErrorClass err_class, const char *fmt, ...)
GCC_FMT_ATTR(6, 7);
+typedef struct ErrorPropagator {
+ Error *local_err;
+ Error **errp;
+} ErrorPropagator;
+
+static inline void error_propagator_cleanup(ErrorPropagator *prop)
+{
+ error_propagate(prop->errp, prop->local_err);
+}
+
+G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(ErrorPropagator, error_propagator_cleanup);
+
+/*
+ * ERRP_AUTO_PROPAGATE
+ *
+ * This macro is created to be the first line of a function with Error **errp
+ * OUT parameter. It's needed only in cases where we want to use error_prepend,
+ * error_append_hint or dereference *errp. It's still safe (but useless) in
+ * other cases.
+ *
+ * If errp is NULL or points to error_fatal, it is rewritten to point to a
+ * local Error object, which will be automatically propagated to the original
+ * errp on function exit (see error_propagator_cleanup).
+ *
+ * After invocation of this macro it is always safe to dereference errp
+ * (as it's not NULL anymore) and to append hints (by error_append_hint)
+ * (as, if it was error_fatal, we swapped it with a local_error to be
+ * propagated on cleanup).
+ *
+ * Note: we don't wrap the error_abort case, as we want resulting coredump
+ * to point to the place where the error happened, not to error_propagate.
+ */
+#define ERRP_AUTO_PROPAGATE() \
+g_auto(ErrorPropagator) __auto_errp_prop = {.errp = errp}; \
+errp = ((errp == NULL || *errp == error_fatal) ? \
+ &__auto_errp_prop.local_err : errp)
+
/*
* Special error destination to abort on error.
* See error_setg() and error_propagate() for details.
--
2.21.0
More information about the integration
mailing list