Fuction to get drive mapping from qed images Signed-off-by: Devin Nakamura <devin...@gmail.com> --- block/qed.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/block/qed.c b/block/qed.c index 00cf895..dadb7f8 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1451,6 +1451,37 @@ static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result) return qed_check(s, result, false); } +static int bdrv_qed_get_mapping(BlockDriverState *bs, uint64_t *guest_offset, + uint64_t *host_offset, + uint64_t *contiguous_bytes) +{ + BDRVQEDState *s = bs->opaque; + size_t l2_size = s->header.cluster_size * s->table_nelems; + uint64_t pos = *guest_offset + *contiguous_bytes; + uint64_t offset = pos; + size_t len = 0; + QEDRequest req = {.l2_table = NULL}; + int ret; + + if (pos >= s->header.image_size) { + *contiguous_bytes = 0; + return 0; + } + + do { + pos += len; + ret = qed_find_cluster_sync(s, &req, pos, l2_size, &offset, &len); + } while (ret != QED_CLUSTER_FOUND && pos < s->header.image_size); + *guest_offset = pos; + *host_offset = offset; + if (pos >= s->header.image_size) { + *contiguous_bytes = 0; + } else { + *contiguous_bytes = len; + } + return 0; +} + static QEMUOptionParameter qed_create_options[] = { { .name = BLOCK_OPT_SIZE, @@ -1497,6 +1528,7 @@ static BlockDriver bdrv_qed = { .bdrv_get_info = bdrv_qed_get_info, .bdrv_change_backing_file = bdrv_qed_change_backing_file, .bdrv_check = bdrv_qed_check, + .bdrv_get_mapping = bdrv_qed_get_mapping, }; static void bdrv_qed_init(void) -- 1.7.6.rc1