qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation
  2023-04-24  9:16 Alexander Ivanov
@ 2023-04-24  9:16 ` Alexander Ivanov
  0 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:16 UTC (permalink / raw)
  To: qemu-devel; +Cc: den, michael.roth, kkostiuk, marcandre.lureau

data_end field in BDRVParallelsState is set to the biggest offset present
in BAT. If this offset is outside of the image, any further write will
create the cluster at this offset and/or the image will be truncated to
this offset on close. This is definitely not correct.

Raise an error in parallels_open() if data_end points outside the image
and it is not a check (let the check to repaire the image). Set data_end
to the end of the cluster with the last correct offset.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
 block/parallels.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/block/parallels.c b/block/parallels.c
index 013684801a..7e563062eb 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -733,6 +733,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVParallelsState *s = bs->opaque;
     ParallelsHeader ph;
     int ret, size, i;
+    int64_t file_nb_sectors;
     QemuOpts *opts = NULL;
     Error *local_err = NULL;
     char *buf;
@@ -742,6 +743,11 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         return ret;
     }
 
+    file_nb_sectors = bdrv_nb_sectors(bs->file->bs);
+    if (file_nb_sectors < 0) {
+        return -EINVAL;
+    }
+
     ret = bdrv_pread(bs->file, 0, sizeof(ph), &ph, 0);
     if (ret < 0) {
         goto fail;
@@ -806,6 +812,17 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
 
     for (i = 0; i < s->bat_size; i++) {
         int64_t off = bat2sect(s, i);
+        if (off >= file_nb_sectors) {
+            if (flags & BDRV_O_CHECK) {
+                continue;
+            }
+            error_setg(errp, "parallels: Offset %" PRIi64 " in BAT[%d] entry "
+                       "is larger than file size (%" PRIi64 ")",
+                       off << BDRV_SECTOR_BITS, i,
+                       file_nb_sectors << BDRV_SECTOR_BITS);
+            ret = -EINVAL;
+            goto fail;
+        }
         if (off >= s->data_end) {
             s->data_end = off + s->tracks;
         }
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug
@ 2023-04-24  9:31 Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation Alexander Ivanov
                   ` (13 more replies)
  0 siblings, 14 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

Fix image inflation when offset in BAT is out of image.

Replace whole BAT syncing by flushing only dirty blocks.

Move all the checks outside the main check function in
separate functions

Use WITH_QEMU_LOCK_GUARD for simplier code.

Fix incorrect condition in out-of-image check.

v11:
1: Use bdrv_nb_sectors() instead of bdrv_getlength() to get image size in sectors.
7,9: Add coroutine_fn and GRAPH_RDLOCK annotations.

v10:
8: Add a comment.
9: Exclude unrelated changes.

v9:
3: Add (high_off == 0) case handling.
7: Move res->image_end_offset setting to parallels_check_outside_image().
8: Add a patch with a statistics calculation fix.
9: Remove redundant high_off calculation.
12: Change the condition to (off + s->cluster_size > size).

v8: Rebase on the top of the current master branch.

v7:
1,2: Fix string lengths in the commit messages.
3: Fix a typo in the commit message.

v6:
1: Move the error check inside the loop. Move file size getting
   to the function beginning. Skip out-of-image offsets.
2: A new patch - don't let high_off be more than the end of the last cluster.
3: Set data_end without any condition.
7: Move data_end setting to parallels_check_outside_image().
8: Remove s->data_end setting from parallels_check_leak().
   Fix 'i' type.

v5:
2: Change the way of data_end fixing.
6,7: Move data_end check to parallels_check_leak().

v4:
1: Move s->data_end fix to parallels_co_check(). Split the check
   in parallels_open() and the fix in parallels_co_check() to two patches.
2: A new patch - a part of the patch 1.
   Add a fix for data_end to parallels_co_check().
3: Move offset convertation to parallels_set_bat_entry().
4: Fix 'ret' rewriting by bdrv_co_flush() results.
7: Keep 'i' as uint32_t.

v3:

1-8: Fix commit message.

v2:

2: A new patch - a part of the splitted patch 2.
3: Patch order was changed so the replacement is done in parallels_co_check.
   Now we use a helper to set BAT entry and mark the block dirty.
4: Revert the condition with s->header_unclean.
5: Move unrelated helper parallels_set_bat_entry creation to a separate patch.
7: Move fragmentation counting code to this function too.
8: Fix an incorrect usage of WITH_QEMU_LOCK_GUARD.

