From: Alexander Ivanov <alexander.iva...@virtuozzo.com> We will add more and more checks of images so we need to reorganize the code. Put each check to a separate helper function with a separate loop. Add two helpers: truncate_file() and sync_header(). They will be used in multiple functions.
Parallels image file can be corrupted this way: two guest memory areas refer to the same host memory area (duplicated offsets in BAT). qemu-img check copies data from duplicated cluster to the new cluster and writes new corresponding offset to BAT instead of duplicated one. Test 314 uses sample corrupted image parallels-2-duplicated-cluster.bz2. Reading from duplicated offset and from original offset returns the same data. After repairing changing either of these blocks of data does not affect another one. v2 changes: * Split parallels_co_check() to separate functions. * Move buffer allocation outside the loop. * Replace work with internals by zeroing BAT entries and allocate_clusters() calling. * Make reverse table unsigned and replace -1 by 0xFFFFFFFF. * Some minor fixes. * Add more detailed comments. Alexander Ivanov (3): parallels: Put the image checks in separate functions parallels: Add checking and repairing duplicate offsets in BAT iotests, parallels: Add a test for duplicated clusters block/parallels.c | 315 +++++++++++++++--- tests/qemu-iotests/314 | 89 +++++ tests/qemu-iotests/314.out | 36 ++ .../parallels-2-duplicated-cluster.bz2 | Bin 0 -> 148 bytes 4 files changed, 393 insertions(+), 47 deletions(-) create mode 100755 tests/qemu-iotests/314 create mode 100644 tests/qemu-iotests/314.out create mode 100644 tests/qemu-iotests/sample_images/parallels-2-duplicated-cluster.bz2 -- 2.34.1