mirror of https://github.com/xqemu/xqemu.git
vmdk: do not try opening a file as both image and descriptor
This prepares for propagating errors from vmdk_open_sparse and vmdk_open_desc_file up to the caller of vmdk_open. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d1833ef52b
commit
37f09e5e3d
22
block/vmdk.c
22
block/vmdk.c
|
@ -886,20 +886,28 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
BDRVVmdkState *s = bs->opaque;
|
BDRVVmdkState *s = bs->opaque;
|
||||||
|
uint32_t magic;
|
||||||
|
|
||||||
buf = vmdk_read_desc(bs->file, 0, errp);
|
buf = vmdk_read_desc(bs->file, 0, errp);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vmdk_open_sparse(bs, bs->file, flags, buf, errp) == 0) {
|
magic = ldl_be_p(buf);
|
||||||
s->desc_offset = 0x200;
|
switch (magic) {
|
||||||
} else {
|
case VMDK3_MAGIC:
|
||||||
ret = vmdk_open_desc_file(bs, flags, buf, errp);
|
case VMDK4_MAGIC:
|
||||||
if (ret) {
|
ret = vmdk_open_sparse(bs, bs->file, flags, buf, errp);
|
||||||
goto fail;
|
s->desc_offset = 0x200;
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
|
ret = vmdk_open_desc_file(bs, flags, buf, errp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (ret) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
/* try to open parent images, if exist */
|
/* try to open parent images, if exist */
|
||||||
ret = vmdk_parent_open(bs);
|
ret = vmdk_parent_open(bs);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -8,7 +8,7 @@ no file open, try 'help open'
|
||||||
=== Testing too big L2 table size ===
|
=== Testing too big L2 table size ===
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
L2 table size too big
|
L2 table size too big
|
||||||
qemu-io: can't open device TEST_DIR/t.vmdk: Could not open 'TEST_DIR/t.vmdk': Wrong medium type
|
qemu-io: can't open device TEST_DIR/t.vmdk: Could not open 'TEST_DIR/t.vmdk': Invalid argument
|
||||||
no file open, try 'help open'
|
no file open, try 'help open'
|
||||||
|
|
||||||
=== Testing too big L1 table size ===
|
=== Testing too big L1 table size ===
|
||||||
|
@ -2046,7 +2046,7 @@ RW 12582912 VMFS "dummy.IMGFMT" 1
|
||||||
=== Testing truncated sparse ===
|
=== Testing truncated sparse ===
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=107374182400
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=107374182400
|
||||||
qemu-img: File truncated, expecting at least 13172736 bytes
|
qemu-img: File truncated, expecting at least 13172736 bytes
|
||||||
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Could not open 'TEST_DIR/t.IMGFMT': Wrong medium type
|
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Could not open 'TEST_DIR/t.IMGFMT': Invalid argument
|
||||||
|
|
||||||
=== Testing version 3 ===
|
=== Testing version 3 ===
|
||||||
image: TEST_DIR/iotest-version3.IMGFMT
|
image: TEST_DIR/iotest-version3.IMGFMT
|
||||||
|
|
Loading…
Reference in New Issue