Alexander Ivanov (12):
  parallels: Out of image offset in BAT leads to image inflation
  parallels: Fix high_off calculation in parallels_co_check()
  parallels: Fix image_end_offset and data_end after out-of-image check
  parallels: create parallels_set_bat_entry_helper() to assign BAT value
  parallels: Use generic infrastructure for BAT writing in
    parallels_co_check()
  parallels: Move check of unclean image to a separate function
  parallels: Move check of cluster outside image to a separate function
  parallels: Fix statistics calculation
  parallels: Move check of leaks to a separate function
  parallels: Move statistic collection to a separate function
  parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD
  parallels: Incorrect condition in out-of-image check

 block/parallels.c | 190 +++++++++++++++++++++++++++++++++-------------
 1 file changed, 136 insertions(+), 54 deletions(-)

-- 
2.34.1



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check() Alexander Ivanov
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

data_end field in BDRVParallelsState is set to the biggest offset present
in BAT. If this offset is outside of the image, any further write will
create the cluster at this offset and/or the image will be truncated to
this offset on close. This is definitely not correct.

Raise an error in parallels_open() if data_end points outside the image
and it is not a check (let the check to repaire the image). Set data_end
to the end of the cluster with the last correct offset.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
 block/parallels.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/block/parallels.c b/block/parallels.c
index 013684801a..7e563062eb 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -733,6 +733,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVParallelsState *s = bs->opaque;
     ParallelsHeader ph;
     int ret, size, i;
+    int64_t file_nb_sectors;
     QemuOpts *opts = NULL;
     Error *local_err = NULL;
     char *buf;
@@ -742,6 +743,11 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
         return ret;
     }
 
+    file_nb_sectors = bdrv_nb_sectors(bs->file->bs);
+    if (file_nb_sectors < 0) {
+        return -EINVAL;
+    }
+
     ret = bdrv_pread(bs->file, 0, sizeof(ph), &ph, 0);
     if (ret < 0) {
         goto fail;
@@ -806,6 +812,17 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
 
     for (i = 0; i < s->bat_size; i++) {
         int64_t off = bat2sect(s, i);
+        if (off >= file_nb_sectors) {
+            if (flags & BDRV_O_CHECK) {
+                continue;
+            }
+            error_setg(errp, "parallels: Offset %" PRIi64 " in BAT[%d] entry "
+                       "is larger than file size (%" PRIi64 ")",
+                       off << BDRV_SECTOR_BITS, i,
+                       file_nb_sectors << BDRV_SECTOR_BITS);
+            ret = -EINVAL;
+            goto fail;
+        }
         if (off >= s->data_end) {
             s->data_end = off + s->tracks;
         }
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check()
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check Alexander Ivanov
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

Don't let high_off be more than the file size even if we don't fix the
image.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 block/parallels.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 7e563062eb..4d6284a314 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -462,12 +462,12 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
                     fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
             res->corruptions++;
             if (fix & BDRV_FIX_ERRORS) {
-                prev_off = 0;
                 s->bat_bitmap[i] = 0;
                 res->corruptions_fixed++;
                 flush_bat = true;
-                continue;
             }
+            prev_off = 0;
+            continue;
         }
 
         res->bfi.allocated_clusters++;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check() Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value Alexander Ivanov
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

Set data_end to the end of the last cluster inside the image. In such a
way we can be sure that corrupted offsets in the BAT can't affect on the
image size. If there are no allocated clusters set image_end_offset by
data_end.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
---
 block/parallels.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/block/parallels.c b/block/parallels.c
index 4d6284a314..dec4fe1f06 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -490,7 +490,13 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
         }
     }
 
-    res->image_end_offset = high_off + s->cluster_size;
+    if (high_off == 0) {
+        res->image_end_offset = s->data_end << BDRV_SECTOR_BITS;
+    } else {
+        res->image_end_offset = high_off + s->cluster_size;
+        s->data_end = res->image_end_offset >> BDRV_SECTOR_BITS;
+    }
+
     if (size > res->image_end_offset) {
         int64_t count;
         count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (2 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 05/12] parallels: Use generic infrastructure for BAT writing in parallels_co_check() Alexander Ivanov
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

This helper will be reused in next patches during parallels_co_check
rework to simplify its code.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 block/parallels.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index dec4fe1f06..14fae04c99 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -165,6 +165,13 @@ static int64_t block_status(BDRVParallelsState *s, int64_t sector_num,
     return start_off;
 }
 
+static void parallels_set_bat_entry(BDRVParallelsState *s,
+                                    uint32_t index, uint32_t offset)
+{
+    s->bat_bitmap[index] = cpu_to_le32(offset);
+    bitmap_set(s->bat_dirty_bmap, bat_entry_off(index) / s->bat_dirty_block, 1);
+}
+
 static int64_t coroutine_fn GRAPH_RDLOCK
 allocate_clusters(BlockDriverState *bs, int64_t sector_num,
                   int nb_sectors, int *pnum)
@@ -251,10 +258,8 @@ allocate_clusters(BlockDriverState *bs, int64_t sector_num,
     }
 
     for (i = 0; i < to_allocate; i++) {
-        s->bat_bitmap[idx + i] = cpu_to_le32(s->data_end / s->off_multiplier);
+        parallels_set_bat_entry(s, idx + i, s->data_end / s->off_multiplier);
         s->data_end += s->tracks;
-        bitmap_set(s->bat_dirty_bmap,
-                   bat_entry_off(idx + i) / s->bat_dirty_block, 1);
     }
 
     return bat2sect(s, idx) + sector_num % s->tracks;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 05/12] parallels: Use generic infrastructure for BAT writing in parallels_co_check()
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (3 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 06/12] parallels: Move check of unclean image to a separate function Alexander Ivanov
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

