Move code that calculates qio front bytes type and amount into a new
helper. It 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>
---
 drivers/md/dm-qcow2-map.c | 46 ++++++++++++++++++++++++++++-----------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
index a779889c6970..8c1620c11137 100644
--- a/drivers/md/dm-qcow2-map.c
+++ b/drivers/md/dm-qcow2-map.c
@@ -3341,27 +3341,47 @@ 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)
+{
+       bool zeroes, unmapped = false, try_lower = false;
+       u32 size;
+
+       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);
+
+       arg->unmapped = unmapped;
+       arg->zeroes = zeroes;
+       arg->try_lower = try_lower;
+
+       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 +3399,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;
-- 
2.39.3

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

Reply via email to