Am 19.10.2011 16:59, schrieb Paolo Bonzini: > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > 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,