Patchwork [4/6] VMDK: Opening compressed extent.

login
register
mail settings
Submitter Feiran Zheng
Date July 27, 2011, 9:27 a.m.
Message ID <1311758866-30029-5-git-send-email-famcool@gmail.com>
Download mbox | patch
Permalink /patch/107005/
State New
Headers show

Comments

Feiran Zheng - July 27, 2011, 9:27 a.m.
Added flags field for compressed/streamOptimized extents, open and save
image configuration.

Signed-off-by: Fam Zheng <famcool@gmail.com>
---
 block/vmdk.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)
Stefan Hajnoczi - Aug. 2, 2011, 10:59 a.m.
On Wed, Jul 27, 2011 at 10:27 AM, Fam Zheng <famcool@gmail.com> wrote:
> @@ -415,6 +428,9 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
>                           l1_size,
>                           le32_to_cpu(header.num_gtes_per_gte),
>                           le64_to_cpu(header.granularity));
> +    extent->compressed =
> +        le16_to_cpu(header.compressAlgorithm) == VMDK4_COMPRESSION_DEFLATE;
> +    extent->has_marker = header.flags & VMDK4_FLAG_MARKER;

le32_to_cpu(header.flags)?

Stefan

Patch

diff --git a/block/vmdk.c b/block/vmdk.c
index 0d989f6..5f1638e 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -26,9 +26,13 @@ 
 #include "qemu-common.h"
 #include "block_int.h"
 #include "module.h"
+#include "zlib.h"
 
 #define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D')
 #define VMDK4_MAGIC (('K' << 24) | ('D' << 16) | ('M' << 8) | 'V')
+#define VMDK4_COMPRESSION_DEFLATE 1
+#define VMDK4_FLAG_COMPRESS (1 << 16)
+#define VMDK4_FLAG_MARKER (1 << 17)
 
 typedef struct {
     uint32_t version;
@@ -56,6 +60,7 @@  typedef struct {
     int64_t grain_offset;
     char filler[1];
     char check_bytes[4];
+    uint16_t compressAlgorithm;
 } __attribute__((packed)) VMDK4Header;
 
 #define L2_CACHE_SIZE 16
@@ -63,6 +68,8 @@  typedef struct {
 typedef struct VmdkExtent {
     BlockDriverState *file;
     bool flat;
+    bool compressed;
+    bool has_marker;
     int64_t sectors;
     int64_t end_sector;
     int64_t flat_start_offset;
@@ -98,6 +105,12 @@  typedef struct VmdkMetaData {
     int valid;
 } VmdkMetaData;
 
+typedef struct VmdkGrainMarker {
+    uint64_t lba;
+    uint32_t size;
+    uint8_t  data[0];
+} VmdkGrainMarker;
+
 static int vmdk_probe(const uint8_t *buf, int buf_size, const char *filename)
 {
     uint32_t magic;
@@ -415,6 +428,9 @@  static int vmdk_open_vmdk4(BlockDriverState *bs,
                           l1_size,
                           le32_to_cpu(header.num_gtes_per_gte),
                           le64_to_cpu(header.granularity));
+    extent->compressed =
+        le16_to_cpu(header.compressAlgorithm) == VMDK4_COMPRESSION_DEFLATE;
+    extent->has_marker = header.flags & VMDK4_FLAG_MARKER;
     ret = vmdk_init_tables(bs, extent);
     if (ret) {
         /* free extent allocated by vmdk_add_extent */