[Devel] [PATCH RH9 v3 4/8] dm/dm-qcow2: add calc_front_qio_bytes() helper
Alexander Atanasov
alexander.atanasov at virtuozzo.com
Thu Sep 7 20:19:39 MSK 2023
On 5.09.23 11:59, Andrey Zhadchenko wrote:
> Move code that calculates qio front bytes type and amount into a new
> helper. Increase code clarity.
> This will be used later for llseek_hole()
>
> Feature: dm: implement SEEK_HOLE for dm-qcow2 and dm-ploop
> https://jira.vzint.dev/browse/PSBM-145746
> Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
>
> ---
> v3: reworked the code to make it more clear
>
> drivers/md/dm-qcow2-map.c | 50 +++++++++++++++++++++++++++++----------
> 1 file changed, 37 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
> index a779889c6970..7d5e33724ccb 100644
> --- a/drivers/md/dm-qcow2-map.c
> +++ b/drivers/md/dm-qcow2-map.c
> @@ -3341,27 +3341,51 @@ static int handle_metadata(struct qcow2 *qcow2, struct qio **qio,
> return ret;
> }
>
> +struct calc_front_bytes_ret {
> + bool unmapped;
> + bool zeroes;
> + bool try_lower;
> +};
> +
> +static inline u32 calc_front_qio_bytes(struct qcow2 *qcow2, struct qio *qio,
> + struct qcow2_map *map,
> + struct calc_front_bytes_ret *arg)
> +{
> + u32 size;
> +
> + arg->unmapped = false;
> + arg->zeroes = false;
> + arg->try_lower = false;
> +
> + size = qio_all_zeroes_size(qcow2, qio, map);
> + if (size) {
> + arg->zeroes = true;
> + return size;
> + }
> +
> + size = qio_unmapped_size(qcow2, qio, map);
> + if (size) {
> + arg->unmapped = true;
> + arg->try_lower = maybe_mapped_in_lower_delta(qcow2, qio);
> + return size;
> + }
> +
> + size = qio_mapped_not_zeroes_size(qcow2, qio, map);
> + return size;
> +}
> +
> static void process_read_qio(struct qcow2 *qcow2, struct qio *qio,
> struct qcow2_map *map)
> {
> - bool unmapped, zeroes, try_lower;
> + struct calc_front_bytes_ret arg;
> struct qio *split;
> u32 size;
>
> do {
> - unmapped = try_lower = false;
> split = NULL;
> + size = calc_front_qio_bytes(qcow2, qio, map, &arg);
>
> - zeroes = (size = qio_all_zeroes_size(qcow2, qio, map));
> - if (!size)
> - unmapped = (size = qio_unmapped_size(qcow2, qio, map));
> - if (!size)
> - size = qio_mapped_not_zeroes_size(qcow2, qio, map);
> -
> - if (unmapped)
> - try_lower = maybe_mapped_in_lower_delta(qcow2, qio);
> -
> - if (zeroes || (unmapped && !try_lower)) {
> + if (arg.zeroes || (arg.unmapped && !arg.try_lower)) {
> /* All zeroes or clu is not allocated */
> perform_zero_read(qio, size);
> if (size == qio->bi_iter.bi_size) {
> @@ -3379,7 +3403,7 @@ static void process_read_qio(struct qcow2 *qcow2, struct qio *qio,
> swap(qio, split);
> }
>
> - if (unmapped && try_lower) {
> + if (arg.unmapped && arg.try_lower) {
> /* Try to read from lower delta */
> shorten_and_zero_qio_tail(qcow2->lower, qio);
> qio->qcow2 = qcow2->lower;
LGTM
--
Regards,
Alexander Atanasov
More information about the Devel
mailing list