This series sets out the foundations of an api for in place image conversion, and implements it in the QED and QCOW2 drivers.
The basic flow of conversion is as follows: The source image is openened as normal. The source file is the queried for conversion options via bdrv_get_conversion_options. The conversion options contain things like the size of the clusters, the type of encryption etc. The target image is then opened with bdrv_open_conversion_target, passing the conversion optionons among other things allong with it. This is basically a hybrid of bdrv_open and bdrv_create. Mappings are then fetched and set using bdrv_get_mapping and bdrv_map respectively. They both deal with data in the format guest_offset, host_offset, and contiguous_bytes. For example if guest_offset = 31, host_offset = 41, and contiguous_bytes = 59 that would mean that offset 31 in the virtual disk would be located at offset 41 in the image file and 32 at 42 and so on up to 89 at 99. At the end of the mapping process the image is "finalized" with bdrv_copy_header, where the target driver copies out the old header to a temporary file, and then writes out its own header into the image. I've integerated inplace conversion into qemu-img in the form: qemu-img convert-inplace <imagefile> <target_format> I've also integrated bdrv_get_mapping and bdrv_map into qemu-io (with the former replacing qemu-io's internal mapping when then block driver supports it) Devin Nakamura (24): block: add block conversion api block: add bdrv_get_conversion_options() block: add bdrv_open_conversion_target() block: add bdrv_get_mapping() block: add bdrv_map() block: add bdrv_copy_header() qed: make qed_alloc_clusters round up offset to nearest cluster qed: add qed_find_cluster_sync() qed: add qed_bdrv_get_mapping() qed: add qed_bdrv_map() qed: add open_conversion_target() qed: add bdrv_qed_copy_header() qed: add bdrv_qed_get_conversion_options() qcow2: fix typo in documentation for qcow2_get_cluster_offset() qcow2: split up the creation of new refcount table from the act of checking it qcow2: add qcow2_drop_leaked_clusters() qcow2: add qcow2_get_mapping qcow2: add qcow2_map qcow2: add qcow2_copy_header() qcow2: add get_conversion_options() qcow2: add qcow2_open_conversion_target() qemu-io: make map command use new block mapping function qemu-io: add setmap command qemu-img: add inplace conversion to qemu-img Makefile | 2 + block.c | 100 +++++++++++++++++++++ block.h | 14 +++ block/qcow2-cluster.c | 53 +++++++++++- block/qcow2-refcount.c | 71 +++++++++++++-- block/qcow2.c | 233 ++++++++++++++++++++++++++++++++++++++++++++++++ block/qcow2.h | 5 + block/qed-cluster.c | 35 +++++++ block/qed.c | 193 ++++++++++++++++++++++++++++++++++++--- block/qed.h | 4 + block_int.h | 88 ++++++++++++++++++ qemu-img-cmds.hx | 6 ++ qemu-img.c | 64 +++++++++++++ qemu-io.c | 47 ++++++++++- 14 files changed, 888 insertions(+), 27 deletions(-) -- 1.7.6.rc1