block: Polish error handling of brdv_open2 (Jan Kiszka)

Make sure that we always delete temporary disk images on error, remove
obsolete malloc error checks and return proper error codes.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6702 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
aliguori 2009-03-05 23:00:29 +00:00
parent a80bf99fa3
commit 51d7c00c14
1 changed files with 21 additions and 25 deletions

46
block.c
View File

@ -311,8 +311,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
int ret; int ret;
bs = bdrv_new(""); bs = bdrv_new("");
if (!bs)
return -ENOMEM;
ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
if (ret < 0) { if (ret < 0) {
bdrv_delete(bs); bdrv_delete(bs);
@ -349,12 +347,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
/* if there is a backing file, use it */ /* if there is a backing file, use it */
bs1 = bdrv_new(""); bs1 = bdrv_new("");
if (!bs1) { ret = bdrv_open(bs1, filename, 0);
return -ENOMEM; if (ret < 0) {
}
if (bdrv_open(bs1, filename, 0) < 0) {
bdrv_delete(bs1); bdrv_delete(bs1);
return -1; return ret;
} }
total_size = bdrv_getlength(bs1) >> SECTOR_BITS; total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
@ -372,9 +368,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
else else
realpath(filename, backing_filename); realpath(filename, backing_filename);
if (bdrv_create(&bdrv_qcow2, tmp_filename, ret = bdrv_create(&bdrv_qcow2, tmp_filename,
total_size, backing_filename, 0) < 0) { total_size, backing_filename, 0);
return -1; if (ret < 0) {
return ret;
} }
filename = tmp_filename; filename = tmp_filename;
bs->is_temporary = 1; bs->is_temporary = 1;
@ -383,14 +380,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
pstrcpy(bs->filename, sizeof(bs->filename), filename); pstrcpy(bs->filename, sizeof(bs->filename), filename);
if (flags & BDRV_O_FILE) { if (flags & BDRV_O_FILE) {
drv = find_protocol(filename); drv = find_protocol(filename);
if (!drv) } else if (!drv) {
return -ENOENT; drv = find_image_format(filename);
} else { }
if (!drv) { if (!drv) {
drv = find_image_format(filename); ret = -ENOENT;
if (!drv) goto unlink_and_fail;
return -1;
}
} }
bs->drv = drv; bs->drv = drv;
bs->opaque = qemu_mallocz(drv->instance_size); bs->opaque = qemu_mallocz(drv->instance_size);
@ -409,6 +404,9 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
qemu_free(bs->opaque); qemu_free(bs->opaque);
bs->opaque = NULL; bs->opaque = NULL;
bs->drv = NULL; bs->drv = NULL;
unlink_and_fail:
if (bs->is_temporary)
unlink(filename);
return ret; return ret;
} }
if (drv->bdrv_getlength) { if (drv->bdrv_getlength) {
@ -422,15 +420,13 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
if (bs->backing_file[0] != '\0') { if (bs->backing_file[0] != '\0') {
/* if there is a backing file, use it */ /* if there is a backing file, use it */
bs->backing_hd = bdrv_new(""); bs->backing_hd = bdrv_new("");
if (!bs->backing_hd) {
fail:
bdrv_close(bs);
return -ENOMEM;
}
path_combine(backing_filename, sizeof(backing_filename), path_combine(backing_filename, sizeof(backing_filename),
filename, bs->backing_file); filename, bs->backing_file);
if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0) ret = bdrv_open(bs->backing_hd, backing_filename, open_flags);
goto fail; if (ret < 0) {
bdrv_close(bs);
return ret;
}
} }
/* call the change callback */ /* call the change callback */