BAT is written in the context of conventional operations over the image
inside bdrv_co_flush() when it calls parallels_co_flush_to_os() callback.
Thus we should not modify BAT array directly, but call
parallels_set_bat_entry() helper and bdrv_co_flush() further on. After
that there is no need to manually write BAT and track its modification.

This makes code more generic and allows to split parallels_set_bat_entry()
for independent pieces.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
---
 block/parallels.c | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 14fae04c99..7f076db001 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -427,9 +427,8 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
 {
     BDRVParallelsState *s = bs->opaque;
     int64_t size, prev_off, high_off;
-    int ret;
+    int ret = 0;
     uint32_t i;
-    bool flush_bat = false;
 
     size = bdrv_getlength(bs->file->bs);
     if (size < 0) {
@@ -467,9 +466,8 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
                     fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
             res->corruptions++;
             if (fix & BDRV_FIX_ERRORS) {
-                s->bat_bitmap[i] = 0;
+                parallels_set_bat_entry(s, i, 0);
                 res->corruptions_fixed++;
-                flush_bat = true;
             }
             prev_off = 0;
             continue;
@@ -486,15 +484,6 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
         prev_off = off;
     }
 
-    ret = 0;
-    if (flush_bat) {
-        ret = bdrv_co_pwrite_sync(bs->file, 0, s->header_size, s->header, 0);
-        if (ret < 0) {
-            res->check_errors++;
-            goto out;
-        }
-    }
-
     if (high_off == 0) {
         res->image_end_offset = s->data_end << BDRV_SECTOR_BITS;
     } else {
@@ -529,6 +518,14 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
 
 out:
     qemu_co_mutex_unlock(&s->lock);
+
+    if (ret == 0) {
+        ret = bdrv_co_flush(bs);
+        if (ret < 0) {
+            res->check_errors++;
+        }
+    }
+
     return ret;
 }
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 06/12] parallels: Move check of unclean image to a separate function
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (4 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 05/12] parallels: Use generic infrastructure for BAT writing in parallels_co_check() Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 07/12] parallels: Move check of cluster outside " Alexander Ivanov
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

We will add more and more checks so we need a better code structure
in parallels_co_check. Let each check performs in a separate loop
in a separate helper.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 block/parallels.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 7f076db001..4f14bac616 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -420,6 +420,25 @@ parallels_co_readv(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
     return ret;
 }
 
+static void parallels_check_unclean(BlockDriverState *bs,
+                                    BdrvCheckResult *res,
+                                    BdrvCheckMode fix)
+{
+    BDRVParallelsState *s = bs->opaque;
+
+    if (!s->header_unclean) {
+        return;
+    }
+
+    fprintf(stderr, "%s image was not closed correctly\n",
+            fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR");
+    res->corruptions++;
+    if (fix & BDRV_FIX_ERRORS) {
+        /* parallels_close will do the job right */
+        res->corruptions_fixed++;
+        s->header_unclean = false;
+    }
+}
 
 static int coroutine_fn GRAPH_RDLOCK
 parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
@@ -437,16 +456,8 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
     }
 
     qemu_co_mutex_lock(&s->lock);
-    if (s->header_unclean) {
-        fprintf(stderr, "%s image was not closed correctly\n",
-                fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR");
-        res->corruptions++;
-        if (fix & BDRV_FIX_ERRORS) {
-            /* parallels_close will do the job right */
-            res->corruptions_fixed++;
-            s->header_unclean = false;
-        }
-    }
+
+    parallels_check_unclean(bs, res, fix);
 
     res->bfi.total_clusters = s->bat_size;
     res->bfi.compressed_clusters = 0; /* compression is not supported */
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 07/12] parallels: Move check of cluster outside image to a separate function
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (5 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 06/12] parallels: Move check of unclean image to a separate function Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 08/12] parallels: Fix statistics calculation Alexander Ivanov
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

We will add more and more checks so we need a better code structure in
parallels_co_check. Let each check performs in a separate loop in a
separate helper.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
---
 block/parallels.c | 79 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 51 insertions(+), 28 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 4f14bac616..8588c3d775 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -441,13 +441,12 @@ static void parallels_check_unclean(BlockDriverState *bs,
 }
 
 static int coroutine_fn GRAPH_RDLOCK
-parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
-                   BdrvCheckMode fix)
+parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
+                              BdrvCheckMode fix)
 {
     BDRVParallelsState *s = bs->opaque;
-    int64_t size, prev_off, high_off;
-    int ret = 0;
     uint32_t i;
+    int64_t off, high_off, size;
 
     size = bdrv_getlength(bs->file->bs);
     if (size < 0) {
@@ -455,23 +454,9 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
         return size;
     }
 
-    qemu_co_mutex_lock(&s->lock);
-
-    parallels_check_unclean(bs, res, fix);
-
-    res->bfi.total_clusters = s->bat_size;
-    res->bfi.compressed_clusters = 0; /* compression is not supported */
-
     high_off = 0;
-    prev_off = 0;
     for (i = 0; i < s->bat_size; i++) {
-        int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
-        if (off == 0) {
-            prev_off = 0;
-            continue;
-        }
-
-        /* cluster outside the image */
+        off = bat2sect(s, i) << BDRV_SECTOR_BITS;
         if (off > size) {
             fprintf(stderr, "%s cluster %u is outside image\n",
                     fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
@@ -480,19 +465,11 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
                 parallels_set_bat_entry(s, i, 0);
                 res->corruptions_fixed++;
             }
-            prev_off = 0;
             continue;
         }
-
-        res->bfi.allocated_clusters++;
-        if (off > high_off) {
+        if (high_off < off) {
             high_off = off;
         }
-
-        if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
-            res->bfi.fragmented_clusters++;
-        }
-        prev_off = off;
     }
 
     if (high_off == 0) {
@@ -502,6 +479,52 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
         s->data_end = res->image_end_offset >> BDRV_SECTOR_BITS;
     }
 
+    return 0;
+}
+
+static int coroutine_fn GRAPH_RDLOCK
+parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
+                   BdrvCheckMode fix)
+{
+    BDRVParallelsState *s = bs->opaque;
+    int64_t size, prev_off;
+    int ret;
+    uint32_t i;
+
+    size = bdrv_getlength(bs->file->bs);
+    if (size < 0) {
+        res->check_errors++;
+        return size;
+    }
+
+    qemu_co_mutex_lock(&s->lock);
+
+    parallels_check_unclean(bs, res, fix);
+
+    ret = parallels_check_outside_image(bs, res, fix);
+    if (ret < 0) {
+        goto out;
+    }
+
+    res->bfi.total_clusters = s->bat_size;
+    res->bfi.compressed_clusters = 0; /* compression is not supported */
+
+    prev_off = 0;
+    for (i = 0; i < s->bat_size; i++) {
+        int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
+        if (off == 0) {
+            prev_off = 0;
+            continue;
+        }
+
+        res->bfi.allocated_clusters++;
+
+        if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
+            res->bfi.fragmented_clusters++;
+        }
+        prev_off = off;
+    }
+
     if (size > res->image_end_offset) {
         int64_t count;
         count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 08/12] parallels: Fix statistics calculation
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (6 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 07/12] parallels: Move check of cluster outside " Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 09/12] parallels: Move check of leaks to a separate function Alexander Ivanov
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

Exclude out-of-image clusters from allocated and fragmented clusters
calculation.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
 block/parallels.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/block/parallels.c b/block/parallels.c
index 8588c3d775..f389a74466 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -512,7 +512,11 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
     prev_off = 0;
     for (i = 0; i < s->bat_size; i++) {
         int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
-        if (off == 0) {
+        /*
+         * If BDRV_FIX_ERRORS is not set, out-of-image BAT entries were not
+         * fixed. Skip not allocated and out-of-image BAT entries.
+         */
+        if (off == 0 || off + s->cluster_size > res->image_end_offset) {
             prev_off = 0;
             continue;
         }
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 09/12] parallels: Move check of leaks to a separate function
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (7 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 08/12] parallels: Fix statistics calculation Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 10/12] parallels: Move statistic collection " Alexander Ivanov
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

We will add more and more checks so we need a better code structure
in parallels_co_check. Let each check performs in a separate loop
in a separate helper.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
 block/parallels.c | 90 ++++++++++++++++++++++++++++-------------------
 1 file changed, 53 insertions(+), 37 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index f389a74466..c3e220b60f 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -483,13 +483,12 @@ parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
 }
 
 static int coroutine_fn GRAPH_RDLOCK
-parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
-                   BdrvCheckMode fix)
+parallels_check_leak(BlockDriverState *bs, BdrvCheckResult *res,
+                     BdrvCheckMode fix)
 {
     BDRVParallelsState *s = bs->opaque;
-    int64_t size, prev_off;
+    int64_t size;
     int ret;
-    uint32_t i;
 
     size = bdrv_getlength(bs->file->bs);
     if (size < 0) {
@@ -497,38 +496,6 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
         return size;
     }
 
-    qemu_co_mutex_lock(&s->lock);
-
-    parallels_check_unclean(bs, res, fix);
-
-    ret = parallels_check_outside_image(bs, res, fix);
-    if (ret < 0) {
-        goto out;
-    }
-
-    res->bfi.total_clusters = s->bat_size;
-    res->bfi.compressed_clusters = 0; /* compression is not supported */
-
-    prev_off = 0;
-    for (i = 0; i < s->bat_size; i++) {
-        int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
-        /*
-         * If BDRV_FIX_ERRORS is not set, out-of-image BAT entries were not
-         * fixed. Skip not allocated and out-of-image BAT entries.
-         */
-        if (off == 0 || off + s->cluster_size > res->image_end_offset) {
-            prev_off = 0;
-            continue;
-        }
-
-        res->bfi.allocated_clusters++;
-
-        if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
-            res->bfi.fragmented_clusters++;
-        }
-        prev_off = off;
-    }
-
     if (size > res->image_end_offset) {
         int64_t count;
         count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
@@ -548,12 +515,61 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
             if (ret < 0) {
                 error_report_err(local_err);
                 res->check_errors++;
-                goto out;
+                return ret;
             }
             res->leaks_fixed += count;
         }
     }
 
+    return 0;
+}
+
+static int coroutine_fn GRAPH_RDLOCK
+parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
+                   BdrvCheckMode fix)
+{
+    BDRVParallelsState *s = bs->opaque;
+    int64_t prev_off;
+    int ret;
+    uint32_t i;
+
+    qemu_co_mutex_lock(&s->lock);
+
+    parallels_check_unclean(bs, res, fix);
+
+    ret = parallels_check_outside_image(bs, res, fix);
+    if (ret < 0) {
+        goto out;
+    }
+
+    ret = parallels_check_leak(bs, res, fix);
+    if (ret < 0) {
+        goto out;
+    }
+
+    res->bfi.total_clusters = s->bat_size;
+    res->bfi.compressed_clusters = 0; /* compression is not supported */
+
+    prev_off = 0;
+    for (i = 0; i < s->bat_size; i++) {
+        int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
+        /*
+         * If BDRV_FIX_ERRORS is not set, out-of-image BAT entries were not
+         * fixed. Skip not allocated and out-of-image BAT entries.
+         */
+        if (off == 0 || off + s->cluster_size > res->image_end_offset) {
+            prev_off = 0;
+            continue;
+        }
+
+        res->bfi.allocated_clusters++;
+
+        if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
+            res->bfi.fragmented_clusters++;
+        }
+        prev_off = off;
+    }
+
 out:
     qemu_co_mutex_unlock(&s->lock);
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 10/12] parallels: Move statistic collection to a separate function
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (8 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 09/12] parallels: Move check of leaks to a separate function Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD Alexander Ivanov
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

We will add more and more checks so we need a better code structure
in parallels_co_check. Let each check performs in a separate loop
in a separate helper.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 block/parallels.c | 52 +++++++++++++++++++++++++++--------------------
 1 file changed, 30 insertions(+), 22 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index c3e220b60f..48ee5224c7 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -524,35 +524,20 @@ parallels_check_leak(BlockDriverState *bs, BdrvCheckResult *res,
     return 0;
 }
 
