Patchwork [RFC,17/24] qcow2: add qcow2_get_mapping

login
register
mail settings
Submitter Devin Nakamura
Date July 29, 2011, 4:49 a.m.
Message ID <1311914994-20482-18-git-send-email-devin122@gmail.com>
Download mbox | patch
Permalink /patch/107346/
State New
Headers show

Comments

Devin Nakamura - July 29, 2011, 4:49 a.m.
Signed-off-by: Devin Nakamura <devin122@gmail.com>
---
 block/qcow2.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

Patch

diff --git a/block/qcow2.c b/block/qcow2.c
index 48e1b95..05ea40c 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1340,6 +1340,40 @@  static int qcow2_load_vmstate(BlockDriverState *bs, uint8_t *buf,
     return ret;
 }
 
+static int qcow2_get_mapping(BlockDriverState *bs, uint64_t *guest_offset,
+        uint64_t *host_offset, uint64_t *contiguous_bytes)
+{
+    uint64_t cluster_offset, pos;
+    //BDRVQcowState *s = bs->opaque;
+    int ret, count;
+    pos = *guest_offset + *contiguous_bytes;
+
+    if (pos >= bs->total_sectors << BDRV_SECTOR_BITS) {
+        *contiguous_bytes = 0;
+        return 0;
+    }
+    count = 0;
+    do {
+        pos += count << BDRV_SECTOR_BITS;
+        count = INT_MAX;
+        ret = qcow2_get_cluster_offset(bs, pos, &count, &cluster_offset);
+        if (ret) {
+            *contiguous_bytes = 0;
+            return ret;
+        }
+    } while (!cluster_offset && pos < bs->total_sectors * BDRV_SECTOR_SIZE);
+
+    if (pos >= bs->total_sectors << BDRV_SECTOR_BITS || !cluster_offset) {
+        *contiguous_bytes = 0;
+        return 0;
+    }
+
+    *contiguous_bytes = count << BDRV_SECTOR_BITS;
+    *guest_offset = pos;
+    *host_offset = cluster_offset;
+    return 0;
+}
+
 static QEMUOptionParameter qcow2_create_options[] = {
     {
         .name = BLOCK_OPT_SIZE,
@@ -1409,6 +1443,8 @@  static BlockDriver bdrv_qcow2 = {
 
     .create_options = qcow2_create_options,
     .bdrv_check = qcow2_check,
+
+    .bdrv_get_mapping = qcow2_get_mapping,
 };
 
 static void bdrv_qcow2_init(void)