|
|
76daa3 |
From 0c48bb933ecd0792182c33c89c370841e3c1c15f Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: John Snow <jsnow@redhat.com>
|
|
|
76daa3 |
Date: Tue, 16 May 2017 21:00:39 +0200
|
|
|
76daa3 |
Subject: [PATCH 03/27] block/vhdx: Make vhdx_create() always set errp
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: John Snow <jsnow@redhat.com>
|
|
|
76daa3 |
Message-id: <20170516210041.12856-2-jsnow@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75197
|
|
|
76daa3 |
O-Subject: [RHV-7.4 qemu-kvm-rhev PATCH v2 1/3] block/vhdx: Make vhdx_create() always set errp
|
|
|
76daa3 |
Bugzilla: 1447551
|
|
|
76daa3 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
From: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
This patch makes vhdx_create() always set errp in case of an error. It
|
|
|
76daa3 |
also adds errp parameters to vhdx_create_bat() and
|
|
|
76daa3 |
vhdx_create_new_region_table() so we can pass on the error object
|
|
|
76daa3 |
generated by blk_truncate() as of a future commit.
|
|
|
76daa3 |
|
|
|
76daa3 |
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
76daa3 |
Message-id: 20170328205129.15138-2-mreitz@redhat.com
|
|
|
76daa3 |
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit 55b9392b98e500399f2da1edc1d110bbfd40fb05)
|
|
|
76daa3 |
Signed-off-by: John Snow <jsnow@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
block/vhdx.c | 23 +++++++++++++++++++----
|
|
|
76daa3 |
1 file changed, 19 insertions(+), 4 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/block/vhdx.c b/block/vhdx.c
|
|
|
76daa3 |
index 052a753..d25bcd9 100644
|
|
|
76daa3 |
--- a/block/vhdx.c
|
|
|
76daa3 |
+++ b/block/vhdx.c
|
|
|
76daa3 |
@@ -1586,7 +1586,7 @@ exit:
|
|
|
76daa3 |
static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
|
|
|
76daa3 |
uint64_t image_size, VHDXImageType type,
|
|
|
76daa3 |
bool use_zero_blocks, uint64_t file_offset,
|
|
|
76daa3 |
- uint32_t length)
|
|
|
76daa3 |
+ uint32_t length, Error **errp)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
int ret = 0;
|
|
|
76daa3 |
uint64_t data_file_offset;
|
|
|
76daa3 |
@@ -1609,14 +1609,19 @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
|
|
|
76daa3 |
* is the furthest thing we have written yet */
|
|
|
76daa3 |
ret = blk_truncate(blk, data_file_offset);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret,
|
|
|
76daa3 |
+ "Failed to resize the underlying file");
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
} else if (type == VHDX_TYPE_FIXED) {
|
|
|
76daa3 |
ret = blk_truncate(blk, data_file_offset + image_size);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret,
|
|
|
76daa3 |
+ "Failed to resize the underlying file");
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
} else {
|
|
|
76daa3 |
+ error_setg(errp, "Unsupported image type");
|
|
|
76daa3 |
ret = -ENOTSUP;
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1627,6 +1632,7 @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
|
|
|
76daa3 |
/* for a fixed file, the default BAT entry is not zero */
|
|
|
76daa3 |
s->bat = g_try_malloc0(length);
|
|
|
76daa3 |
if (length && s->bat == NULL) {
|
|
|
76daa3 |
+ error_setg(errp, "Failed to allocate memory for the BAT");
|
|
|
76daa3 |
ret = -ENOMEM;
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1646,6 +1652,7 @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
ret = blk_pwrite(blk, file_offset, s->bat, length, 0);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write the BAT");
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1671,7 +1678,8 @@ static int vhdx_create_new_region_table(BlockBackend *blk,
|
|
|
76daa3 |
uint32_t log_size,
|
|
|
76daa3 |
bool use_zero_blocks,
|
|
|
76daa3 |
VHDXImageType type,
|
|
|
76daa3 |
- uint64_t *metadata_offset)
|
|
|
76daa3 |
+ uint64_t *metadata_offset,
|
|
|
76daa3 |
+ Error **errp)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
int ret = 0;
|
|
|
76daa3 |
uint32_t offset = 0;
|
|
|
76daa3 |
@@ -1740,7 +1748,7 @@ static int vhdx_create_new_region_table(BlockBackend *blk,
|
|
|
76daa3 |
/* The region table gives us the data we need to create the BAT,
|
|
|
76daa3 |
* so do that now */
|
|
|
76daa3 |
ret = vhdx_create_bat(blk, s, image_size, type, use_zero_blocks,
|
|
|
76daa3 |
- bat_file_offset, bat_length);
|
|
|
76daa3 |
+ bat_file_offset, bat_length, errp);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1749,12 +1757,14 @@ static int vhdx_create_new_region_table(BlockBackend *blk,
|
|
|
76daa3 |
ret = blk_pwrite(blk, VHDX_REGION_TABLE_OFFSET, buffer,
|
|
|
76daa3 |
VHDX_HEADER_BLOCK_SIZE, 0);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write first region table");
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
ret = blk_pwrite(blk, VHDX_REGION_TABLE2_OFFSET, buffer,
|
|
|
76daa3 |
VHDX_HEADER_BLOCK_SIZE, 0);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write second region table");
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
@@ -1825,6 +1835,7 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
|
|
|
76daa3 |
ret = -ENOTSUP;
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
} else {
|
|
|
76daa3 |
+ error_setg(errp, "Invalid subformat '%s'", type);
|
|
|
76daa3 |
ret = -EINVAL;
|
|
|
76daa3 |
goto exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1879,12 +1890,14 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
|
|
|
76daa3 |
ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET, &signature, sizeof(signature),
|
|
|
76daa3 |
0);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write file signature");
|
|
|
76daa3 |
goto delete_and_exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
if (creator) {
|
|
|
76daa3 |
ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET + sizeof(signature),
|
|
|
76daa3 |
creator, creator_items * sizeof(gunichar2), 0);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write creator field");
|
|
|
76daa3 |
goto delete_and_exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1893,13 +1906,14 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
|
|
|
76daa3 |
/* Creates (B),(C) */
|
|
|
76daa3 |
ret = vhdx_create_new_headers(blk, image_size, log_size);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to write image headers");
|
|
|
76daa3 |
goto delete_and_exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Creates (D),(E),(G) explicitly. (F) created as by-product */
|
|
|
76daa3 |
ret = vhdx_create_new_region_table(blk, image_size, block_size, 512,
|
|
|
76daa3 |
log_size, use_zero_blocks, image_type,
|
|
|
76daa3 |
- &metadata_offset);
|
|
|
76daa3 |
+ &metadata_offset, errp);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
goto delete_and_exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
@@ -1908,6 +1922,7 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
|
|
|
76daa3 |
ret = vhdx_create_new_metadata(blk, image_size, block_size, 512,
|
|
|
76daa3 |
metadata_offset, image_type);
|
|
|
76daa3 |
if (ret < 0) {
|
|
|
76daa3 |
+ error_setg_errno(errp, -ret, "Failed to initialize metadata");
|
|
|
76daa3 |
goto delete_and_exit;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|