qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@virtuozzo.com>
To: Alexander Ivanov <alexander.ivanov@virtuozzo.com>, qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, stefanha@redhat.com,
	vsementsov@yandex-team.ru, kwolf@redhat.com, hreitz@redhat.com
Subject: Re: [PATCH v4 17/21] parallels: Check unused clusters in parallels_check_leak()
Date: Thu, 18 Jan 2024 15:55:54 +0100	[thread overview]
Message-ID: <515e9d22-c6c1-4c7e-a40d-6e03a9e97130@virtuozzo.com> (raw)
In-Reply-To: <20231228101232.372142-18-alexander.ivanov@virtuozzo.com>

On 12/28/23 11:12, Alexander Ivanov wrote:
> Since we have used bitmap, leak check is useless. Transform
> parallels_truncate_unused_clusters() to parallels_check_unused_clusters()
> helper and use it in leak check.
>
> Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
> ---
>   block/parallels.c | 121 +++++++++++++++++++++++++---------------------
>   1 file changed, 67 insertions(+), 54 deletions(-)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index 136865d53e..5ed58826bb 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -768,57 +768,87 @@ parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
>       return 0;
>   }
>   
> +static int64_t GRAPH_RDLOCK
> +parallels_check_unused_clusters(BlockDriverState *bs, bool truncate)
> +{
> +    BDRVParallelsState *s = bs->opaque;
> +    int64_t leak, file_size, end_off = 0;
> +    int ret;
> +
> +    file_size = bdrv_getlength(bs->file->bs);
> +    if (file_size < 0) {
> +        return file_size;
> +    }
> +
> +    if (s->used_bmap_size > 0) {
> +        end_off = find_last_bit(s->used_bmap, s->used_bmap_size);
> +        if (end_off == s->used_bmap_size) {
> +            end_off = 0;
> +        } else {
> +            end_off = (end_off + 1) * s->cluster_size;
> +        }
> +    }
> +
> +    end_off += s->data_start * BDRV_SECTOR_SIZE;
> +    leak = file_size - end_off;
> +    if (leak < 0) {
> +        return -EINVAL;
> +    }
> +    if (!truncate || leak == 0) {
> +        return leak;
> +    }
> +
> +    ret = bdrv_truncate(bs->file, end_off, true, PREALLOC_MODE_OFF, 0, NULL);
> +    if (ret) {
> +        return ret;
> +    }
> +
> +    s->data_end = end_off / BDRV_SECTOR_SIZE;
> +
> +    parallels_free_used_bitmap(bs);
> +    ret = parallels_fill_used_bitmap(bs);
> +    if (ret < 0) {
> +        return ret;
> +    }
> +
> +    return leak;
> +}
> +
>   static int coroutine_fn GRAPH_RDLOCK
>   parallels_check_leak(BlockDriverState *bs, BdrvCheckResult *res,
>                        BdrvCheckMode fix, bool explicit)
>   {
>       BDRVParallelsState *s = bs->opaque;
> -    int64_t size, count;
> -    int ret;
> +    int64_t leak, count, size;
> +
> +    leak = parallels_check_unused_clusters(bs, fix & BDRV_FIX_LEAKS);
> +    if (leak < 0) {
> +        res->check_errors++;
> +        return leak;
> +    }
> +    if (leak == 0) {
> +        return 0;
> +    }
>   
>       size = bdrv_co_getlength(bs->file->bs);
>       if (size < 0) {
>           res->check_errors++;
>           return size;
>       }
> -    if (size <= res->image_end_offset) {
> +    res->image_end_offset = size;
> +
> +    if (!explicit) {
>           return 0;
>       }
>   
> -    count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
> -    if (explicit) {
> -        fprintf(stderr,
> -                "%s space leaked at the end of the image %" PRId64 "\n",
> -                fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR",
> -                size - res->image_end_offset);
> -        res->leaks += count;
> -    }
> +    count = DIV_ROUND_UP(leak, s->cluster_size);
> +    fprintf(stderr,
> +            "%s space leaked at the end of the image %" PRId64 "\n",
> +            fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR", leak);
> +    res->leaks += count;
> +
>       if (fix & BDRV_FIX_LEAKS) {
> -        Error *local_err = NULL;
> -
> -        /*
> -         * In order to really repair the image, we must shrink it.
> -         * That means we have to pass exact=true.
> -         */
> -        ret = bdrv_co_truncate(bs->file, res->image_end_offset, true,
> -                               PREALLOC_MODE_OFF, 0, &local_err);
> -        if (ret < 0) {
> -            error_report_err(local_err);
> -            res->check_errors++;
> -            return ret;
> -        }
> -        s->data_end = res->image_end_offset >> BDRV_SECTOR_BITS;
> -
> -        parallels_free_used_bitmap(bs);
> -        ret = parallels_fill_used_bitmap(bs);
> -        if (ret == -ENOMEM) {
> -            res->check_errors++;
> -            return ret;
> -        }
> -
> -        if (explicit) {
> -            res->leaks_fixed += count;
> -        }
> +        res->leaks_fixed += count;
>       }
>   
>       return 0;
> @@ -1454,23 +1484,6 @@ fail:
>       return ret;
>   }
>   
> -static int GRAPH_RDLOCK parallels_truncate_unused_clusters(BlockDriverState *bs)
> -{
> -    BDRVParallelsState *s = bs->opaque;
> -    uint64_t end_off = 0;
> -    if (s->used_bmap_size > 0) {
> -        end_off = find_last_bit(s->used_bmap, s->used_bmap_size);
> -        if (end_off == s->used_bmap_size) {
> -            end_off = 0;
> -        } else {
> -            end_off = (end_off + 1) * s->cluster_size;
> -        }
> -    }
> -    end_off += s->data_start * BDRV_SECTOR_SIZE;
> -    s->data_end = end_off / BDRV_SECTOR_SIZE;
> -    return bdrv_truncate(bs->file, end_off, true, PREALLOC_MODE_OFF, 0, NULL);
> -}
> -
>   static int GRAPH_RDLOCK parallels_inactivate(BlockDriverState *bs)
>   {
>       BDRVParallelsState *s = bs->opaque;
> @@ -1488,7 +1501,7 @@ static int GRAPH_RDLOCK parallels_inactivate(BlockDriverState *bs)
>       parallels_update_header(bs);
>   
>       /* errors are ignored, so we might as well pass exact=true */
> -    ret = parallels_truncate_unused_clusters(bs);
> +    ret = parallels_check_unused_clusters(bs, true);
>       if (ret < 0) {
>           error_report("Failed to truncate image: %s", strerror(-ret));
>       }
This particular patch does not look good.

You are deleting the stuff you have just added (in the previous patch)
and you add lengthy operation (recreate used bitmap) on the image close,
which is better to be finished first.

I would say that the concept should be somehow reworked or the
whole patch is to be dropped.


  reply	other threads:[~2024-01-18 14:56 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-28 10:12 [PATCH v4 00/21] parallels: Add full dirty bitmap support Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 01/21] parallels: Set s->used_bmap to NULL in parallels_free_used_bitmap() Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 02/21] parallels: Move inactivation code to a separate function Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 03/21] parallels: Make mark_used() a global function Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 04/21] parallels: Limit search in parallels_mark_used to the last marked claster Alexander Ivanov
