block/vdi: Error out immediately in vdi_create()
Currently, if an error occurs during the part of vdi_create() which actually writes the image, the function stores -errno, but continues anyway. Instead of trying to write data which (if it can be written at all) does not make any sense without the operations before succeeding (e.g., writing the image header), just error out immediately. Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Stefan Weil <sw@weilnetz.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
e1b42f456f
commit
0549ea8b6d
@ -756,6 +756,7 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
vdi_header_to_le(&header);
|
vdi_header_to_le(&header);
|
||||||
if (write(fd, &header, sizeof(header)) < 0) {
|
if (write(fd, &header, sizeof(header)) < 0) {
|
||||||
result = -errno;
|
result = -errno;
|
||||||
|
goto close_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bmap_size > 0) {
|
if (bmap_size > 0) {
|
||||||
@ -769,6 +770,8 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
}
|
}
|
||||||
if (write(fd, bmap, bmap_size) < 0) {
|
if (write(fd, bmap, bmap_size) < 0) {
|
||||||
result = -errno;
|
result = -errno;
|
||||||
|
g_free(bmap);
|
||||||
|
goto close_and_exit;
|
||||||
}
|
}
|
||||||
g_free(bmap);
|
g_free(bmap);
|
||||||
}
|
}
|
||||||
@ -776,10 +779,12 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
if (image_type == VDI_TYPE_STATIC) {
|
if (image_type == VDI_TYPE_STATIC) {
|
||||||
if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) {
|
if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) {
|
||||||
result = -errno;
|
result = -errno;
|
||||||
|
goto close_and_exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (close(fd) < 0) {
|
close_and_exit:
|
||||||
|
if ((close(fd) < 0) && !result) {
|
||||||
result = -errno;
|
result = -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user