qcow2: Handle QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC
When dealing with subcluster types there is a new value called QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC that has no equivalent in QCow2ClusterType. This patch handles that value in all places where subcluster types are processed. Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <bf09e2e2439a468a901bb96ace411eed9ee50295.1594396418.git.berto@igalia.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
10dabdc596
commit
97490a143e
@ -2064,7 +2064,8 @@ static int coroutine_fn qcow2_co_block_status(BlockDriverState *bs,
|
||||
*pnum = bytes;
|
||||
|
||||
if ((type == QCOW2_SUBCLUSTER_NORMAL ||
|
||||
type == QCOW2_SUBCLUSTER_ZERO_ALLOC) && !s->crypto) {
|
||||
type == QCOW2_SUBCLUSTER_ZERO_ALLOC ||
|
||||
type == QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC) && !s->crypto) {
|
||||
*map = host_offset;
|
||||
*file = s->data_file->bs;
|
||||
status |= BDRV_BLOCK_OFFSET_VALID;
|
||||
@ -2072,7 +2073,8 @@ static int coroutine_fn qcow2_co_block_status(BlockDriverState *bs,
|
||||
if (type == QCOW2_SUBCLUSTER_ZERO_PLAIN ||
|
||||
type == QCOW2_SUBCLUSTER_ZERO_ALLOC) {
|
||||
status |= BDRV_BLOCK_ZERO;
|
||||
} else if (type != QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN) {
|
||||
} else if (type != QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN &&
|
||||
type != QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC) {
|
||||
status |= BDRV_BLOCK_DATA;
|
||||
}
|
||||
if (s->metadata_preallocation && (status & BDRV_BLOCK_DATA) &&
|
||||
@ -2235,6 +2237,7 @@ static coroutine_fn int qcow2_co_preadv_task(BlockDriverState *bs,
|
||||
g_assert_not_reached();
|
||||
|
||||
case QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN:
|
||||
case QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC:
|
||||
assert(bs->backing); /* otherwise handled in qcow2_co_preadv_part */
|
||||
|
||||
BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
|
||||
@ -2303,7 +2306,8 @@ static coroutine_fn int qcow2_co_preadv_part(BlockDriverState *bs,
|
||||
|
||||
if (type == QCOW2_SUBCLUSTER_ZERO_PLAIN ||
|
||||
type == QCOW2_SUBCLUSTER_ZERO_ALLOC ||
|
||||
(type == QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN && !bs->backing))
|
||||
(type == QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN && !bs->backing) ||
|
||||
(type == QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC && !bs->backing))
|
||||
{
|
||||
qemu_iovec_memset(qiov, qiov_offset, 0, cur_bytes);
|
||||
} else {
|
||||
@ -3858,6 +3862,7 @@ static coroutine_fn int qcow2_co_pwrite_zeroes(BlockDriverState *bs,
|
||||
ret = qcow2_get_host_offset(bs, offset, &nr, &off, &type);
|
||||
if (ret < 0 ||
|
||||
(type != QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN &&
|
||||
type != QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC &&
|
||||
type != QCOW2_SUBCLUSTER_ZERO_PLAIN &&
|
||||
type != QCOW2_SUBCLUSTER_ZERO_ALLOC)) {
|
||||
qemu_co_mutex_unlock(&s->lock);
|
||||
@ -3936,6 +3941,7 @@ qcow2_co_copy_range_from(BlockDriverState *bs,
|
||||
|
||||
switch (type) {
|
||||
case QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN:
|
||||
case QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC:
|
||||
if (bs->backing && bs->backing->bs) {
|
||||
int64_t backing_length = bdrv_getlength(bs->backing->bs);
|
||||
if (src_offset >= backing_length) {
|
||||
|
Loading…
Reference in New Issue
Block a user