Kevin Wolf <kw...@redhat.com> writes: > Am 18.03.2014 um 11:09 hat Markus Armbruster geschrieben: >> Kevin Wolf <kw...@redhat.com> writes: >> >> > It takes an errp argument. That's enough for error handling. >> > >> > Signed-off-by: Kevin Wolf <kw...@redhat.com> >> > --- >> > block.c | 21 ++++++++++----------- >> > 1 file changed, 10 insertions(+), 11 deletions(-) >> > >> > diff --git a/block.c b/block.c >> > index acb70fd..b4f3f77 100644 >> > --- a/block.c >> > +++ b/block.c >> > @@ -783,18 +783,18 @@ static int bdrv_open_flags(BlockDriverState *bs, int >> > flags) >> > return open_flags; >> > } >> > >> > -static int bdrv_assign_node_name(BlockDriverState *bs, >> > - const char *node_name, >> > - Error **errp) >> > +static void bdrv_assign_node_name(BlockDriverState *bs, >> > + const char *node_name, >> > + Error **errp) >> > { >> > if (!node_name) { >> > - return 0; >> > + return; >> > } >> > >> > /* empty string node name is invalid */ >> > if (node_name[0] == '\0') { >> > error_setg(errp, "Empty node name"); >> > - return -EINVAL; >> > + return; >> > } >> > >> > /* takes care of avoiding namespaces collisions */ >> > @@ -807,14 +807,12 @@ static int bdrv_assign_node_name(BlockDriverState >> > *bs, >> > /* takes care of avoiding duplicates node names */ >> > if (bdrv_find_node(node_name)) { >> > error_setg(errp, "Duplicate node name"); >> > - return -EINVAL; >> > + return; >> > } >> > >> > /* copy node name into the bs and insert it into the graph list */ >> > pstrcpy(bs->node_name, sizeof(bs->node_name), node_name); >> > QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs, node_list); >> > - >> > - return 0; >> > } >> > >> > /* >> > @@ -849,9 +847,10 @@ static int bdrv_open_common(BlockDriverState *bs, >> > BlockDriverState *file, >> > trace_bdrv_open_common(bs, filename ?: "", flags, drv->format_name); >> > >> > node_name = qdict_get_try_str(options, "node-name"); >> > - ret = bdrv_assign_node_name(bs, node_name, errp); >> > - if (ret < 0) { >> > - return ret; >> > + bdrv_assign_node_name(bs, node_name, &local_err); >> > + if (error_is_set(&local_err)) { >> > + error_propagate(errp, local_err); >> > + return -EINVAL; >> > } >> > qdict_del(options, "node-name"); >> >> Please use 'if (local_err)' instead of 'if (error_is_set(&local_err))'. >> See commit 84d18f0. > > I can do that; this patch predates your change and I just dug it out > from an old branch.
No harm done :) > Note that there are still many places that use > error_is_set() where it's not necessary, including documentation that > should show how to do things right, e.g. docs/writing-qmp-commands.txt. The documentation I simply missed. The others probably crept in after I prepared the patch that became commit 84d18f0. Such things usually take an extra iteration or two. > (By the way, would the actual problem with Coverity in commit 84d18f0 > not be fixed more easily and for all instances by making error_is_set() > a static inline function in the header?) I wouldn't bet on it. Coverity is pretty good at looking through compilation unit boundaries, but it gets easily spooked by null tests. > What was the proper use case for error_is_set() again? Or can we get rid > of it? As long as it's there, you'll keep getting new offenders. I don't like it myself, and I think we can get rid of it.