Commit 51d7c00c14550334ec140ce8f40e04ed4c88de57
1 parent
a80bf99f
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
Showing
1 changed file
with
21 additions
and
25 deletions
block.c
@@ -311,8 +311,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) | @@ -311,8 +311,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) | ||
311 | int ret; | 311 | int ret; |
312 | 312 | ||
313 | bs = bdrv_new(""); | 313 | bs = bdrv_new(""); |
314 | - if (!bs) | ||
315 | - return -ENOMEM; | ||
316 | ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); | 314 | ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); |
317 | if (ret < 0) { | 315 | if (ret < 0) { |
318 | bdrv_delete(bs); | 316 | bdrv_delete(bs); |
@@ -349,12 +347,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | @@ -349,12 +347,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | ||
349 | 347 | ||
350 | /* if there is a backing file, use it */ | 348 | /* if there is a backing file, use it */ |
351 | bs1 = bdrv_new(""); | 349 | bs1 = bdrv_new(""); |
352 | - if (!bs1) { | ||
353 | - return -ENOMEM; | ||
354 | - } | ||
355 | - if (bdrv_open(bs1, filename, 0) < 0) { | 350 | + ret = bdrv_open(bs1, filename, 0); |
351 | + if (ret < 0) { | ||
356 | bdrv_delete(bs1); | 352 | bdrv_delete(bs1); |
357 | - return -1; | 353 | + return ret; |
358 | } | 354 | } |
359 | total_size = bdrv_getlength(bs1) >> SECTOR_BITS; | 355 | total_size = bdrv_getlength(bs1) >> SECTOR_BITS; |
360 | 356 | ||
@@ -372,9 +368,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | @@ -372,9 +368,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | ||
372 | else | 368 | else |
373 | realpath(filename, backing_filename); | 369 | realpath(filename, backing_filename); |
374 | 370 | ||
375 | - if (bdrv_create(&bdrv_qcow2, tmp_filename, | ||
376 | - total_size, backing_filename, 0) < 0) { | ||
377 | - return -1; | 371 | + ret = bdrv_create(&bdrv_qcow2, tmp_filename, |
372 | + total_size, backing_filename, 0); | ||
373 | + if (ret < 0) { | ||
374 | + return ret; | ||
378 | } | 375 | } |
379 | filename = tmp_filename; | 376 | filename = tmp_filename; |
380 | bs->is_temporary = 1; | 377 | bs->is_temporary = 1; |
@@ -383,14 +380,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | @@ -383,14 +380,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | ||
383 | pstrcpy(bs->filename, sizeof(bs->filename), filename); | 380 | pstrcpy(bs->filename, sizeof(bs->filename), filename); |
384 | if (flags & BDRV_O_FILE) { | 381 | if (flags & BDRV_O_FILE) { |
385 | drv = find_protocol(filename); | 382 | drv = find_protocol(filename); |
386 | - if (!drv) | ||
387 | - return -ENOENT; | ||
388 | - } else { | ||
389 | - if (!drv) { | ||
390 | - drv = find_image_format(filename); | ||
391 | - if (!drv) | ||
392 | - return -1; | ||
393 | - } | 383 | + } else if (!drv) { |
384 | + drv = find_image_format(filename); | ||
385 | + } | ||
386 | + if (!drv) { | ||
387 | + ret = -ENOENT; | ||
388 | + goto unlink_and_fail; | ||
394 | } | 389 | } |
395 | bs->drv = drv; | 390 | bs->drv = drv; |
396 | bs->opaque = qemu_mallocz(drv->instance_size); | 391 | bs->opaque = qemu_mallocz(drv->instance_size); |
@@ -409,6 +404,9 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | @@ -409,6 +404,9 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | ||
409 | qemu_free(bs->opaque); | 404 | qemu_free(bs->opaque); |
410 | bs->opaque = NULL; | 405 | bs->opaque = NULL; |
411 | bs->drv = NULL; | 406 | bs->drv = NULL; |
407 | + unlink_and_fail: | ||
408 | + if (bs->is_temporary) | ||
409 | + unlink(filename); | ||
412 | return ret; | 410 | return ret; |
413 | } | 411 | } |
414 | if (drv->bdrv_getlength) { | 412 | if (drv->bdrv_getlength) { |
@@ -422,15 +420,13 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | @@ -422,15 +420,13 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, | ||
422 | if (bs->backing_file[0] != '\0') { | 420 | if (bs->backing_file[0] != '\0') { |
423 | /* if there is a backing file, use it */ | 421 | /* if there is a backing file, use it */ |
424 | bs->backing_hd = bdrv_new(""); | 422 | bs->backing_hd = bdrv_new(""); |
425 | - if (!bs->backing_hd) { | ||
426 | - fail: | ||
427 | - bdrv_close(bs); | ||
428 | - return -ENOMEM; | ||
429 | - } | ||
430 | path_combine(backing_filename, sizeof(backing_filename), | 423 | path_combine(backing_filename, sizeof(backing_filename), |
431 | filename, bs->backing_file); | 424 | filename, bs->backing_file); |
432 | - if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0) | ||
433 | - goto fail; | 425 | + ret = bdrv_open(bs->backing_hd, backing_filename, open_flags); |
426 | + if (ret < 0) { | ||
427 | + bdrv_close(bs); | ||
428 | + return ret; | ||
429 | + } | ||
434 | } | 430 | } |
435 | 431 | ||
436 | /* call the change callback */ | 432 | /* call the change callback */ |