From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>,
"Paul Burton" <pburton@wavecomp.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Jeff Cody" <codyprime@gmail.com>,
"Jason Wang" <jasowang@redhat.com>,
"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
"Michael Roth" <mdroth@linux.vnet.ibm.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Subbaraya Sundeep" <sundeep.lkml@gmail.com>,
qemu-block@nongnu.org, "Juan Quintela" <quintela@redhat.com>,
"Aleksandar Rikalo" <arikalo@wavecomp.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Halil Pasic" <pasic@linux.ibm.com>,
"Christian Borntraeger" <borntraeger@de.ibm.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"David Gibson" <david@gibson.dropbear.id.au>,
"Eric Farman" <farman@linux.ibm.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Greg Kurz" <groug@kaod.org>,
"Yuval Shaia" <yuval.shaia@oracle.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Alex Williamson" <alex.williamson@redhat.com>,
integration@gluster.org, "David Hildenbrand" <david@redhat.com>,
"John Snow" <jsnow@redhat.com>,
"Richard Henderson" <rth@twiddle.net>,
"Kevin Wolf" <kwolf@redhat.com>,
vsementsov@virtuozzo.com,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Cornelia Huck" <cohuck@redhat.com>,
qemu-s390x@nongnu.org, "Max Reitz" <mreitz@redhat.com>,
qemu-arm@nongnu.org, qemu-ppc@nongnu.org,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [PATCH v3 04/25] error: auto propagated local_err
Date: Tue, 24 Sep 2019 23:08:41 +0300 [thread overview]
Message-ID: <20190924200902.4703-5-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20190924200902.4703-1-vsementsov@virtuozzo.com>
Here is introduced ERRP_FUNCTION_BEGIN macro, to be used at start of
functions with errp parameter.
It has three goals:
1. Fix issue with error_fatal & error_append_hint: user can't see these
hints, because exit() happens in error_setg earlier than hint is
appended. [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@virtuozzo.com>
---
CC: John Snow <jsnow@redhat.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Max Reitz <mreitz@redhat.com>
CC: Fam Zheng <fam@euphon.net>
CC: Jeff Cody <codyprime@gmail.com>
CC: "Marc-André Lureau" <marcandre.lureau@redhat.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Greg Kurz <groug@kaod.org>
CC: Subbaraya Sundeep <sundeep.lkml@gmail.com>
CC: Peter Maydell <peter.maydell@linaro.org>
CC: Paul Burton <pburton@wavecomp.com>
CC: Aleksandar Rikalo <arikalo@wavecomp.com>
CC: "Michael S. Tsirkin" <mst@redhat.com>
CC: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
CC: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: David Gibson <david@gibson.dropbear.id.au>
CC: Yuval Shaia <yuval.shaia@oracle.com>
CC: Cornelia Huck <cohuck@redhat.com>
CC: Eric Farman <farman@linux.ibm.com>
CC: Richard Henderson <rth@twiddle.net>
CC: David Hildenbrand <david@redhat.com>
CC: Halil Pasic <pasic@linux.ibm.com>
CC: Christian Borntraeger <borntraeger@de.ibm.com>
CC: Gerd Hoffmann <kraxel@redhat.com>
CC: Alex Williamson <alex.williamson@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>
CC: Michael Roth <mdroth@linux.vnet.ibm.com>
CC: Juan Quintela <quintela@redhat.com>
CC: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
CC: Eric Blake <eblake@redhat.com>
CC: Jason Wang <jasowang@redhat.com>
CC: "Daniel P. Berrangé" <berrange@redhat.com>
CC: Eduardo Habkost <ehabkost@redhat.com>
CC: qemu-block@nongnu.org
CC: qemu-devel@nongnu.org
CC: integration@gluster.org
CC: qemu-arm@nongnu.org
CC: qemu-ppc@nongnu.org
CC: qemu-s390x@nongnu.org
include/qapi/error.h | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/include/qapi/error.h b/include/qapi/error.h
index 9376f59c35..fb41f7a790 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -322,6 +322,41 @@ 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_FUNCTION_BEGIN
+ *
+ * This macro is created to be the first line of a function with Error **errp
+ * parameter.
+ *
+ * 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_FUNCTION_BEGIN() \
+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
next prev parent reply other threads:[~2019-09-24 20:13 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-24 20:08 [PATCH v3 00/25] error: auto propagated local_err Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 01/25] errp: rename errp to errp_in where it is IN-argument Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 02/25] hw/core/loader-fit: fix freeing errp in fit_load_fdt Vladimir Sementsov-Ogievskiy
2019-09-24 20:38 ` Eric Blake
2019-09-25 7:24 ` Vladimir Sementsov-Ogievskiy
2019-09-25 7:45 ` Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 03/25] net/net: fix local variable shadowing in net_client_init Vladimir Sementsov-Ogievskiy
2019-09-24 20:39 ` Eric Blake
2019-09-24 20:08 ` Vladimir Sementsov-Ogievskiy [this message]
2019-09-24 20:46 ` [PATCH v3 04/25] error: auto propagated local_err Eric Blake
2019-09-24 20:46 ` Eric Blake
2019-09-30 15:12 ` Kevin Wolf
2019-09-30 15:12 ` Kevin Wolf
2019-09-30 15:19 ` Vladimir Sementsov-Ogievskiy
2019-09-30 15:19 ` Vladimir Sementsov-Ogievskiy
2019-09-30 16:00 ` Kevin Wolf
2019-09-30 16:00 ` Kevin Wolf
2019-09-30 16:26 ` Vladimir Sementsov-Ogievskiy
2019-09-30 16:26 ` Vladimir Sementsov-Ogievskiy
2019-09-30 16:39 ` Kevin Wolf
2019-09-30 16:39 ` Kevin Wolf
2019-10-01 8:39 ` Vladimir Sementsov-Ogievskiy
2019-10-01 8:39 ` Vladimir Sementsov-Ogievskiy
2019-10-01 9:19 ` Kevin Wolf
2019-10-01 9:19 ` Kevin Wolf
2019-09-24 20:08 ` [PATCH v3 05/25] scripts: add coccinelle script to fix error_append_hint usage Vladimir Sementsov-Ogievskiy
2019-09-24 20:48 ` Eric Blake
2019-09-25 16:06 ` Vladimir Sementsov-Ogievskiy
2019-09-25 16:06 ` Vladimir Sementsov-Ogievskiy
2019-09-24 20:52 ` Eric Blake
2019-09-24 20:08 ` [PATCH v3 06/25] python: add commit-per-subsystem.py Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 07/25] s390: Fix error_append_hint usage Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 08/25] ARM TCG CPUs: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 09/25] PowerPC " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 10/25] arm: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 11/25] SmartFusion2: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 12/25] PCI: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 13/25] SCSI: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 14/25] USB: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 15/25] VFIO: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 16/25] virtio: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 17/25] virtio-9p: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 18/25] block: " Vladimir Sementsov-Ogievskiy
2019-09-24 21:03 ` Eric Blake
2019-09-24 20:08 ` [PATCH v3 19/25] chardev: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 20/25] cmdline: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 21/25] QOM: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:08 ` [PATCH v3 22/25] Migration: " Vladimir Sementsov-Ogievskiy
2019-09-24 20:09 ` [PATCH v3 23/25] Sockets: " Vladimir Sementsov-Ogievskiy
2019-09-24 21:07 ` Eric Blake
2019-09-24 20:09 ` [PATCH v3 24/25] nbd: " Vladimir Sementsov-Ogievskiy
2019-09-24 21:12 ` Eric Blake
2019-09-25 7:39 ` Vladimir Sementsov-Ogievskiy
2019-09-24 20:09 ` [PATCH v3 25/25] PVRDMA: " Vladimir Sementsov-Ogievskiy
2019-09-25 10:09 ` [PATCH v3 00/25] error: auto propagated local_err no-reply
2019-09-25 10:16 ` Vladimir Sementsov-Ogievskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190924200902.4703-5-vsementsov@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=alex.williamson@redhat.com \
--cc=arikalo@wavecomp.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=codyprime@gmail.com \
--cc=cohuck@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=ehabkost@redhat.com \
--cc=fam@euphon.net \
--cc=farman@linux.ibm.com \
--cc=groug@kaod.org \
--cc=integration@gluster.org \
--cc=jasowang@redhat.com \
--cc=jsnow@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=pburton@wavecomp.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=quintela@redhat.com \
--cc=rth@twiddle.net \
--cc=sundeep.lkml@gmail.com \
--cc=yuval.shaia@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.