On 11.08.2022 17:00, Alexander Ivanov wrote:
> v2: Move fragmentation counting code to this function too.
same note here about ChnageLog and motivation
> Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
> ---
> block/parallels.c | 54 +++++++++++++++++++++++++++--------------------
> 1 file changed, 31 insertions(+), 23 deletions(-)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index 8737eadfb4..d0364182bb 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -518,48 +518,56 @@ static int parallels_check_leak(BlockDriverState *bs,
> return 0;
> }
>
> -static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> - BdrvCheckResult *res,
> - BdrvCheckMode fix)
> +static void parallels_collect_statistics(BlockDriverState *bs,
> + BdrvCheckResult *res,
> + BdrvCheckMode fix)
> {
> BDRVParallelsState *s = bs->opaque;
> - int64_t prev_off;
> - int ret;
> + int64_t off, prev_off;
> uint32_t i;
>
> -
> - qemu_co_mutex_lock(&s->lock);
> -
> - parallels_check_unclean(bs, res, fix);
> -
> - ret = parallels_check_outside_image(bs, res, fix);
> - if (ret < 0) {
> - goto out;
> - }
> -
> - ret = parallels_check_leak(bs, res, fix);
> - if (ret < 0) {
> - goto out;
> - }
> -
> res->bfi.total_clusters = s->bat_size;
> res->bfi.compressed_clusters = 0; /* compression is not supported */
>
> prev_off = 0;
> for (i = 0; i < s->bat_size; i++) {
> - int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
> + off = bat2sect(s, i) << BDRV_SECTOR_BITS;
> if (off == 0) {
> prev_off = 0;
> continue;
> }
>
> - res->bfi.allocated_clusters++;
> -
> if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
> res->bfi.fragmented_clusters++;
> }
> +
> prev_off = off;
> + res->bfi.allocated_clusters++;
> }
> +}
> +
> +static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> + BdrvCheckResult *res,
> + BdrvCheckMode fix)
> +{
> + BDRVParallelsState *s = bs->opaque;
> + int ret;
> +
> + qemu_co_mutex_lock(&s->lock);
> +
> + parallels_check_unclean(bs, res, fix);
> +
> + ret = parallels_check_outside_image(bs, res, fix);
> + if (ret < 0) {
> + goto out;
> + }
> +
> + ret = parallels_check_leak(bs, res, fix);
> + if (ret < 0) {
> + goto out;
> + }
> +
> + parallels_collect_statistics(bs, res, fix);
>
> out:
> qemu_co_mutex_unlock(&s->lock);