On 12/28/23 11:12, Alexander Ivanov wrote:
> Add a helper to set unused areas in the used bitmap.
>
> Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
> ---
> block/parallels.c | 18 ++++++++++++++++++
> block/parallels.h | 2 ++
> 2 files changed, 20 insertions(+)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index 4470519656..13726fb3d5 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -196,6 +196,24 @@ int parallels_mark_used(BlockDriverState *bs, unsigned long *bitmap,
> return 0;
> }
>
> +int parallels_mark_unused(BlockDriverState *bs, unsigned long *bitmap,
> + uint32_t bitmap_size, int64_t off, uint32_t count)
> +{
> + BDRVParallelsState *s = bs->opaque;
> + uint32_t cluster_end, cluster_index = host_cluster_index(s, off);
> + unsigned long next_unused;
> + cluster_end = cluster_index + count;
> + if (cluster_end > bitmap_size) {
> + return -E2BIG;
> + }
> + next_unused = find_next_zero_bit(bitmap, cluster_end, cluster_index);
> + if (next_unused < cluster_end) {
> + return -EINVAL;
> + }
> + bitmap_clear(bitmap, cluster_index, count);
> + return 0;
> +}
> +
> /*
> * Collect used bitmap. The image can contain errors, we should fill the
> * bitmap anyway, as much as we can. This information will be used for
> diff --git a/block/parallels.h b/block/parallels.h
> index 68077416b1..02b857b4a4 100644
> --- a/block/parallels.h
> +++ b/block/parallels.h
> @@ -92,6 +92,8 @@ typedef struct BDRVParallelsState {
>
> int parallels_mark_used(BlockDriverState *bs, unsigned long *bitmap,
> uint32_t bitmap_size, int64_t off, uint32_t count);
> +int parallels_mark_unused(BlockDriverState *bs, unsigned long *bitmap,
> + uint32_t bitmap_size, int64_t off, uint32_t count);
>
> int GRAPH_RDLOCK
> parallels_read_format_extension(BlockDriverState *bs, int64_t ext_off,
Reviewed-by: Denis V. Lunev <den@openvz.org>