On 1/31/23 11:27, Alexander Ivanov wrote:
> We will add more and more checks so we need a better code structure
> in parallels_co_check. Let each check performs in a separate loop
> in a separate helper.
>
> Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
> ---
> block/parallels.c | 85 ++++++++++++++++++++++++++++-------------------
> 1 file changed, 50 insertions(+), 35 deletions(-)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index 7382c01191..eb39db53ec 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -480,14 +480,13 @@ static int parallels_check_outside_image(BlockDriverState *bs,
> return 0;
> }
>
> -static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> - BdrvCheckResult *res,
> - BdrvCheckMode fix)
> +static int parallels_check_leak(BlockDriverState *bs,
> + BdrvCheckResult *res,
> + BdrvCheckMode fix)
> {
> BDRVParallelsState *s = bs->opaque;
> - int64_t size, prev_off;
> + int64_t size;
> int ret;
> - uint32_t i;
>
> size = bdrv_getlength(bs->file->bs);
> if (size < 0) {
> @@ -495,34 +494,6 @@ static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> return size;
> }
>
> - 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;
> - }
> -
> - 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;
> - if (off == 0 || off + s->cluster_size > res->image_end_offset) {
> - 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;
> - }
> -
> if (size > res->image_end_offset) {
> int64_t count;
> count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
> @@ -542,12 +513,57 @@ static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> if (ret < 0) {
> error_report_err(local_err);
> res->check_errors++;
> - goto out;
> + return ret;
> }
> res->leaks_fixed += count;
> }
> }
>
> + return 0;
> +}
> +
> +static int coroutine_fn parallels_co_check(BlockDriverState *bs,
> + BdrvCheckResult *res,
> + BdrvCheckMode fix)
> +{
> + BDRVParallelsState *s = bs->opaque;
> + int64_t prev_off;
> + int ret;
> + 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;
> + if (off == 0 || off + s->cluster_size > res->image_end_offset) {
> + 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;
> + }
> +
> out:
> qemu_co_mutex_unlock(&s->lock);
>
> @@ -561,7 +577,6 @@ out:
> return ret;
> }
>
> -
> static int coroutine_fn parallels_co_create(BlockdevCreateOptions* opts,
> Error **errp)
> {
Pls no unrelated changes