block/qcow2-bitmap: return status from qcow2_store_persistent_dirty_bitmaps

It's better to return status together with setting errp. It makes
possible to avoid error propagation.

While being here, put ERRP_GUARD() to fix error_prepend(errp, ...)
usage inside qcow2_store_persistent_dirty_bitmaps() (see the comment
above ERRP_GUARD() definition in include/qapi/error.h)

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20210202124956.63146-11-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-02-02 15:49:52 +03:00 committed by Eric Blake
parent 0c1e9d2a9a
commit 526e31de99
2 changed files with 7 additions and 8 deletions

View File

@ -1531,9 +1531,10 @@ out:
* readonly to begin with, and whether we opened directly or reopened to that * readonly to begin with, and whether we opened directly or reopened to that
* state shouldn't matter for the state we get afterward. * state shouldn't matter for the state we get afterward.
*/ */
void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, bool qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,
bool release_stored, Error **errp) bool release_stored, Error **errp)
{ {
ERRP_GUARD();
BdrvDirtyBitmap *bitmap; BdrvDirtyBitmap *bitmap;
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
uint32_t new_nb_bitmaps = s->nb_bitmaps; uint32_t new_nb_bitmaps = s->nb_bitmaps;
@ -1553,7 +1554,7 @@ void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,
bm_list = bitmap_list_load(bs, s->bitmap_directory_offset, bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
s->bitmap_directory_size, errp); s->bitmap_directory_size, errp);
if (bm_list == NULL) { if (bm_list == NULL) {
return; return false;
} }
} }
@ -1668,7 +1669,7 @@ success:
} }
bitmap_list_free(bm_list); bitmap_list_free(bm_list);
return; return true;
fail: fail:
QSIMPLEQ_FOREACH(bm, bm_list, entry) { QSIMPLEQ_FOREACH(bm, bm_list, entry) {
@ -1686,16 +1687,14 @@ fail:
} }
bitmap_list_free(bm_list); bitmap_list_free(bm_list);
return false;
} }
int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp) int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp)
{ {
BdrvDirtyBitmap *bitmap; BdrvDirtyBitmap *bitmap;
Error *local_err = NULL;
qcow2_store_persistent_dirty_bitmaps(bs, false, &local_err); if (!qcow2_store_persistent_dirty_bitmaps(bs, false, errp)) {
if (local_err != NULL) {
error_propagate(errp, local_err);
return -EINVAL; return -EINVAL;
} }

View File

@ -984,7 +984,7 @@ bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
Qcow2BitmapInfoList **info_list, Error **errp); Qcow2BitmapInfoList **info_list, Error **errp);
int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp); int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp);
int qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp); int qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp);
void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, bool qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,
bool release_stored, Error **errp); bool release_stored, Error **errp);
int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp); int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp);
bool qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs, bool qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,