|
|
|
@ -107,7 +107,7 @@ static ssize_t qcow2_crypto_hdr_read_func(QCryptoBlock *block, size_t offset, |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, s->crypto_header.offset + offset, buf, buflen, |
|
|
|
ret = bdrv_pread(bs->file, s->crypto_header.offset + offset, buflen, buf, |
|
|
|
0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read encryption header"); |
|
|
|
@ -168,7 +168,7 @@ static ssize_t qcow2_crypto_hdr_write_func(QCryptoBlock *block, size_t offset, |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
ret = bdrv_pwrite(bs->file, s->crypto_header.offset + offset, buf, buflen, |
|
|
|
ret = bdrv_pwrite(bs->file, s->crypto_header.offset + offset, buflen, buf, |
|
|
|
0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read encryption header"); |
|
|
|
@ -227,7 +227,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
printf("attempting to read extended header in offset %lu\n", offset); |
|
|
|
#endif |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, offset, &ext, sizeof(ext), 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, sizeof(ext), &ext, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "qcow2_read_extension: ERROR: " |
|
|
|
"pread fail from offset %" PRIu64, offset); |
|
|
|
@ -255,7 +255,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
sizeof(bs->backing_format)); |
|
|
|
return 2; |
|
|
|
} |
|
|
|
ret = bdrv_pread(bs->file, offset, bs->backing_format, ext.len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, ext.len, bs->backing_format, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "ERROR: ext_backing_format: " |
|
|
|
"Could not read format name"); |
|
|
|
@ -271,7 +271,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
case QCOW2_EXT_MAGIC_FEATURE_TABLE: |
|
|
|
if (p_feature_table != NULL) { |
|
|
|
void *feature_table = g_malloc0(ext.len + 2 * sizeof(Qcow2Feature)); |
|
|
|
ret = bdrv_pread(bs->file, offset, feature_table, ext.len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, ext.len, feature_table, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "ERROR: ext_feature_table: " |
|
|
|
"Could not read table"); |
|
|
|
@ -296,7 +296,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
return -EINVAL; |
|
|
|
} |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, offset, &s->crypto_header, ext.len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, ext.len, &s->crypto_header, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, |
|
|
|
"Unable to read CRYPTO header extension"); |
|
|
|
@ -352,7 +352,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, offset, &bitmaps_ext, ext.len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, ext.len, &bitmaps_ext, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "bitmaps_ext: " |
|
|
|
"Could not read ext header"); |
|
|
|
@ -416,7 +416,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
case QCOW2_EXT_MAGIC_DATA_FILE: |
|
|
|
{ |
|
|
|
s->image_data_file = g_malloc0(ext.len + 1); |
|
|
|
ret = bdrv_pread(bs->file, offset, s->image_data_file, ext.len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, ext.len, s->image_data_file, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, |
|
|
|
"ERROR: Could not read data file name"); |
|
|
|
@ -440,7 +440,7 @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset, |
|
|
|
uext->len = ext.len; |
|
|
|
QLIST_INSERT_HEAD(&s->unknown_header_ext, uext, next); |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, offset, uext->data, uext->len, 0); |
|
|
|
ret = bdrv_pread(bs->file, offset, uext->len, uext->data, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "ERROR: unknown extension: " |
|
|
|
"Could not read data"); |
|
|
|
@ -517,7 +517,7 @@ int qcow2_mark_dirty(BlockDriverState *bs) |
|
|
|
|
|
|
|
val = cpu_to_be64(s->incompatible_features | QCOW2_INCOMPAT_DIRTY); |
|
|
|
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, incompatible_features), |
|
|
|
&val, sizeof(val), 0); |
|
|
|
sizeof(val), &val, 0); |
|
|
|
if (ret < 0) { |
|
|
|
return ret; |
|
|
|
} |
|
|
|
@ -1308,7 +1308,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, |
|
|
|
uint64_t l1_vm_state_index; |
|
|
|
bool update_header = false; |
|
|
|
|
|
|
|
ret = bdrv_pread(bs->file, 0, &header, sizeof(header), 0); |
|
|
|
ret = bdrv_pread(bs->file, 0, sizeof(header), &header, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read qcow2 header"); |
|
|
|
goto fail; |
|
|
|
@ -1384,8 +1384,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, |
|
|
|
if (header.header_length > sizeof(header)) { |
|
|
|
s->unknown_header_fields_size = header.header_length - sizeof(header); |
|
|
|
s->unknown_header_fields = g_malloc(s->unknown_header_fields_size); |
|
|
|
ret = bdrv_pread(bs->file, sizeof(header), s->unknown_header_fields, |
|
|
|
s->unknown_header_fields_size, 0); |
|
|
|
ret = bdrv_pread(bs->file, sizeof(header), |
|
|
|
s->unknown_header_fields_size, |
|
|
|
s->unknown_header_fields, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read unknown qcow2 header " |
|
|
|
"fields"); |
|
|
|
@ -1580,8 +1581,8 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, |
|
|
|
ret = -ENOMEM; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table, |
|
|
|
s->l1_size * L1E_SIZE, 0); |
|
|
|
ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_size * L1E_SIZE, |
|
|
|
s->l1_table, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read L1 table"); |
|
|
|
goto fail; |
|
|
|
@ -1698,8 +1699,8 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, |
|
|
|
ret = -EINVAL; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
ret = bdrv_pread(bs->file, header.backing_file_offset, |
|
|
|
bs->auto_backing_file, len, 0); |
|
|
|
ret = bdrv_pread(bs->file, header.backing_file_offset, len, |
|
|
|
bs->auto_backing_file, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Could not read backing file name"); |
|
|
|
goto fail; |
|
|
|
@ -3081,7 +3082,7 @@ int qcow2_update_header(BlockDriverState *bs) |
|
|
|
} |
|
|
|
|
|
|
|
/* Write the new header */ |
|
|
|
ret = bdrv_pwrite(bs->file, 0, header, s->cluster_size, 0); |
|
|
|
ret = bdrv_pwrite(bs->file, 0, s->cluster_size, header, 0); |
|
|
|
if (ret < 0) { |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
@ -4550,8 +4551,8 @@ static int coroutine_fn qcow2_co_truncate(BlockDriverState *bs, int64_t offset, |
|
|
|
|
|
|
|
/* write updated header.size */ |
|
|
|
offset = cpu_to_be64(offset); |
|
|
|
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size), &offset, |
|
|
|
sizeof(offset), 0); |
|
|
|
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size), |
|
|
|
sizeof(offset), &offset, 0); |
|
|
|
if (ret < 0) { |
|
|
|
error_setg_errno(errp, -ret, "Failed to update the image size"); |
|
|
|
goto fail; |
|
|
|
@ -4828,7 +4829,7 @@ static int make_completely_empty(BlockDriverState *bs) |
|
|
|
l1_ofs_rt_ofs_cls.reftable_offset = cpu_to_be64(s->cluster_size); |
|
|
|
l1_ofs_rt_ofs_cls.reftable_clusters = cpu_to_be32(1); |
|
|
|
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_table_offset), |
|
|
|
&l1_ofs_rt_ofs_cls, sizeof(l1_ofs_rt_ofs_cls), 0); |
|
|
|
sizeof(l1_ofs_rt_ofs_cls), &l1_ofs_rt_ofs_cls, 0); |
|
|
|
if (ret < 0) { |
|
|
|
goto fail_broken_refcounts; |
|
|
|
} |
|
|
|
@ -4859,8 +4860,8 @@ static int make_completely_empty(BlockDriverState *bs) |
|
|
|
|
|
|
|
/* Enter the first refblock into the reftable */ |
|
|
|
rt_entry = cpu_to_be64(2 * s->cluster_size); |
|
|
|
ret = bdrv_pwrite_sync(bs->file, s->cluster_size, &rt_entry, |
|
|
|
sizeof(rt_entry), 0); |
|
|
|
ret = bdrv_pwrite_sync(bs->file, s->cluster_size, sizeof(rt_entry), |
|
|
|
&rt_entry, 0); |
|
|
|
if (ret < 0) { |
|
|
|
goto fail_broken_refcounts; |
|
|
|
} |
|
|
|
|