Note: This is a resend of v5 because the emails I sent earlier today disappeared.
This series adds the 'block_stream' command which copies the contents of a backing file into the image file while the VM is running. The series builds on the zero detection features which I sent out before Christmas. I suggest grabbing my git tree to try it out without merging this dependency: https://github.com/stefanha/qemu/tree/image-streaming-api The image streaming HMP/QMP commands are documented in the patch and also described here: http://wiki.qemu.org/Features/LiveBlockMigration/ImageStreamingAPI The basic idea is to execute 'block_stream virtio0' while the guest is running. Progress can be monitored using 'info block-jobs'. When the streaming operation completes it raises a QMP event. Note: The last patch includes includes a Python test script called test-stream.py, I do not propose to merge it. When run in a QEMU source tree it performs basic image streaming QMP tests. v5: * Handle block_job_create() failure [Luiz] * Mark BLOCK_JOB_COMPLETED error field optional [Luiz] * Mark block_stream base parameter optional [Luiz] * Check bdrv_getlength() failure and don't call twice [Kevin] * Rename "id" to "backing_file" in bdrv_find_backing_image() [Kevin] * Rename BaseIdNotFound qerror to BaseNotFound [Kevin] * Document BaseNotFound qerror from block_stream * Document that qemu_co_sleep_ns() needs main loop [Kevin] * Make bdrv_co_is_allocated_base() private to block/stream.c [Kevin] * Clean up commit messages v4: * Drop SQMP/EQMP docs from qmp-commands.hx [Luiz] * Follow QAPI doc conventions [Luiz] * Document QMP events in QMP/qmp-events.txt [Luiz] * Protect against hotplug, resize, eject, etc [Kevin] * Move block job functions from header to block.c [Kevin] * Return error from bdrg_change_backing_file() [Kevin] * Merge Marcelo's block_stream base partial streaming series [Marcelo] Marcelo Tosatti (4): block: add bdrv_find_backing_image add QERR_BASE_NOT_FOUND block: add support for partial streaming docs: describe live block operations Stefan Hajnoczi (11): coroutine: add co_sleep_ns() coroutine sleep function block: check bdrv_in_use() before blockdev operations block: add BlockJob interface for long-running operations block: add image streaming block job block: rate-limit streaming operations qmp: add block_stream command qmp: add block_job_set_speed command qmp: add block_job_cancel command qmp: add query-block-jobs blockdev: make image streaming safe across hotplug test: add image streaming test cases Makefile.objs | 2 + QMP/qmp-events.txt | 53 ++++++++++ block.c | 70 +++++++++++++ block.h | 2 + block/stream.c | 260 +++++++++++++++++++++++++++++++++++++++++++++++ block_int.h | 44 ++++++++ blockdev.c | 199 +++++++++++++++++++++++++++++++++++- docs/live-block-ops.txt | 58 +++++++++++ hmp-commands.hx | 41 ++++++++ hmp.c | 68 ++++++++++++ hmp.h | 4 + monitor.c | 13 +++ monitor.h | 2 + qapi-schema.json | 116 +++++++++++++++++++++ qemu-coroutine-sleep.c | 38 +++++++ qemu-coroutine.h | 9 ++ qerror.c | 8 ++ qerror.h | 6 + qmp-commands.hx | 24 +++++ test-stream.py | 208 +++++++++++++++++++++++++++++++++++++ trace-events | 9 ++ 21 files changed, 1233 insertions(+), 1 deletions(-) create mode 100644 block/stream.c create mode 100644 docs/live-block-ops.txt create mode 100644 qemu-coroutine-sleep.c create mode 100644 test-stream.py -- 1.7.7.3