qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC 17/24] qcow2: add qcow2_get_mapping


From: Devin Nakamura
Subject: [Qemu-devel] [RFC 17/24] qcow2: add qcow2_get_mapping
Date: Fri, 29 Jul 2011 00:49:47 -0400

Signed-off-by: Devin Nakamura <address@hidden>
---
 block/qcow2.c |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

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)
-- 
1.7.6.rc1




reply via email to

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