qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] vmdk: implment bdrv_get_info and bdrv_get_specific_


From: Fam Zheng
Subject: [Qemu-devel] [PATCH] vmdk: implment bdrv_get_info and bdrv_get_specific_info
Date: Thu, 10 Oct 2013 15:07:04 +0800

.bdrv_get_info reports cluster_size if it's a monolithic image.

.bdrv_get_specific_info reports the image version (if applicable) and
extent file name list.

Signed-off-by: Fam Zheng <address@hidden>
---
 block/vmdk.c     | 44 ++++++++++++++++++++++++++++++++++++++++++++
 qapi-schema.json | 14 +++++++++++++-
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/block/vmdk.c b/block/vmdk.c
index 5d56e31..ff9bdac 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1814,6 +1814,48 @@ static int vmdk_has_zero_init(BlockDriverState *bs)
     return 1;
 }
 
+static int vmdk_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+    BDRVVmdkState *s = bs->opaque;
+    /* Normally the cluster sizes for all the extents in a vmdk image are the
+     * same, but we don't bother to check for this here and only report the
+     * value for the monolithic case. */
+    if (s->num_extents == 1 && !s->extents[0].flat) {
+        bdi->cluster_size = s->extents[0].cluster_sectors * 512;
+    }
+    return 0;
+}
+
+static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs)
+{
+    int i;
+    BDRVVmdkState *s = bs->opaque;
+    ImageInfoSpecific *spec_info = g_new(ImageInfoSpecific, 1);
+    strList **next;
+
+    *spec_info = (ImageInfoSpecific){
+        .kind  = IMAGE_INFO_SPECIFIC_KIND_VMDK,
+        .vmdk = g_new(ImageInfoSpecificVmdk, 1),
+    };
+
+    next = &spec_info->vmdk->extents;
+    for (i = 0; i < s->num_extents; i++) {
+        *next = g_new(strList, 1);
+        **next = (strList){
+            .value = g_strdup(s->extents[i].file->filename),
+            .next = NULL,
+        };
+        next = &(*next)->next;
+    }
+
+    if (s->num_extents == 1) {
+        spec_info->vmdk->version = s->extents[0].version;
+        spec_info->vmdk->has_version = true;
+    }
+
+    return spec_info;
+}
+
 static QEMUOptionParameter vmdk_create_options[] = {
     {
         .name = BLOCK_OPT_SIZE,
@@ -1866,6 +1908,8 @@ static BlockDriver bdrv_vmdk = {
     .bdrv_co_get_block_status     = vmdk_co_get_block_status,
     .bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
     .bdrv_has_zero_init           = vmdk_has_zero_init,
+    .bdrv_get_info                = vmdk_get_info,
+    .bdrv_get_specific_info       = vmdk_get_specific_info,
 
     .create_options               = vmdk_create_options,
 };
diff --git a/qapi-schema.json b/qapi-schema.json
index a1a81a4..b1e74b3 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -225,6 +225,17 @@
   } }
 
 ##
+# @ImageInfoSpecificVmdk:
+#
+# Since: 1.7
+##
+{ 'type': 'ImageInfoSpecificVmdk',
+  'data': {
+      '*version': 'int',
+      'extents': ['str']
+  } }
+
+##
 # @ImageInfoSpecific:
 #
 # A discriminated record of image format specific information structures.
@@ -234,7 +245,8 @@
 
 { 'union': 'ImageInfoSpecific',
   'data': {
-      'qcow2': 'ImageInfoSpecificQCow2'
+      'qcow2': 'ImageInfoSpecificQCow2',
+      'vmdk': 'ImageInfoSpecificVmdk'
   } }
 
 ##
-- 
1.8.3.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]