From: Markus Armbruster <armbru@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
Eduardo Habkost <eduardo@habkost.net>
Subject: Re: [PATCH] qom: use ERRP_GUARD in user_creatable_complete
Date: Fri, 19 Sep 2025 14:06:10 +0200 [thread overview]
Message-ID: <87v7lezlxp.fsf@pond.sub.org> (raw)
In-Reply-To: <aM1BhOI4yE2SBNz_@redhat.com> ("Daniel P. Berrangé"'s message of "Fri, 19 Sep 2025 12:41:56 +0100")
Daniel P. Berrangé <berrange@redhat.com> writes:
> On Fri, Sep 19, 2025 at 01:30:18PM +0200, Markus Armbruster wrote:
>> Daniel P. Berrangé <berrange@redhat.com> writes:
>>
>> > With error_propagate, the stack trace from any error_abort/fatal
>> > usage will start from the error_propagate() call, which is largely
>> > useless. Using ERRP_GUARD ensures the stack trace starts from
>> > the origin that reported the error.
>>
>> Yes.
>>
>> I've been chipping at error_propagate() uses on and off for a while.
>> There are hundreds left.
>
> Are there cases where it is still OK to use error_propagate or should
> we be looking to eliminate all its usage ?
The common use of error_propagate() is to propagate an error received
from a function to the caller. This is better done with ERRP_GUARD().
qapi/error.h:
* Call a function, receive an error from it, and pass it to the caller
* - when the function returns a value that indicates failure, say
* false:
* if (!foo(arg, errp)) {
* handle the error...
* }
* - when it does not, say because it is a void function:
* ERRP_GUARD();
* foo(arg, errp);
* if (*errp) {
* handle the error...
* }
* More on ERRP_GUARD() below.
*
* Code predating ERRP_GUARD() still exists, and looks like this:
* Error *err = NULL;
* foo(arg, &err);
* if (err) {
* handle the error...
* error_propagate(errp, err); // deprecated
* }
We occasionally store errors on the heap, and use error_propagate() to move
them into an @errp argument. qapi/error.h:
* Pass an existing error to the caller:
* error_propagate(errp, err);
* This is rarely needed. When @err is a local variable, use of
* ERRP_GUARD() commonly results in more readable code.
error_propagate() can also be used to accumulate errors. This cannot be
done with ERRP_GUARD(). qapi/error.h:
* Receive and accumulate multiple errors (first one wins):
* Error *err = NULL, *local_err = NULL;
* foo(arg, &err);
* bar(arg, &local_err);
* error_propagate(&err, local_err);
* if (err) {
* handle the error...
* }
Accumulating errors is commonly a bad idea. Note that
g_propagate_error() explicitly prohibits such usage. We deviated from
it.
The *possibility* of intentional error acculumation makes conversions to
ERRP_GUARD() harder. Perhaps we should track down all uses of error
accumulation, then change error_propagate() to prohibit it.
[...]
prev parent reply other threads:[~2025-09-19 12:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-19 10:15 [PATCH] qom: use ERRP_GUARD in user_creatable_complete Daniel P. Berrangé
2025-09-19 10:33 ` Paolo Bonzini
2025-09-19 11:30 ` Markus Armbruster
2025-09-19 11:41 ` Daniel P. Berrangé
2025-09-19 12:06 ` Markus Armbruster [this message]
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=87v7lezlxp.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=eduardo@habkost.net \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.