qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] vmdk: implment bdrv_get_info and bdrv_get_specific_info
@ 2013-10-10  7:07 Fam Zheng
  2013-10-10 10:10 ` Kevin Wolf
  0 siblings, 1 reply; 2+ messages in thread
From: Fam Zheng @ 2013-10-10  7:07 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, pbonzini, famz, stefanha

.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 <famz@redhat.com>
---
 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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-10-10 10:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-10  7:07 [Qemu-devel] [PATCH] vmdk: implment bdrv_get_info and bdrv_get_specific_info Fam Zheng
2013-10-10 10:10 ` Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).