block/qcow2: qcow2_get_specific_info(): drop error propagation

Don't use error propagation in qcow2_get_specific_info(). For this
refactor qcow2_get_bitmap_info_list, its current interface is rather
weird.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210202124956.63146-9-vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
[eblake: separate local 'tail' variable from 'info_list' parameter]
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-02-02 15:49:50 +03:00 committed by Eric Blake
parent 775d0c0508
commit 83bad8cbf5
3 changed files with 19 additions and 21 deletions

View File

@ -1089,30 +1089,32 @@ static Qcow2BitmapInfoFlagsList *get_bitmap_info_flags(uint32_t flags)
/* /*
* qcow2_get_bitmap_info_list() * qcow2_get_bitmap_info_list()
* Returns a list of QCOW2 bitmap details. * Returns a list of QCOW2 bitmap details.
* In case of no bitmaps, the function returns NULL and * On success return true with info_list set (note, that if there are no
* the @errp parameter is not set. * bitmaps, info_list is set to NULL).
* When bitmap information can not be obtained, the function returns * On failure return false with errp set.
* NULL and the @errp parameter is set.
*/ */
Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs, bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
Error **errp) Qcow2BitmapInfoList **info_list, Error **errp)
{ {
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
Qcow2BitmapList *bm_list; Qcow2BitmapList *bm_list;
Qcow2Bitmap *bm; Qcow2Bitmap *bm;
Qcow2BitmapInfoList *list = NULL; Qcow2BitmapInfoList **tail;
Qcow2BitmapInfoList **tail = &list;
if (s->nb_bitmaps == 0) { if (s->nb_bitmaps == 0) {
return NULL; *info_list = NULL;
return true;
} }
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) {
return NULL; return false;
} }
*info_list = NULL;
tail = info_list;
QSIMPLEQ_FOREACH(bm, bm_list, entry) { QSIMPLEQ_FOREACH(bm, bm_list, entry) {
Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1); Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1);
info->granularity = 1U << bm->granularity_bits; info->granularity = 1U << bm->granularity_bits;
@ -1123,7 +1125,7 @@ Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs,
bitmap_list_free(bm_list); bitmap_list_free(bm_list);
return list; return true;
} }
int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp) int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp)

View File

@ -5066,12 +5066,10 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs,
BDRVQcow2State *s = bs->opaque; BDRVQcow2State *s = bs->opaque;
ImageInfoSpecific *spec_info; ImageInfoSpecific *spec_info;
QCryptoBlockInfo *encrypt_info = NULL; QCryptoBlockInfo *encrypt_info = NULL;
Error *local_err = NULL;
if (s->crypto != NULL) { if (s->crypto != NULL) {
encrypt_info = qcrypto_block_get_info(s->crypto, &local_err); encrypt_info = qcrypto_block_get_info(s->crypto, errp);
if (local_err) { if (!encrypt_info) {
error_propagate(errp, local_err);
return NULL; return NULL;
} }
} }
@ -5088,9 +5086,7 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs,
}; };
} else if (s->qcow_version == 3) { } else if (s->qcow_version == 3) {
Qcow2BitmapInfoList *bitmaps; Qcow2BitmapInfoList *bitmaps;
bitmaps = qcow2_get_bitmap_info_list(bs, &local_err); if (!qcow2_get_bitmap_info_list(bs, &bitmaps, errp)) {
if (local_err) {
error_propagate(errp, local_err);
qapi_free_ImageInfoSpecific(spec_info); qapi_free_ImageInfoSpecific(spec_info);
qapi_free_QCryptoBlockInfo(encrypt_info); qapi_free_QCryptoBlockInfo(encrypt_info);
return NULL; return NULL;

View File

@ -979,8 +979,8 @@ int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
void **refcount_table, void **refcount_table,
int64_t *refcount_table_size); int64_t *refcount_table_size);
bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp); bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp);
Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs, bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
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, void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,