On 2/5/21 5:52 AM, Vladimir Sementsov-Ogievskiy wrote: > 05.02.2021 14:43, Alberto Garcia wrote: >> On Tue 02 Feb 2021 01:49:50 PM CET, Vladimir Sementsov-Ogievskiy wrote: >>> -Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs, >>> - Error **errp) >>> +bool qcow2_get_bitmap_info_list(BlockDriverState *bs, >>> + Qcow2BitmapInfoList **info_list, >>> Error **errp) >>> { >>> BDRVQcow2State *s = bs->opaque; >>> Qcow2BitmapList *bm_list; >>> Qcow2Bitmap *bm; >>> - Qcow2BitmapInfoList *list = NULL; >>> - Qcow2BitmapInfoList **tail = &list; >>> if (s->nb_bitmaps == 0) { >>> - return NULL; >>> + *info_list = NULL; >>> + return true; >>> } >>> bm_list = bitmap_list_load(bs, s->bitmap_directory_offset, >>> s->bitmap_directory_size, errp); >>> - if (bm_list == NULL) { >>> - return NULL; >>> + if (!bm_list) { >>> + return false; >>> } >>> + *info_list = NULL; >>> + >>> QSIMPLEQ_FOREACH(bm, bm_list, entry) { >>> Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1); >>> info->granularity = 1U << bm->granularity_bits; >>> info->name = g_strdup(bm->name); >>> info->flags = get_bitmap_info_flags(bm->flags & >>> ~BME_RESERVED_FLAGS); >>> - QAPI_LIST_APPEND(tail, info); >>> + QAPI_LIST_APPEND(info_list, info); >>> } >>> bitmap_list_free(bm_list); >>> - return list; >>> + return true; >>> } >> >> Maybe I'm reading this wrong but... >> >> In the original code you had the head and tail of the list ('list' and >> 'tail') then you would append items to the tail and finally return the >> head. >> >> However the new code only uses and updates 'info_list' and it does not >> keep the head anywhere, so what the caller gets is a pointer to the >> tail. >> > > No. *info_list is modified only on the first loop iteration. And than > info_list is switched to &(*(info_list))->next, so on second iteration > we will modify @next field of first element, not original *info_list.
Elsewhere when making these types of conversions, Markus suggested that I keep a separate tail variable, initialized by the parameter info_list, to make it more apparent. As in squashing the patch below: With that, it looks this series is reviewed, so I'm planning on taking it through my dirty-bitmaps tree (perhaps I'm stretching the fact that patch 10/14 is definitely dirty-bitmaps into taking the whole series, but I doubt I'll hear any complaints from other block maintainers) diff --git i/block/qcow2-bitmap.c w/block/qcow2-bitmap.c index e50da1ee7da3..f417f9ccb195 100644 --- i/block/qcow2-bitmap.c +++ w/block/qcow2-bitmap.c @@ -1103,6 +1103,7 @@ bool qcow2_get_bitmap_info_list(BlockDriverState *bs, BDRVQcow2State *s = bs->opaque; Qcow2BitmapList *bm_list; Qcow2Bitmap *bm; + Qcow2BitmapInfoList **tail; if (s->nb_bitmaps == 0) { *info_list = NULL; @@ -1116,13 +1117,14 @@ bool qcow2_get_bitmap_info_list(BlockDriverState *bs, } *info_list = NULL; + tail = info_list; QSIMPLEQ_FOREACH(bm, bm_list, entry) { Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1); info->granularity = 1U << bm->granularity_bits; info->name = g_strdup(bm->name); info->flags = get_bitmap_info_flags(bm->flags & ~BME_RESERVED_FLAGS); - QAPI_LIST_APPEND(info_list, info); + QAPI_LIST_APPEND(tail, info); } bitmap_list_free(bm_list); -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org