qmp: Don't use error_is_set() to suppress additional errors

Using error_is_set(errp) that way can sweep programming errors under
the carpet when we get called incorrectly with an error set.

encrypted_bdrv_it() does it, because there's no way to make
bdrv_iterate() break its loop.  Actually safe, because qmp_cont()
clears the error before the loop.  Clean it up anyway: replace
bdrv_iterate() by bdrv_next(), break the loop on error.

Replace both occurrences, for consistency.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
master
Markus Armbruster 2014-05-02 13:26:42 +02:00 committed by Luiz Capitulino
parent 66ef8bd9c1
commit ab31979a7e
1 changed files with 11 additions and 21 deletions

32
qmp.c
View File

@ -146,24 +146,9 @@ SpiceInfo *qmp_query_spice(Error **errp)
};
#endif
static void iostatus_bdrv_it(void *opaque, BlockDriverState *bs)
{
bdrv_iostatus_reset(bs);
}
static void encrypted_bdrv_it(void *opaque, BlockDriverState *bs)
{
Error **errp = opaque;
if (!error_is_set(errp) && bdrv_key_required(bs)) {
error_set(errp, QERR_DEVICE_ENCRYPTED, bdrv_get_device_name(bs),
bdrv_get_encrypted_filename(bs));
}
}
void qmp_cont(Error **errp)
{
Error *local_err = NULL;
BlockDriverState *bs;
if (runstate_needs_reset()) {
error_setg(errp, "Resetting the Virtual Machine is required");
@ -172,11 +157,16 @@ void qmp_cont(Error **errp)
return;
}
bdrv_iterate(iostatus_bdrv_it, NULL);
bdrv_iterate(encrypted_bdrv_it, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
bdrv_iostatus_reset(bs);
}
for (bs = bdrv_next(NULL); bs; bs = bdrv_next(bs)) {
if (bdrv_key_required(bs)) {
error_set(errp, QERR_DEVICE_ENCRYPTED,
bdrv_get_device_name(bs),
bdrv_get_encrypted_filename(bs));
return;
}
}
if (runstate_check(RUN_STATE_INMIGRATE)) {