2024-01-16 13:52   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 05/21] parallels: Add parallels_mark_unused() helper Alexander Ivanov
2024-01-16 13:54   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 06/21] parallels: Move host clusters allocation to a separate function Alexander Ivanov
2024-01-16 14:19   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 07/21] parallels: Set data_end value in parallels_check_leak() Alexander Ivanov
2024-01-16 14:21   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 08/21] parallels: Recreate used bitmap " Alexander Ivanov
2024-01-16 14:24   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 09/21] parallels: Add a note about used bitmap in parallels_check_duplicate() Alexander Ivanov
2024-01-16 14:30   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 10/21] parallels: Create used bitmap even if checks needed Alexander Ivanov
2024-01-16 14:37   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 11/21] parallels: Add dirty bitmaps saving Alexander Ivanov
2024-01-18 13:27   ` Denis V. Lunev
2024-02-07 12:42     ` Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 12/21] parallels: Let image extensions work in RW mode Alexander Ivanov
2024-01-16 14:45   ` Denis V. Lunev
2024-01-18 13:31     ` Denis V. Lunev
2024-02-28 10:25       ` Alexander Ivanov
2024-02-28 12:11         ` Denis V. Lunev
2024-01-18 13:35   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 13/21] parallels: Handle L1 entries equal to one Alexander Ivanov
2024-01-18 13:37   ` Denis V. Lunev
2024-02-29 11:57     ` Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 14/21] parallels: Make a loaded dirty bitmap persistent Alexander Ivanov
2024-01-18 13:59   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 15/21] parallels: Reverse a conditional in parallels_check_leak() to reduce indents Alexander Ivanov
2024-01-18 14:49   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 16/21] parallels: Truncate images on the last used cluster Alexander Ivanov
2024-01-18 14:52   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 17/21] parallels: Check unused clusters in parallels_check_leak() Alexander Ivanov
2024-01-18 14:55   ` Denis V. Lunev [this message]
2023-12-28 10:12 ` [PATCH v4 18/21] parallels: Remove unnecessary data_end field Alexander Ivanov
2024-01-18 15:00   ` Denis V. Lunev
2023-12-28 10:12 ` [PATCH v4 19/21] tests: Add parallels images support to test 165 Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 20/21] tests: Turned on 256, 299, 304 and block-status-cache for parallels format Alexander Ivanov
2023-12-28 10:12 ` [PATCH v4 21/21] tests: Add parallels format support to image-fleecing Alexander Ivanov
2023-12-29 15:59   ` Vladimir Sementsov-Ogievskiy
2024-01-18 15:01 ` [PATCH v4 00/21] parallels: Add full dirty bitmap support Denis V. Lunev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=515e9d22-c6c1-4c7e-a40d-6e03a9e97130@virtuozzo.com \
    --to=den@virtuozzo.com \
    --cc=alexander.ivanov@virtuozzo.com \
    --cc=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@yandex-team.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).