|
|
958e1b |
From 5a762ccf05fea97bc3e98b8dd317374c51c14c26 Mon Sep 17 00:00:00 2001
|
|
|
958e1b |
From: Jeffrey Cody <jcody@redhat.com>
|
|
|
958e1b |
Date: Tue, 16 Sep 2014 20:11:47 +0200
|
|
|
958e1b |
Subject: [PATCH 09/20] block/vdi: Error out immediately in vdi_create()
|
|
|
958e1b |
|
|
|
958e1b |
Message-id: <2947dd91a4c9967cbd5a241145c355263e04207a.1410897407.git.jcody@redhat.com>
|
|
|
958e1b |
Patchwork-id: 61213
|
|
|
958e1b |
O-Subject: [PATCH qemu-kvm-rhel RHEL7.1 08/15] block/vdi: Error out immediately in vdi_create()
|
|
|
958e1b |
Bugzilla: 1098086
|
|
|
958e1b |
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
958e1b |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
958e1b |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
958e1b |
|
|
|
958e1b |
From: Max Reitz <mreitz@redhat.com>
|
|
|
958e1b |
|
|
|
958e1b |
Currently, if an error occurs during the part of vdi_create() which
|
|
|
958e1b |
actually writes the image, the function stores -errno, but continues
|
|
|
958e1b |
anyway.
|
|
|
958e1b |
|
|
|
958e1b |
Instead of trying to write data which (if it can be written at all) does
|
|
|
958e1b |
not make any sense without the operations before succeeding (e.g.,
|
|
|
958e1b |
writing the image header), just error out immediately.
|
|
|
958e1b |
|
|
|
958e1b |
Signed-off-by: Max Reitz <mreitz@redhat.com>
|
|
|
958e1b |
Reviewed-by: Stefan Weil <sw@weilnetz.de>
|
|
|
958e1b |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
958e1b |
(cherry picked from commit 0549ea8b6d3ed4eba9a3bd0abfaed3af5de69873)
|
|
|
958e1b |
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
|
958e1b |
|
|
|
958e1b |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
958e1b |
---
|
|
|
958e1b |
block/vdi.c | 7 ++++++-
|
|
|
958e1b |
1 files changed, 6 insertions(+), 1 deletions(-)
|
|
|
958e1b |
|
|
|
958e1b |
diff --git a/block/vdi.c b/block/vdi.c
|
|
|
958e1b |
index 0211023..fb25424 100644
|
|
|
958e1b |
--- a/block/vdi.c
|
|
|
958e1b |
+++ b/block/vdi.c
|
|
|
958e1b |
@@ -753,6 +753,7 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|
|
958e1b |
vdi_header_to_le(&header);
|
|
|
958e1b |
if (write(fd, &header, sizeof(header)) < 0) {
|
|
|
958e1b |
result = -errno;
|
|
|
958e1b |
+ goto close_and_exit;
|
|
|
958e1b |
}
|
|
|
958e1b |
|
|
|
958e1b |
if (bmap_size > 0) {
|
|
|
958e1b |
@@ -766,6 +767,8 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|
|
958e1b |
}
|
|
|
958e1b |
if (write(fd, bmap, bmap_size) < 0) {
|
|
|
958e1b |
result = -errno;
|
|
|
958e1b |
+ g_free(bmap);
|
|
|
958e1b |
+ goto close_and_exit;
|
|
|
958e1b |
}
|
|
|
958e1b |
g_free(bmap);
|
|
|
958e1b |
}
|
|
|
958e1b |
@@ -773,10 +776,12 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|
|
958e1b |
if (image_type == VDI_TYPE_STATIC) {
|
|
|
958e1b |
if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) {
|
|
|
958e1b |
result = -errno;
|
|
|
958e1b |
+ goto close_and_exit;
|
|
|
958e1b |
}
|
|
|
958e1b |
}
|
|
|
958e1b |
|
|
|
958e1b |
- if (close(fd) < 0) {
|
|
|
958e1b |
+close_and_exit:
|
|
|
958e1b |
+ if ((close(fd) < 0) && !result) {
|
|
|
958e1b |
result = -errno;
|
|
|
958e1b |
}
|
|
|
958e1b |
|
|
|
958e1b |
--
|
|
|
958e1b |
1.7.1
|
|
|
958e1b |
|