As of version 3, the qcow2 file format supports different widths for refcount entries, ranging from 1 to 64 bit (only powers of two). Currently, qemu only supports 16 bit, which is the only width supported by version 2 (compat=0.10) images.
This series adds support to qemu for all other valid refcount orders. This is mainly done by adding two function pointers into the BDRVQcowState structure for reading and writing refcount values independently of the current refcount entry width; all in-memory refcount arrays (mostly cached refcount blocks) now are void pointers and are accessed through these functions alone. Thanks to previous work of making the qemu code agnostic of e.g. the number of refcount entries per refcount block, the rest is fairly trivial. The most complex patch in this series is patch 22 which implements changing the refcount order through qemu-img amend. To test different refcount widths, simply invoke the qemu-iotests check program with -o refcount_bits=${your_desired_width}. The final test in this series adds some tests for operations which do not work with certain refcount orders and for refcount order amendment. Patches 1 to 10 are already merged to Kevin's block branch, so I omitted them in this version. v7: - Patch 11: Make refcount_bits a uint64_t so it won't overflow in patch 14 [Kevin] - Patch 14: refcount_bits now being a uint64_t, I dropped the "refcount_bits <= 0" check ("== 0" is checked by is_power_of_2()) - Split the old patch 24 into patches 15 and 25 [Kevin] git-backport-diff against v6: Key: [----] : patches are identical [####] : number of functional differences between upstream/downstream patch [down] : patch is downstream-only The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively 011/25:[0003] [FC] 'qcow2: refcount_order parameter for qcow2_create2' 012/25:[----] [--] 'qcow2: Use symbolic macros in qcow2_amend_options' 013/25:[----] [--] 'iotests: Prepare for refcount_bits option' 014/25:[0004] [FC] 'qcow2: Allow creation with refcount order != 4' 015/25:[0180] [FC] 'iotests: Add test for different refcount widths' 016/25:[----] [--] 'progress: Allow regressing progress' 017/25:[----] [--] 'block: Add opaque value to the amend CB' 018/25:[----] [--] 'qcow2: Use error_report() in qcow2_amend_options()' 019/25:[----] [--] 'qcow2: Use abort() instead of assert(false)' 020/25:[----] [--] 'qcow2: Split upgrade/downgrade paths for amend' 021/25:[----] [--] 'qcow2: Use intermediate helper CB for amend' 022/25:[----] [--] 'qcow2: Add function for refcount order amendment' 023/25:[----] [--] 'qcow2: Invoke refcount order amendment function' 024/25:[----] [--] 'qcow2: Point to amend function in check' 025/25:[down] 'iotests: Extend test 112 for qemu-img amend' Max Reitz (15): qcow2: refcount_order parameter for qcow2_create2 qcow2: Use symbolic macros in qcow2_amend_options iotests: Prepare for refcount_bits option qcow2: Allow creation with refcount order != 4 iotests: Add test for different refcount widths progress: Allow regressing progress block: Add opaque value to the amend CB qcow2: Use error_report() in qcow2_amend_options() qcow2: Use abort() instead of assert(false) qcow2: Split upgrade/downgrade paths for amend qcow2: Use intermediate helper CB for amend qcow2: Add function for refcount order amendment qcow2: Invoke refcount order amendment function qcow2: Point to amend function in check iotests: Extend test 112 for qemu-img amend block.c | 4 +- block/qcow2-cluster.c | 14 +- block/qcow2-refcount.c | 455 +++++++++++++++++++++++++++++++++++++++ block/qcow2.c | 270 +++++++++++++++++------ block/qcow2.h | 7 +- include/block/block.h | 4 +- include/block/block_int.h | 4 +- qemu-img.c | 5 +- tests/qemu-iotests/007 | 3 + tests/qemu-iotests/015 | 2 + tests/qemu-iotests/026 | 7 + tests/qemu-iotests/029 | 2 + tests/qemu-iotests/049.out | 108 +++++----- tests/qemu-iotests/051 | 3 + tests/qemu-iotests/058 | 2 + tests/qemu-iotests/061.out | 14 +- tests/qemu-iotests/067 | 2 + tests/qemu-iotests/079 | 10 +- tests/qemu-iotests/079.out | 38 +--- tests/qemu-iotests/080 | 2 + tests/qemu-iotests/082.out | 41 +++- tests/qemu-iotests/085.out | 38 ++-- tests/qemu-iotests/089 | 2 + tests/qemu-iotests/108 | 2 + tests/qemu-iotests/112 | 296 +++++++++++++++++++++++++ tests/qemu-iotests/112.out | 155 +++++++++++++ tests/qemu-iotests/common.filter | 3 +- tests/qemu-iotests/group | 1 + util/qemu-progress.c | 3 +- 29 files changed, 1297 insertions(+), 200 deletions(-) create mode 100755 tests/qemu-iotests/112 create mode 100644 tests/qemu-iotests/112.out -- 2.1.0