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:
parent
2118771ddf
commit
7bbb59202a
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user