summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2014-02-17 14:44:02 +0100
committerKevin Wolf <kwolf@redhat.com>2014-02-21 21:02:24 +0100
commita8842e6d2acc815e9660cc743bd0b0daba18c935 (patch)
treee7d5c0a297f50df8d08cc1007e6879ce62e8a5b5
parentc0f92b526dbd45fc5b539f51b7379156814dafe9 (diff)
downloadqemu-a8842e6d2acc815e9660cc743bd0b0daba18c935.tar.gz
vmdk: extract vmdk_read_desc
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r--block/vmdk.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/block/vmdk.c b/block/vmdk.c
index 54a1c59427..b80810802a 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -529,6 +529,32 @@ static int vmdk_open_vmfs_sparse(BlockDriverState *bs,
static int vmdk_open_desc_file(BlockDriverState *bs, int flags,
uint64_t desc_offset, Error **errp);
+static char *vmdk_read_desc(BlockDriverState *file, uint64_t desc_offset,
+ Error **errp)
+{
+ int64_t size;
+ char *buf;
+ int ret;
+
+ size = bdrv_getlength(file);
+ if (size < 0) {
+ error_setg_errno(errp, -size, "Could not access file");
+ return NULL;
+ }
+
+ size = MIN(size, 1 << 20); /* avoid unbounded allocation */
+ buf = g_malloc0(size + 1);
+
+ ret = bdrv_pread(file, desc_offset, buf, size);
+ if (ret < 0) {
+ error_setg_errno(errp, -ret, "Could not read from file");
+ g_free(buf);
+ return NULL;
+ }
+
+ return buf;
+}
+
static int vmdk_open_vmdk4(BlockDriverState *bs,
BlockDriverState *file,
int flags, Error **errp)
@@ -823,23 +849,16 @@ static int vmdk_open_desc_file(BlockDriverState *bs, int flags,
uint64_t desc_offset, Error **errp)
{
int ret;
- char *buf = NULL;
+ char *buf;
char ct[128];
BDRVVmdkState *s = bs->opaque;
- int64_t size;
- size = bdrv_getlength(bs->file);
- if (size < 0) {
+ buf = vmdk_read_desc(bs->file, desc_offset, errp);
+ if (!buf) {
return -EINVAL;
- }
-
- size = MIN(size, 1 << 20); /* avoid unbounded allocation */
- buf = g_malloc0(size + 1);
-
- ret = bdrv_pread(bs->file, desc_offset, buf, size);
- if (ret < 0) {
goto exit;
}
+
if (vmdk_parse_description(buf, "createType", ct, sizeof(ct))) {
ret = -EMEDIUMTYPE;
goto exit;