Am 19.10.2011 16:59, schrieb Paolo Bonzini:
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
> block/vmdk.c | 37 +++++++++++++++----------------------
> 1 files changed, 15 insertions(+), 22 deletions(-)
>
> diff --git a/block/vmdk.c b/block/vmdk.c
> index 21566eb..12b38d2 100644
> --- a/block/vmdk.c
> +++ b/block/vmdk.c
> @@ -622,20 +622,7 @@ static int vmdk_open_desc_file(BlockDriverState *bs, int
> flags,
> return -ENOTSUP;
> }
> s->desc_offset = 0;
> - ret = vmdk_parse_extents(buf, bs, bs->file->filename);
> - if (ret) {
> - vmdk_free_extents(bs);
> - return ret;
> - }
> -
> - /* try to open parent images, if exist */
> - ret = vmdk_parent_open(bs);
> - if (ret) {
> - vmdk_free_extents(bs);
> - return ret;
> - }
> - s->parent_cid = vmdk_read_cid(bs, 1);
> - return 0;
> + return vmdk_parse_extents(buf, bs, bs->file->filename);
> }
This code is moved into bdrv_open, but there's another path how this
code can be reached:
vmdk_parse_extents() -> vmdk_open_sparse() -> vmdk_open_vmdk4() ->
vmdk_open_desc_file().
Don't we forget to open the parent file there now?
Kevin
>
> static int vmdk_open(BlockDriverState *bs, int flags)
> @@ -645,17 +632,23 @@ static int vmdk_open(BlockDriverState *bs, int flags)
>
> if (vmdk_open_sparse(bs, bs->file, flags) == 0) {
> s->desc_offset = 0x200;
> - /* try to open parent images, if exist */
> - ret = vmdk_parent_open(bs);
> + } else {
> + ret = vmdk_open_desc_file(bs, flags, 0);
> if (ret) {
> - vmdk_free_extents(bs);
> - return ret;
> + goto fail;
> }
> - s->parent_cid = vmdk_read_cid(bs, 1);
> - return 0;
> - } else {
> - return vmdk_open_desc_file(bs, flags, 0);
> }
> + /* try to open parent images, if exist */
> + ret = vmdk_parent_open(bs);
> + if (ret) {
> + goto fail;
> + }
> + s->parent_cid = vmdk_read_cid(bs, 1);
> + return ret;
> +
> +fail:
> + vmdk_free_extents(bs);
> + return ret;
> }
>
> static int get_whole_cluster(BlockDriverState *bs,