* [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs
@ 2022-08-17 15:53 Alexander Ivanov
2022-08-17 15:53 ` [PATCH 01/10] parallels: Incorrect condition in out-of-image check Alexander Ivanov
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
This patchset depends on the patchset
[PATCH v3 0/8] parallels: Refactor the code of images checks and fix a bug
Fix an incorrect condition in out-of-image check and
incorrect data end calculation in parallels_open().
Add parallels_handle_leak() and highest_offset() helpers.
Add checking and repairing duplicate offsets in BAT.
Add tests for parallels format checks.
Refactor and fix old parallels tests.
Alexander Ivanov (10):
parallels: Incorrect condition in out-of-image check
parallels: Incorrect data end calculation in parallels_open
parallels: Create parallels_handle_leak() to truncate excess clusters
parallels: Add checking and repairing duplicate offsets in BAT
parallels: Use highest_offset() helper in leak check
iotests: Add out-of-image check test for parallels format
iotests: Add leak check test for parallels format
iotests: Add test for BAT entries duplication check
iotests: Refactor tests of parallels images checks (131)
iotests: Fix cluster size in parallels images tests (131)
block/parallels.c | 217 +++++++++++++++---
tests/qemu-iotests/131 | 32 +--
tests/qemu-iotests/131.out | 44 ++--
tests/qemu-iotests/tests/parallels-checks | 136 +++++++++++
tests/qemu-iotests/tests/parallels-checks.out | 75 ++++++
5 files changed, 437 insertions(+), 67 deletions(-)
create mode 100755 tests/qemu-iotests/tests/parallels-checks
create mode 100644 tests/qemu-iotests/tests/parallels-checks.out
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 01/10] parallels: Incorrect condition in out-of-image check
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 02/10] parallels: Incorrect data end calculation in parallels_open Alexander Ivanov
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
All the offsets in the BAT must be at least one cluster away from
the end of the data area.
Fix the check condition for correct check.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/block/parallels.c b/block/parallels.c
index e124a8bb7d..c42c955075 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -455,7 +455,7 @@ static int parallels_check_outside_image(BlockDriverState *bs,
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] 11+ messages in thread
* [PATCH 02/10] parallels: Incorrect data end calculation in parallels_open
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
2022-08-17 15:53 ` [PATCH 01/10] parallels: Incorrect condition in out-of-image check Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 03/10] parallels: Create parallels_handle_leak() to truncate excess clusters Alexander Ivanov
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
The BDRVParallelsState structure contains data_end field that
is measured in sectors.
In parallels_open() initially this field is set by data_off field from
parallels image header.
According to the parallels format documentation,
data_off field contains an offset, in sectors, from the start of the file
to the start of the data area.
For "WithoutFreeSpace" images: if data_off is zero,
the offset is calculated as the end of the BAT table
plus some padding to ensure sector size alignment.
The parallels_open() function has code for handling zero value in data_off,
but in the result data_end contains the offset in bytes.
Replace the alignment to sector size by division by sector size.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/block/parallels.c b/block/parallels.c
index c42c955075..ce04a4da71 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -850,7 +850,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
}
s->data_end = le32_to_cpu(ph.data_off);
if (s->data_end == 0) {
- s->data_end = ROUND_UP(bat_entry_off(s->bat_size), BDRV_SECTOR_SIZE);
+ s->data_end = DIV_ROUND_UP(bat_entry_off(s->bat_size),
+ BDRV_SECTOR_SIZE);
}
if (s->data_end < s->header_size) {
/* there is not enough unused space to fit to block align between BAT
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 03/10] parallels: Create parallels_handle_leak() to truncate excess clusters
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
2022-08-17 15:53 ` [PATCH 01/10] parallels: Incorrect condition in out-of-image check Alexander Ivanov
2022-08-17 15:53 ` [PATCH 02/10] parallels: Incorrect data end calculation in parallels_open Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 04/10] parallels: Add checking and repairing duplicate offsets in BAT Alexander Ivanov
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
This helper will be reused in the next patch for duplications check.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 83 ++++++++++++++++++++++++++++++-----------------
1 file changed, 53 insertions(+), 30 deletions(-)
diff --git a/block/parallels.c b/block/parallels.c
index ce04a4da71..eba064247a 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -469,19 +469,48 @@ static int parallels_check_outside_image(BlockDriverState *bs,
return 0;
}
+static int64_t parallels_handle_leak(BlockDriverState *bs,
+ BdrvCheckResult *res,
+ int64_t high_off,
+ bool fix)
+{
+ BDRVParallelsState *s = bs->opaque;
+ int64_t size;
+ int ret;
+
+ size = bdrv_getlength(bs->file->bs);
+ if (size < 0) {
+ return size;
+ }
+
+ res->image_end_offset = high_off + s->cluster_size;
+ if (size <= res->image_end_offset) {
+ return 0;
+ }
+
+ if (fix) {
+ Error *local_err = NULL;
+ /*
+ * In order to really repair the image, we must shrink it.
+ * That means we have to pass exact=true.
+ */
+ ret = bdrv_truncate(bs->file, res->image_end_offset, true,
+ PREALLOC_MODE_OFF, 0, &local_err);
+ if (ret < 0) {
+ error_report_err(local_err);
+ return ret;
+ }
+ }
+ return size - res->image_end_offset;
+}
+
static int parallels_check_leak(BlockDriverState *bs,
BdrvCheckResult *res,
BdrvCheckMode fix)
{
BDRVParallelsState *s = bs->opaque;
- int64_t size, off, high_off, count;
- int i, ret;
-
- size = bdrv_getlength(bs->file->bs);
- if (size < 0) {
- res->check_errors++;
- return size;
- }
+ int64_t off, high_off, count, cut_out;
+ int i;
high_off = 0;
for (i = 0; i < s->bat_size; i++) {
@@ -491,30 +520,24 @@ static int parallels_check_leak(BlockDriverState *bs,
}
}
- res->image_end_offset = high_off + s->cluster_size;
- if (size > res->image_end_offset) {
- count = DIV_ROUND_UP(size - res->image_end_offset, s->cluster_size);
- fprintf(stderr, "%s space leaked at the end of the image %" PRId64 "\n",
- fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR",
- size - res->image_end_offset);
- res->leaks += count;
- if (fix & BDRV_FIX_LEAKS) {
- Error *local_err = NULL;
+ cut_out = parallels_handle_leak(bs, res, high_off, fix & BDRV_FIX_LEAKS);
+ if (cut_out < 0) {
+ res->check_errors++;
+ return cut_out;
+ }
+ if (cut_out == 0) {
+ return 0;
+ }
- /*
- * In order to really repair the image, we must shrink it.
- * That means we have to pass exact=true.
- */
- ret = bdrv_truncate(bs->file, res->image_end_offset, true,
- PREALLOC_MODE_OFF, 0, &local_err);
- if (ret < 0) {
- error_report_err(local_err);
- res->check_errors++;
- return ret;
- }
- res->leaks_fixed += count;
- }
+ count = DIV_ROUND_UP(cut_out, s->cluster_size);
+ fprintf(stderr, "%s space leaked at the end of the image %" PRId64 "\n",
+ fix & BDRV_FIX_LEAKS ? "Repairing" : "ERROR", cut_out);
+
+ res->leaks += count;
+ if (fix & BDRV_FIX_LEAKS) {
+ res->leaks_fixed += count;
}
+
return 0;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 04/10] parallels: Add checking and repairing duplicate offsets in BAT
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (2 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 03/10] parallels: Create parallels_handle_leak() to truncate excess clusters Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 05/10] parallels: Use highest_offset() helper in leak check Alexander Ivanov
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Cluster offsets must be unique among all BAT entries.
Find duplicate offsets in the BAT.
If a duplicated offset is found fix it by copying the content
of the relevant cluster to a new allocated cluster and
set the new cluster offset to the duplicated entry.
Add host_cluster_index() helper to deduplicate the code.
Add highest_offset() helper. It will be used for code deduplication
in the next patch.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/block/parallels.c b/block/parallels.c
index eba064247a..bd129f44fa 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -136,6 +136,26 @@ static int cluster_remainder(BDRVParallelsState *s, int64_t sector_num,
return MIN(nb_sectors, ret);
}
+static uint32_t host_cluster_index(BDRVParallelsState *s, int64_t off)
+{
+ off -= s->header->data_off << BDRV_SECTOR_BITS;
+ return off / s->cluster_size;
+}
+
+static int64_t highest_offset(BDRVParallelsState *s)
+{
+ int64_t off, high_off = 0;
+ int i;
+
+ for (i = 0; i < s->bat_size; i++) {
+ off = bat2sect(s, i) << BDRV_SECTOR_BITS;
+ if (off > high_off) {
+ high_off = off;
+ }
+ }
+ return high_off;
+}
+
static int64_t block_status(BDRVParallelsState *s, int64_t sector_num,
int nb_sectors, int *pnum)
{
@@ -541,6 +561,114 @@ static int parallels_check_leak(BlockDriverState *bs,
return 0;
}
+static int parallels_check_duplicate(BlockDriverState *bs,
+ BdrvCheckResult *res,
+ BdrvCheckMode fix)
+{
+ BDRVParallelsState *s = bs->opaque;
+ QEMUIOVector qiov;
+ int64_t off, high_off, sector;
+ unsigned long *bitmap;
+ uint32_t i, bitmap_size, cluster_index;
+ int n, ret = 0;
+ uint64_t *buf = NULL;
+ bool new_allocations = false;
+
+ high_off = highest_offset(s);
+ if (high_off == 0) {
+ return 0;
+ }
+
+ /*
+ * Create a bitmap of used clusters.
+ * If a bit is set, there is a BAT entry pointing to this cluster.
+ * Loop through the BAT entrues, check bits relevant to an entry offset.
+ * If bit is set, this entry is duplicated. Otherwise set the bit.
+ */
+ bitmap_size = host_cluster_index(s, high_off) + 1;
+ bitmap = bitmap_new(bitmap_size);
+
+ buf = g_malloc(s->cluster_size);
+ qemu_iovec_init(&qiov, 0);
+ qemu_iovec_add(&qiov, buf, s->cluster_size);
+
+ for (i = 0; i < s->bat_size; i++) {
+ off = bat2sect(s, i) << BDRV_SECTOR_BITS;
+ if (off == 0) {
+ continue;
+ }
+
+ cluster_index = host_cluster_index(s, off);
+ if (test_bit(cluster_index, bitmap)) {
+ /* this cluster duplicates another one */
+ fprintf(stderr,
+ "%s duplicate offset in BAT entry %u\n",
+ fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
+
+ res->corruptions++;
+
+ if (fix & BDRV_FIX_ERRORS) {
+ /*
+ * Reset the entry and allocate a new cluster
+ * for the relevant guest offset. In this way we let
+ * the lower layer to place the new cluster properly.
+ * Copy the original cluster to the allocated one.
+ */
+ parallels_set_bat_entry(s, i, 0);
+
+ ret = bdrv_pread(bs->file, off, s->cluster_size, buf, 0);
+ if (ret < 0) {
+ res->check_errors++;
+ goto out;
+ }
+
+ sector = (i * s->cluster_size) >> BDRV_SECTOR_BITS;
+ off = allocate_clusters(bs, sector, s->tracks, &n);
+ if (off < 0) {
+ res->check_errors++;
+ ret = off;
+ goto out;
+ }
+ off <<= BDRV_SECTOR_BITS;
+ if (off > high_off) {
+ high_off = off;
+ }
+
+ ret = bdrv_co_pwritev(bs->file, off, s->cluster_size, &qiov, 0);
+ if (ret < 0) {
+ res->check_errors++;
+ goto out;
+ }
+
+ new_allocations = true;
+ res->corruptions_fixed++;
+ }
+
+ } else {
+ bitmap_set(bitmap, cluster_index, 1);
+ }
+ }
+
+ if (new_allocations) {
+ /*
+ * When new clusters are allocated, file size increases
+ * by 128 Mb blocks. We need to truncate the file to the
+ * right size.
+ */
+ ret = parallels_handle_leak(bs, res, high_off, true);
+ if (ret < 0) {
+ res->check_errors++;
+ goto out;
+ }
+ }
+
+out:
+ qemu_iovec_destroy(&qiov);
+ g_free(buf);
+ g_free(bitmap);
+ return ret;
+}
+
static void parallels_collect_statistics(BlockDriverState *bs,
BdrvCheckResult *res,
BdrvCheckMode fix)
@@ -589,6 +717,14 @@ static int coroutine_fn parallels_co_check(BlockDriverState *bs,
return ret;
}
+ /* This checks only for "WithouFreSpacExt" format */
+ if (!memcmp(s->header->magic, HEADER_MAGIC2, 16)) {
+ ret = parallels_check_duplicate(bs, res, fix);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
parallels_collect_statistics(bs, res, fix);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 05/10] parallels: Use highest_offset() helper in leak check
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (3 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 04/10] parallels: Add checking and repairing duplicate offsets in BAT Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 06/10] iotests: Add out-of-image check test for parallels format Alexander Ivanov
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Deduplicate code by using highest_offset() helper.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
block/parallels.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/block/parallels.c b/block/parallels.c
index bd129f44fa..93d21804f2 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -530,15 +530,8 @@ static int parallels_check_leak(BlockDriverState *bs,
{
BDRVParallelsState *s = bs->opaque;
int64_t off, high_off, count, cut_out;
- int i;
- high_off = 0;
- for (i = 0; i < s->bat_size; i++) {
- off = bat2sect(s, i) << BDRV_SECTOR_BITS;
- if (off > high_off) {
- high_off = off;
- }
- }
+ high_off = highest_offset(s);
cut_out = parallels_handle_leak(bs, res, high_off, fix & BDRV_FIX_LEAKS);
if (cut_out < 0) {
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 06/10] iotests: Add out-of-image check test for parallels format
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (4 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 05/10] parallels: Use highest_offset() helper in leak check Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 07/10] iotests: Add leak " Alexander Ivanov
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Fill the image with a pattern to generate entries in the BAT,
set the first BAT entry outside the image, try to read the corrupted image,
repair and check for zeroes in the first cluster.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
tests/qemu-iotests/tests/parallels-checks | 78 +++++++++++++++++++
tests/qemu-iotests/tests/parallels-checks.out | 22 ++++++
2 files changed, 100 insertions(+)
create mode 100755 tests/qemu-iotests/tests/parallels-checks
create mode 100644 tests/qemu-iotests/tests/parallels-checks.out
diff --git a/tests/qemu-iotests/tests/parallels-checks b/tests/qemu-iotests/tests/parallels-checks
new file mode 100755
index 0000000000..5aaadb0c74
--- /dev/null
+++ b/tests/qemu-iotests/tests/parallels-checks
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+# group: rw quick
+#
+# Test qemu-img check for parallels format
+#
+# Copyright (C) 2022 Virtuozzo International GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# creator
+owner=alexander.ivanov@virtuozzo.com
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+status=1 # failure is the default!
+
+_cleanup()
+{
+ _cleanup_test_img
+}
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ../common.rc
+. ../common.filter
+
+_supported_fmt parallels
+_supported_proto file
+_supported_os Linux
+
+SIZE=$((4 * 1024 * 1024))
+IMGFMT=parallels
+CLUSTER_SIZE_OFFSET=28
+BAT_OFFSET=64
+
+_make_test_img $SIZE
+
+CLUSTER_SIZE=$(peek_file_le $TEST_IMG $CLUSTER_SIZE_OFFSET 4)
+CLUSTER_SIZE=$((CLUSTER_SIZE * 512))
+LAST_CLUSTER_OFF=$((SIZE - CLUSTER_SIZE))
+LAST_CLUSTER=$((LAST_CLUSTER_OFF/CLUSTER_SIZE))
+
+echo "== TEST OUT OF IMAGE CHECK =="
+
+echo "== write pattern =="
+{ $QEMU_IO -c "write -P 0x11 0 $SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== corrupt image =="
+cluster=$(($LAST_CLUSTER + 2))
+poke_file "$TEST_IMG" "$BAT_OFFSET" "\x$cluster\x00\x00\x00"
+
+echo "== read corrupted image =="
+{ $QEMU_IO -c "read -P 0x11 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== repair image =="
+_check_test_img -r all
+
+echo "== read repaired image =="
+{ $QEMU_IO -c "read -P 0x00 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+
+# success, all done
+echo "*** done"
+rm -f $seq.full
+status=0
diff --git a/tests/qemu-iotests/tests/parallels-checks.out b/tests/qemu-iotests/tests/parallels-checks.out
new file mode 100644
index 0000000000..787851a250
--- /dev/null
+++ b/tests/qemu-iotests/tests/parallels-checks.out
@@ -0,0 +1,22 @@
+QA output created by parallels-checks
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304
+== TEST OUT OF IMAGE CHECK ==
+== write pattern ==
+wrote 4194304/4194304 bytes at offset 0
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== corrupt image ==
+== read corrupted image ==
+qemu-io: can't open device TEST_DIR/t.parallels: parallels: Offset in BAT is out of image
+== repair image ==
+Repairing cluster 0 is outside image
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 1 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
+== read repaired image ==
+read 1048576/1048576 bytes at offset 0
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+*** done
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 07/10] iotests: Add leak check test for parallels format
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (5 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 06/10] iotests: Add out-of-image check test for parallels format Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:53 ` [PATCH 08/10] iotests: Add test for BAT entries duplication check Alexander Ivanov
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Write a pattern to the last cluster, extend the image
by 1 claster, repair and check that the last cluster
still has the same pattern.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
tests/qemu-iotests/tests/parallels-checks | 27 +++++++++++++++++++
tests/qemu-iotests/tests/parallels-checks.out | 22 +++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/tests/qemu-iotests/tests/parallels-checks b/tests/qemu-iotests/tests/parallels-checks
index 5aaadb0c74..a793b8c2fe 100755
--- a/tests/qemu-iotests/tests/parallels-checks
+++ b/tests/qemu-iotests/tests/parallels-checks
@@ -71,6 +71,33 @@ _check_test_img -r all
echo "== read repaired image =="
{ $QEMU_IO -c "read -P 0x00 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+# Clear image
+_make_test_img $SIZE
+
+echo "== TEST LEAK CHECK =="
+
+echo "== write pattern to last cluster =="
+echo "write -P 0x11 $LAST_CLUSTER_OFF $CLUSTER_SIZE"
+{ $QEMU_IO -c "write -P 0x11 $LAST_CLUSTER_OFF $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+file_size=`stat --printf="%s" "$TEST_IMG"`
+echo "file size: $file_size"
+
+echo "== extend image by 1 cluster =="
+fallocate -l $((file_size + CLUSTER_SIZE)) "$TEST_IMG"
+
+file_size=`stat --printf="%s" "$TEST_IMG"`
+echo "file size: $file_size"
+
+echo "== repair image =="
+_check_test_img -r all
+
+file_size=`stat --printf="%s" "$TEST_IMG"`
+echo "file size: $file_size"
+
+echo "== check last cluster =="
+{ $QEMU_IO -c "read -P 0x11 $LAST_CLUSTER_OFF $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
# success, all done
echo "*** done"
diff --git a/tests/qemu-iotests/tests/parallels-checks.out b/tests/qemu-iotests/tests/parallels-checks.out
index 787851a250..fa0fca953e 100644
--- a/tests/qemu-iotests/tests/parallels-checks.out
+++ b/tests/qemu-iotests/tests/parallels-checks.out
@@ -19,4 +19,26 @@ No errors were found on the image.
== read repaired image ==
read 1048576/1048576 bytes at offset 0
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304
+== TEST LEAK CHECK ==
+== write pattern to last cluster ==
+write -P 0x11 3145728 1048576
+wrote 1048576/1048576 bytes at offset 3145728
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+file size: 2097152
+== extend image by 1 cluster ==
+file size: 3145728
+== repair image ==
+Repairing space leaked at the end of the image 1048576
+The following inconsistencies were found and repaired:
+
+ 1 leaked clusters
+ 0 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
+file size: 2097152
+== check last cluster ==
+read 1048576/1048576 bytes at offset 3145728
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
*** done
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 08/10] iotests: Add test for BAT entries duplication check
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (6 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 07/10] iotests: Add leak " Alexander Ivanov
@ 2022-08-17 15:53 ` Alexander Ivanov
2022-08-17 15:54 ` [PATCH 09/10] iotests: Refactor tests of parallels images checks (131) Alexander Ivanov
2022-08-17 15:54 ` [PATCH 10/10] iotests: Fix cluster size in parallels images tests (131) Alexander Ivanov
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:53 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Fill the image with a pattern and write another pattern
in the second cluster. Corrupt the image and check if the pattern
changes. Repair the image and check the patterns on guest
and host sides.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
tests/qemu-iotests/tests/parallels-checks | 31 +++++++++++++++++++
tests/qemu-iotests/tests/parallels-checks.out | 31 +++++++++++++++++++
2 files changed, 62 insertions(+)
diff --git a/tests/qemu-iotests/tests/parallels-checks b/tests/qemu-iotests/tests/parallels-checks
index a793b8c2fe..64d9f9c273 100755
--- a/tests/qemu-iotests/tests/parallels-checks
+++ b/tests/qemu-iotests/tests/parallels-checks
@@ -98,6 +98,37 @@ echo "file size: $file_size"
echo "== check last cluster =="
{ $QEMU_IO -c "read -P 0x11 $LAST_CLUSTER_OFF $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+# Clear image
+_make_test_img $SIZE
+
+echo "== TEST DUPLICATION CHECK =="
+
+echo "== write pattern to whole image =="
+{ $QEMU_IO -c "write -P 0x11 0 $SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== write another pattern to second cluster =="
+{ $QEMU_IO -c "write -P 0x55 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== check second cluster =="
+{ $QEMU_IO -c "read -P 0x55 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== corrupt image =="
+poke_file "$TEST_IMG" "$(($BAT_OFFSET + 4))" "\x01\x00\x00\x00"
+
+echo "== check second cluster =="
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== repair image =="
+_check_test_img -r all
+
+echo "== check second cluster =="
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+
+echo "== check first cluster on host =="
+printf "content: 0x%02x\n" `peek_file_le $TEST_IMG $(($CLUSTER_SIZE)) 1`
+
+echo "== check second cluster on host =="
+printf "content: 0x%02x\n" `peek_file_le $TEST_IMG $(($CLUSTER_SIZE)) 1`
# success, all done
echo "*** done"
diff --git a/tests/qemu-iotests/tests/parallels-checks.out b/tests/qemu-iotests/tests/parallels-checks.out
index fa0fca953e..725420875a 100644
--- a/tests/qemu-iotests/tests/parallels-checks.out
+++ b/tests/qemu-iotests/tests/parallels-checks.out
@@ -41,4 +41,35 @@ file size: 2097152
== check last cluster ==
read 1048576/1048576 bytes at offset 3145728
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304
+== TEST DUPLICATION CHECK ==
+== write pattern to whole image ==
+wrote 4194304/4194304 bytes at offset 0
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== write another pattern to second cluster ==
+wrote 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== check second cluster ==
+read 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== corrupt image ==
+== check second cluster ==
+read 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== repair image ==
+Repairing duplicate offset in BAT entry 1
+The following inconsistencies were found and repaired:
+
+ 0 leaked clusters
+ 1 corruptions
+
+Double checking the fixed image now...
+No errors were found on the image.
+== check second cluster ==
+read 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+== check first cluster on host ==
+content: 0x11
+== check second cluster on host ==
+content: 0x11
*** done
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 09/10] iotests: Refactor tests of parallels images checks (131)
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (7 preceding siblings ...)
2022-08-17 15:53 ` [PATCH 08/10] iotests: Add test for BAT entries duplication check Alexander Ivanov
@ 2022-08-17 15:54 ` Alexander Ivanov
2022-08-17 15:54 ` [PATCH 10/10] iotests: Fix cluster size in parallels images tests (131) Alexander Ivanov
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:54 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
Replace hardcoded numbers by variables.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
tests/qemu-iotests/131 | 29 ++++++++++++++++-------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/tests/qemu-iotests/131 b/tests/qemu-iotests/131
index a847692b4c..601546c84c 100755
--- a/tests/qemu-iotests/131
+++ b/tests/qemu-iotests/131
@@ -44,31 +44,34 @@ _supported_os Linux
inuse_offset=$((0x2c))
size=$((64 * 1024 * 1024))
-CLUSTER_SIZE=64k
+CLUSTER_SIZE=$((64 * 1024))
IMGFMT=parallels
_make_test_img $size
+CLUSTER_HALF_SIZE=$((CLUSTER_SIZE / 2))
+CLUSTER_DBL_SIZE=$((CLUSTER_SIZE * 2))
+
echo == read empty image ==
-{ $QEMU_IO -c "read -P 0 32k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0 $CLUSTER_HALF_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == write more than 1 block in a row ==
-{ $QEMU_IO -c "write -P 0x11 32k 128k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "write -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == read less than block ==
-{ $QEMU_IO -c "read -P 0x11 32k 32k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == read exactly 1 block ==
-{ $QEMU_IO -c "read -P 0x11 64k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == read more than 1 block ==
-{ $QEMU_IO -c "read -P 0x11 32k 128k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == check that there is no trash after written ==
-{ $QEMU_IO -c "read -P 0 160k 32k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0 $((CLUSTER_HALF_SIZE + CLUSTER_DBL_SIZE)) $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo == check that there is no trash before written ==
-{ $QEMU_IO -c "read -P 0 0 32k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo "== Corrupt image =="
poke_file "$TEST_IMG" "$inuse_offset" "\x59\x6e\x6f\x74"
-{ $QEMU_IO -c "read -P 0x11 64k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
_check_test_img
_check_test_img -r all
-{ $QEMU_IO -c "read -P 0x11 64k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
+{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
echo "== allocate with backing =="
# Verify that allocating clusters works fine even when there is a backing image.
@@ -83,7 +86,7 @@ TEST_IMG="$TEST_IMG.base" _make_test_img $size
# Write some data to the base image (which would trigger an assertion failure if
# interpreted as a QEMUIOVector)
-$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG.base" | _filter_qemu_io
+$QEMU_IO -c "write -P 42 0 $CLUSTER_SIZE" "$TEST_IMG.base" | _filter_qemu_io
# Parallels does not seem to support storing a backing filename in the image
# itself, so we need to build our backing chain on the command line
@@ -99,8 +102,8 @@ QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
$QEMU_IO --image-opts "$imgopts" \
-c 'read -P 1 0 64' \
- -c "read -P 42 64 $((64 * 1024 - 64))" \
- -c "read -P 0 64k $((size - 64 * 1024))" \
+ -c "read -P 42 64 $((CLUSTER_SIZE - 64))" \
+ -c "read -P 0 $CLUSTER_SIZE $((size - CLUSTER_SIZE))" \
| _filter_qemu_io
# success, all done
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 10/10] iotests: Fix cluster size in parallels images tests (131)
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
` (8 preceding siblings ...)
2022-08-17 15:54 ` [PATCH 09/10] iotests: Refactor tests of parallels images checks (131) Alexander Ivanov
@ 2022-08-17 15:54 ` Alexander Ivanov
9 siblings, 0 replies; 11+ messages in thread
From: Alexander Ivanov @ 2022-08-17 15:54 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-block, den, stefanha, vsementsov, kwolf, hreitz
In this test cluster size is 64k, but modern tools generate images
with cluster size 1M.
Calculate cluster size using track field from image header.
Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com>
---
tests/qemu-iotests/131 | 5 ++++-
tests/qemu-iotests/131.out | 44 +++++++++++++++++++-------------------
2 files changed, 26 insertions(+), 23 deletions(-)
diff --git a/tests/qemu-iotests/131 b/tests/qemu-iotests/131
index 601546c84c..78ef238c64 100755
--- a/tests/qemu-iotests/131
+++ b/tests/qemu-iotests/131
@@ -44,10 +44,13 @@ _supported_os Linux
inuse_offset=$((0x2c))
size=$((64 * 1024 * 1024))
-CLUSTER_SIZE=$((64 * 1024))
IMGFMT=parallels
_make_test_img $size
+# get cluster size in sectros from "tracks" header field
+CLUSTER_SIZE_OFFSET=28
+CLUSTER_SIZE=$(peek_file_le $TEST_IMG $CLUSTER_SIZE_OFFSET 4)
+CLUSTER_SIZE=$((CLUSTER_SIZE * 512))
CLUSTER_HALF_SIZE=$((CLUSTER_SIZE / 2))
CLUSTER_DBL_SIZE=$((CLUSTER_SIZE * 2))
diff --git a/tests/qemu-iotests/131.out b/tests/qemu-iotests/131.out
index de5ef7a8f5..98017a067e 100644
--- a/tests/qemu-iotests/131.out
+++ b/tests/qemu-iotests/131.out
@@ -1,26 +1,26 @@
QA output created by 131
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
== read empty image ==
-read 65536/65536 bytes at offset 32768
-64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 1048576/1048576 bytes at offset 524288
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== write more than 1 block in a row ==
-wrote 131072/131072 bytes at offset 32768
-128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 2097152/2097152 bytes at offset 524288
+2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== read less than block ==
-read 32768/32768 bytes at offset 32768
-32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 524288/524288 bytes at offset 524288
+512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== read exactly 1 block ==
-read 65536/65536 bytes at offset 65536
-64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== read more than 1 block ==
-read 131072/131072 bytes at offset 32768
-128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 2097152/2097152 bytes at offset 524288
+2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== check that there is no trash after written ==
-read 32768/32768 bytes at offset 163840
-32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 524288/524288 bytes at offset 2621440
+512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== check that there is no trash before written ==
-read 32768/32768 bytes at offset 0
-32 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 524288/524288 bytes at offset 0
+512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== Corrupt image ==
qemu-io: can't open device TEST_DIR/t.parallels: parallels: Image was not closed correctly; cannot be opened read/write
ERROR image was not closed correctly
@@ -35,19 +35,19 @@ The following inconsistencies were found and repaired:
Double checking the fixed image now...
No errors were found on the image.
-read 65536/65536 bytes at offset 65536
-64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 1048576/1048576 bytes at offset 1048576
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
== allocate with backing ==
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
-wrote 65536/65536 bytes at offset 0
-64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+wrote 1048576/1048576 bytes at offset 0
+1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
wrote 64/64 bytes at offset 0
64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
read 64/64 bytes at offset 0
64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-read 65472/65472 bytes at offset 64
-63.938 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-read 67043328/67043328 bytes at offset 65536
-63.938 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 1048512/1048512 bytes at offset 64
+1023.938 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+read 66060288/66060288 bytes at offset 1048576
+63 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
*** done
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-08-17 16:18 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-08-17 15:53 [PATCH 00/10] parallels: Add duplication check, refactor, fix bugs Alexander Ivanov
2022-08-17 15:53 ` [PATCH 01/10] parallels: Incorrect condition in out-of-image check Alexander Ivanov
2022-08-17 15:53 ` [PATCH 02/10] parallels: Incorrect data end calculation in parallels_open Alexander Ivanov
2022-08-17 15:53 ` [PATCH 03/10] parallels: Create parallels_handle_leak() to truncate excess clusters Alexander Ivanov
2022-08-17 15:53 ` [PATCH 04/10] parallels: Add checking and repairing duplicate offsets in BAT Alexander Ivanov
2022-08-17 15:53 ` [PATCH 05/10] parallels: Use highest_offset() helper in leak check Alexander Ivanov
2022-08-17 15:53 ` [PATCH 06/10] iotests: Add out-of-image check test for parallels format Alexander Ivanov
2022-08-17 15:53 ` [PATCH 07/10] iotests: Add leak " Alexander Ivanov
2022-08-17 15:53 ` [PATCH 08/10] iotests: Add test for BAT entries duplication check Alexander Ivanov
2022-08-17 15:54 ` [PATCH 09/10] iotests: Refactor tests of parallels images checks (131) Alexander Ivanov
2022-08-17 15:54 ` [PATCH 10/10] iotests: Fix cluster size in parallels images tests (131) 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).