-static int coroutine_fn GRAPH_RDLOCK
-parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
-                   BdrvCheckMode fix)
+static void parallels_collect_statistics(BlockDriverState *bs,
+                                         BdrvCheckResult *res,
+                                         BdrvCheckMode fix)
 {
     BDRVParallelsState *s = bs->opaque;
-    int64_t prev_off;
-    int ret;
+    int64_t off, prev_off;
     uint32_t i;
 
-    qemu_co_mutex_lock(&s->lock);
-
-    parallels_check_unclean(bs, res, fix);
-
-    ret = parallels_check_outside_image(bs, res, fix);
-    if (ret < 0) {
-        goto out;
-    }
-
-    ret = parallels_check_leak(bs, res, fix);
-    if (ret < 0) {
-        goto out;
-    }
-
     res->bfi.total_clusters = s->bat_size;
     res->bfi.compressed_clusters = 0; /* compression is not supported */
 
     prev_off = 0;
     for (i = 0; i < s->bat_size; i++) {
-        int64_t off = bat2sect(s, i) << BDRV_SECTOR_BITS;
+        off = bat2sect(s, i) << BDRV_SECTOR_BITS;
         /*
          * If BDRV_FIX_ERRORS is not set, out-of-image BAT entries were not
          * fixed. Skip not allocated and out-of-image BAT entries.
@@ -562,13 +547,36 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
             continue;
         }
 
-        res->bfi.allocated_clusters++;
-
         if (prev_off != 0 && (prev_off + s->cluster_size) != off) {
             res->bfi.fragmented_clusters++;
         }
         prev_off = off;
+        res->bfi.allocated_clusters++;
     }
+}
+
+static int coroutine_fn GRAPH_RDLOCK
+parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
+                   BdrvCheckMode fix)
+{
+    BDRVParallelsState *s = bs->opaque;
+    int ret;
+
+    qemu_co_mutex_lock(&s->lock);
+
+    parallels_check_unclean(bs, res, fix);
+
+    ret = parallels_check_outside_image(bs, res, fix);
+    if (ret < 0) {
+        goto out;
+    }
+
+    ret = parallels_check_leak(bs, res, fix);
+    if (ret < 0) {
+        goto out;
+    }
+
+    parallels_collect_statistics(bs, res, fix);
 
 out:
     qemu_co_mutex_unlock(&s->lock);
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (9 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 10/12] parallels: Move statistic collection " Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-24  9:31 ` [PATCH v11 12/12] parallels: Incorrect condition in out-of-image check Alexander Ivanov
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

Replace the way we use mutex in parallels_co_check() for simplier
and less error prone code.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
---
 block/parallels.c | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 48ee5224c7..a6a1c7ce0e 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -562,30 +562,25 @@ parallels_co_check(BlockDriverState *bs, BdrvCheckResult *res,
     BDRVParallelsState *s = bs->opaque;
     int ret;
 
-    qemu_co_mutex_lock(&s->lock);
+    WITH_QEMU_LOCK_GUARD(&s->lock) {
+        parallels_check_unclean(bs, res, fix);
 
-    parallels_check_unclean(bs, res, fix);
+        ret = parallels_check_outside_image(bs, res, fix);
+        if (ret < 0) {
+            return ret;
+        }
 
-    ret = parallels_check_outside_image(bs, res, fix);
-    if (ret < 0) {
-        goto out;
-    }
+        ret = parallels_check_leak(bs, res, fix);
+        if (ret < 0) {
+            return ret;
+        }
 
-    ret = parallels_check_leak(bs, res, fix);
-    if (ret < 0) {
-        goto out;
+        parallels_collect_statistics(bs, res, fix);
     }
 
-    parallels_collect_statistics(bs, res, fix);
-
-out:
-    qemu_co_mutex_unlock(&s->lock);
-
-    if (ret == 0) {
-        ret = bdrv_co_flush(bs);
-        if (ret < 0) {
-            res->check_errors++;
-        }
+    ret = bdrv_co_flush(bs);
+    if (ret < 0) {
+        res->check_errors++;
     }
 
     return ret;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v11 12/12] parallels: Incorrect condition in out-of-image check
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (10 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD Alexander Ivanov
@ 2023-04-24  9:31 ` Alexander Ivanov
  2023-04-26 15:07 ` [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Denis V. Lunev
  2023-04-28 16:36 ` Hanna Czenczek
  13 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-24  9:31 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz

All the offsets in the BAT must be lower than the file size.
Fix the check condition for correct check.

Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
---
 block/parallels.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block/parallels.c b/block/parallels.c
index a6a1c7ce0e..ce9ac47c55 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -457,7 +457,7 @@ parallels_check_outside_image(BlockDriverState *bs, BdrvCheckResult *res,
     high_off = 0;
     for (i = 0; i < s->bat_size; i++) {
         off = bat2sect(s, i) << BDRV_SECTOR_BITS;
-        if (off > size) {
+        if (off + s->cluster_size > size) {
             fprintf(stderr, "%s cluster %u is outside image\n",
                     fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
             res->corruptions++;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (11 preceding siblings ...)
  2023-04-24  9:31 ` [PATCH v11 12/12] parallels: Incorrect condition in out-of-image check Alexander Ivanov
@ 2023-04-26 15:07 ` Denis V. Lunev
  2023-04-26 19:22   ` Alexander Ivanov
  2023-04-28 16:36 ` Hanna Czenczek
  13 siblings, 1 reply; 17+ messages in thread
From: Denis V. Lunev @ 2023-04-26 15:07 UTC (permalink / raw)
  To: Alexander Ivanov, qemu-devel
  Cc: qemu-block, stefanha, vsementsov, kwolf, hreitz

On 4/24/23 11:31, Alexander Ivanov wrote:
> Fix image inflation when offset in BAT is out of image.
>
> Replace whole BAT syncing by flushing only dirty blocks.
>
> Move all the checks outside the main check function in
> separate functions
>
> Use WITH_QEMU_LOCK_GUARD for simplier code.
>
> Fix incorrect condition in out-of-image check.
>
> v11:
> 1: Use bdrv_nb_sectors() instead of bdrv_getlength() to get image size in sectors.
> 7,9: Add coroutine_fn and GRAPH_RDLOCK annotations.
>
> v10:
> 8: Add a comment.
> 9: Exclude unrelated changes.
>
> v9:
> 3: Add (high_off == 0) case handling.
> 7: Move res->image_end_offset setting to parallels_check_outside_image().
> 8: Add a patch with a statistics calculation fix.
> 9: Remove redundant high_off calculation.
> 12: Change the condition to (off + s->cluster_size > size).
>
> v8: Rebase on the top of the current master branch.
>
> v7:
> 1,2: Fix string lengths in the commit messages.
> 3: Fix a typo in the commit message.
>
> v6:
> 1: Move the error check inside the loop. Move file size getting
>     to the function beginning. Skip out-of-image offsets.
> 2: A new patch - don't let high_off be more than the end of the last cluster.
> 3: Set data_end without any condition.
> 7: Move data_end setting to parallels_check_outside_image().
> 8: Remove s->data_end setting from parallels_check_leak().
>     Fix 'i' type.
>
> v5:
> 2: Change the way of data_end fixing.
> 6,7: Move data_end check to parallels_check_leak().
>
> v4:
> 1: Move s->data_end fix to parallels_co_check(). Split the check
>     in parallels_open() and the fix in parallels_co_check() to two patches.
> 2: A new patch - a part of the patch 1.
>     Add a fix for data_end to parallels_co_check().
> 3: Move offset convertation to parallels_set_bat_entry().
> 4: Fix 'ret' rewriting by bdrv_co_flush() results.
> 7: Keep 'i' as uint32_t.
>
> v3:
>
> 1-8: Fix commit message.
>
> v2:
>
> 2: A new patch - a part of the splitted patch 2.
> 3: Patch order was changed so the replacement is done in parallels_co_check.
>     Now we use a helper to set BAT entry and mark the block dirty.
> 4: Revert the condition with s->header_unclean.
> 5: Move unrelated helper parallels_set_bat_entry creation to a separate patch.
> 7: Move fragmentation counting code to this function too.
> 8: Fix an incorrect usage of WITH_QEMU_LOCK_GUARD.
>
> Alexander Ivanov (12):
>    parallels: Out of image offset in BAT leads to image inflation
>    parallels: Fix high_off calculation in parallels_co_check()
>    parallels: Fix image_end_offset and data_end after out-of-image check
>    parallels: create parallels_set_bat_entry_helper() to assign BAT value
>    parallels: Use generic infrastructure for BAT writing in
>      parallels_co_check()
>    parallels: Move check of unclean image to a separate function
>    parallels: Move check of cluster outside image to a separate function
>    parallels: Fix statistics calculation
>    parallels: Move check of leaks to a separate function
>    parallels: Move statistic collection to a separate function
>    parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD
>    parallels: Incorrect condition in out-of-image check
>
>   block/parallels.c | 190 +++++++++++++++++++++++++++++++++-------------
>   1 file changed, 136 insertions(+), 54 deletions(-)
>
I am a little bit puzzled - there are 2 series v11 sent within
15 minutes. Which one is correct?

Den


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug
  2023-04-26 15:07 ` [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Denis V. Lunev
@ 2023-04-26 19:22   ` Alexander Ivanov
  0 siblings, 0 replies; 17+ messages in thread
From: Alexander Ivanov @ 2023-04-26 19:22 UTC (permalink / raw)
  To: Denis V. Lunev, qemu-devel
  Cc: qemu-block, stefanha, vsementsov, kwolf, hreitz

The patchests are the same, but the first one has incorrect receivers. 
Please just ignore it.
I've sent a email about it, but i mistook twice and sent it to 
qemu-devel@nongnu.org only.


On 4/26/23 17:07, Denis V. Lunev wrote:
> On 4/24/23 11:31, Alexander Ivanov wrote:
>> Fix image inflation when offset in BAT is out of image.
>>
>> Replace whole BAT syncing by flushing only dirty blocks.
>>
>> Move all the checks outside the main check function in
>> separate functions
>>
>> Use WITH_QEMU_LOCK_GUARD for simplier code.
>>
>> Fix incorrect condition in out-of-image check.
>>
>> v11:
>> 1: Use bdrv_nb_sectors() instead of bdrv_getlength() to get image 
>> size in sectors.
>> 7,9: Add coroutine_fn and GRAPH_RDLOCK annotations.
>>
>> v10:
>> 8: Add a comment.
>> 9: Exclude unrelated changes.
>>
>> v9:
>> 3: Add (high_off == 0) case handling.
>> 7: Move res->image_end_offset setting to 
>> parallels_check_outside_image().
>> 8: Add a patch with a statistics calculation fix.
>> 9: Remove redundant high_off calculation.
>> 12: Change the condition to (off + s->cluster_size > size).
>>
>> v8: Rebase on the top of the current master branch.
>>
>> v7:
>> 1,2: Fix string lengths in the commit messages.
>> 3: Fix a typo in the commit message.
>>
>> v6:
>> 1: Move the error check inside the loop. Move file size getting
>>     to the function beginning. Skip out-of-image offsets.
>> 2: A new patch - don't let high_off be more than the end of the last 
>> cluster.
>> 3: Set data_end without any condition.
>> 7: Move data_end setting to parallels_check_outside_image().
>> 8: Remove s->data_end setting from parallels_check_leak().
>>     Fix 'i' type.
>>
>> v5:
>> 2: Change the way of data_end fixing.
>> 6,7: Move data_end check to parallels_check_leak().
>>
>> v4:
>> 1: Move s->data_end fix to parallels_co_check(). Split the check
>>     in parallels_open() and the fix in parallels_co_check() to two 
>> patches.
>> 2: A new patch - a part of the patch 1.
>>     Add a fix for data_end to parallels_co_check().
>> 3: Move offset convertation to parallels_set_bat_entry().
>> 4: Fix 'ret' rewriting by bdrv_co_flush() results.
>> 7: Keep 'i' as uint32_t.
>>
>> v3:
>>
>> 1-8: Fix commit message.
>>
>> v2:
>>
>> 2: A new patch - a part of the splitted patch 2.
>> 3: Patch order was changed so the replacement is done in 
>> parallels_co_check.
>>     Now we use a helper to set BAT entry and mark the block dirty.
>> 4: Revert the condition with s->header_unclean.
>> 5: Move unrelated helper parallels_set_bat_entry creation to a 
>> separate patch.
>> 7: Move fragmentation counting code to this function too.
>> 8: Fix an incorrect usage of WITH_QEMU_LOCK_GUARD.
>>
>> Alexander Ivanov (12):
>>    parallels: Out of image offset in BAT leads to image inflation
>>    parallels: Fix high_off calculation in parallels_co_check()
>>    parallels: Fix image_end_offset and data_end after out-of-image check
>>    parallels: create parallels_set_bat_entry_helper() to assign BAT 
>> value
>>    parallels: Use generic infrastructure for BAT writing in
>>      parallels_co_check()
>>    parallels: Move check of unclean image to a separate function
>>    parallels: Move check of cluster outside image to a separate function
>>    parallels: Fix statistics calculation
>>    parallels: Move check of leaks to a separate function
>>    parallels: Move statistic collection to a separate function
>>    parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD
>>    parallels: Incorrect condition in out-of-image check
>>
>>   block/parallels.c | 190 +++++++++++++++++++++++++++++++++-------------
>>   1 file changed, 136 insertions(+), 54 deletions(-)
>>
> I am a little bit puzzled - there are 2 series v11 sent within
> 15 minutes. Which one is correct?
>
> Den



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug
  2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
                   ` (12 preceding siblings ...)
  2023-04-26 15:07 ` [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Denis V. Lunev
@ 2023-04-28 16:36 ` Hanna Czenczek
  13 siblings, 0 replies; 17+ messages in thread
From: Hanna Czenczek @ 2023-04-28 16:36 UTC (permalink / raw)
  To: Alexander Ivanov, qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf

On 24.04.23 11:31, Alexander Ivanov wrote:
> Fix image inflation when offset in BAT is out of image.
>
> Replace whole BAT syncing by flushing only dirty blocks.
>
> Move all the checks outside the main check function in
> separate functions
>
> Use WITH_QEMU_LOCK_GUARD for simplier code.
>
> Fix incorrect condition in out-of-image check.

Reviewed-by: Hanna Czenczek <hreitz@redhat.com>



^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2023-04-28 16:37 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-24  9:31 [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 02/12] parallels: Fix high_off calculation in parallels_co_check() Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 03/12] parallels: Fix image_end_offset and data_end after out-of-image check Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 04/12] parallels: create parallels_set_bat_entry_helper() to assign BAT value Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 05/12] parallels: Use generic infrastructure for BAT writing in parallels_co_check() Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 06/12] parallels: Move check of unclean image to a separate function Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 07/12] parallels: Move check of cluster outside " Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 08/12] parallels: Fix statistics calculation Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 09/12] parallels: Move check of leaks to a separate function Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 10/12] parallels: Move statistic collection " Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 11/12] parallels: Replace qemu_co_mutex_lock by WITH_QEMU_LOCK_GUARD Alexander Ivanov
2023-04-24  9:31 ` [PATCH v11 12/12] parallels: Incorrect condition in out-of-image check Alexander Ivanov
2023-04-26 15:07 ` [PATCH v11 00/12] parallels: Refactor the code of images checks and fix a bug Denis V. Lunev
2023-04-26 19:22   ` Alexander Ivanov
2023-04-28 16:36 ` Hanna Czenczek
  -- strict thread matches above, loose matches on Subject: below --
2023-04-24  9:16 Alexander Ivanov
2023-04-24  9:16 ` [PATCH v11 01/12] parallels: Out of image offset in BAT leads to image inflation Alexander Ivanov

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).