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.zhadche...@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

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to