qcow2: Assert that expand_zero_clusters_in_l1() does not support subclusters

This function is only used by qcow2_expand_zero_clusters() to
downgrade a qcow2 image to a previous version. This would require
transforming all extended L2 entries into normal L2 entries but this
is not a simple task and there are no plans to implement this at the
moment.

Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <15e65112b4144381b4d8c0bdf8fb76b0d813e3d1.1594396418.git.berto@igalia.com>
[mreitz: Fixed comment style]
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Alberto Garcia 2020-07-10 18:13:15 +02:00 committed by Max Reitz
parent 2118771ddf
commit 7bbb59202a
3 changed files with 23 additions and 2 deletions

View File

@ -2166,6 +2166,9 @@ static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
int ret; int ret;
int i, j; int i, j;
/* qcow2_downgrade() is not allowed in images with subclusters */
assert(!has_subclusters(s));
slice_size2 = s->l2_slice_size * l2_entry_size(s); slice_size2 = s->l2_slice_size * l2_entry_size(s);
n_slices = s->cluster_size / slice_size2; n_slices = s->cluster_size / slice_size2;
@ -2233,8 +2236,11 @@ static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
if (cluster_type == QCOW2_CLUSTER_ZERO_PLAIN) { if (cluster_type == QCOW2_CLUSTER_ZERO_PLAIN) {
if (!bs->backing) { if (!bs->backing) {
/* not backed; therefore we can simply deallocate the /*
* cluster */ * not backed; therefore we can simply deallocate the
* cluster. No need to call set_l2_bitmap(), this
* function doesn't support images with subclusters.
*/
set_l2_entry(s, l2_slice, j, 0); set_l2_entry(s, l2_slice, j, 0);
l2_dirty = true; l2_dirty = true;
continue; continue;
@ -2305,6 +2311,10 @@ static int expand_zero_clusters_in_l1(BlockDriverState *bs, uint64_t *l1_table,
} else { } else {
set_l2_entry(s, l2_slice, j, offset); set_l2_entry(s, l2_slice, j, offset);
} }
/*
* No need to call set_l2_bitmap() after set_l2_entry() because
* this function doesn't support images with subclusters.
*/
l2_dirty = true; l2_dirty = true;
} }

View File

@ -303,6 +303,12 @@ $QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
_img_info --format-specific _img_info --format-specific
_check_test_img _check_test_img
echo
echo "=== Testing version downgrade with extended L2 entries ==="
echo
_make_test_img -o "compat=1.1,extended_l2=on" 64M
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
echo echo
echo "=== Try changing the external data file ===" echo "=== Try changing the external data file ==="
echo echo

View File

@ -533,6 +533,11 @@ Format specific information:
extended l2: false extended l2: false
No errors were found on the image. No errors were found on the image.
=== Testing version downgrade with extended L2 entries ===
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
qemu-img: Cannot downgrade an image with incompatible features 0x10 set
=== Try changing the external data file === === Try changing the external data file ===
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864