yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
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