Eric Blake <ebl...@redhat.com> writes: > On 05/28/2015 06:21 AM, Markus Armbruster wrote: >> Retain the function value for now, to permit selective conversion of >> its callers. >> >> Signed-off-by: Markus Armbruster <arm...@redhat.com> >> --- >> block/blkdebug.c | 6 ++-- >> hw/core/qdev-properties-system.c | 5 +-- >> include/qemu/option.h | 4 +-- >> include/ui/console.h | 2 +- >> net/net.c | 9 ++--- >> net/vhost-user.c | 4 +-- >> numa.c | 5 +-- >> tpm.c | 6 ++-- >> ui/vnc.c | 2 +- >> util/qemu-config.c | 4 +-- >> util/qemu-option.c | 7 ++-- >> vl.c | 72 >> ++++++++++++++++++++++++---------------- >> 12 files changed, 72 insertions(+), 54 deletions(-) >> > >> diff --git a/block/blkdebug.c b/block/blkdebug.c >> index 58f5105..50ef1fc 100644 >> --- a/block/blkdebug.c >> +++ b/block/blkdebug.c >> @@ -219,7 +219,7 @@ struct add_rule_data { >> Error **errp; >> }; >> >> -static int add_rule(QemuOpts *opts, void *opaque) >> +static int add_rule(void *opaque, QemuOpts *opts, Error **errp) > >> +++ b/include/qemu/option.h >> @@ -125,9 +125,9 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const >> QDict *qdict, >> QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict); >> void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp); >> >> -typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque); >> +typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error >> **errp); > > Might be nice to justify in the commit message why swapping the > arguments of the callback made sense. But doesn't affect code > correctness, so: > > Reviewed-by: Eric Blake <ebl...@redhat.com>
Not sure what to write. Not even quite sure why I like it better this way, only that I do. Could be because it puts the object we're modifying (when we modify any of the argument objects) on the left. >> +++ b/util/qemu-option.c >> @@ -1047,13 +1047,14 @@ void qemu_opts_validate(QemuOpts *opts, const >> QemuOptDesc *desc, Error **errp) >> } >> >> /** >> - * For each member of @list, call @func(member, @opaque). >> + * For each member of @list, call @func(@opaque, member, @errp). >> * Call it with the current location temporarily set to the member's. >> + * @func() may store an Error through @errp, but must return non-zero then. >> * When @func() returns non-zero, break the loop and return that value. >> * Return zero when the loop completes. >> */ >> int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, >> - void *opaque) >> + void *opaque, Error **errp) >> { >> Location loc; >> QemuOpts *opts; >> @@ -1062,7 +1063,7 @@ int qemu_opts_foreach(QemuOptsList *list, >> qemu_opts_loopfunc func, >> loc_push_none(&loc); >> QTAILQ_FOREACH(opts, &list->head, next) { >> loc_restore(&opts->loc); >> - rc = func(opts, opaque); >> + rc = func(opaque, opts, errp); >> if (rc) { >> return rc; >> } > > Do you want to enforce that if errp is set, that rc is non-zero, to > match your contract? Perhaps by assert(!*errp) at this point? But if > the return value goes away later in the series in favor of only using > errp, it may be a moot question. assert(!*errp) is incorrect, because callers may pass a null errp to ignore errors. Could do if (rc) { return rc; } assert(!errp || !*errp); Catches misbehaving func() only when caller passes non-null errp. To catcht it always, we'd need to use Error *err here, and error_propagate(errp, err). I doubt it's worth the trouble. What do you think?