The new -drive copy-on-read=on|off feature populates the image file with data from the backing file on read. This is useful when accessing images backed over a slow medium (e.g. http over internet). All read data will be stored in the local image file so it does not need to be fetched again in the future.
This series is a prerequisite for the image streaming feature, which uses copy-on-read to populate the image file in the background while the VM is running. However, the copy-on-read feature is useful on its own. Copy-on-read is implemented by checking whether or not data is allocated in the image file before reading it. If data is not allocated then it needs to be read and written back to the image file. The tricky bit is avoiding races with other I/O requests. These patches add request tracking to BlockDriverState so that the list of pending requests is available. Copy-on-read prevents races by serializing overlapping requests. Finally, there is a performance impact when enabling this feature since an additional write is performed. Serializing overlapping requests also means that I/O patterns where multiple requests access the same cluster will see a loss in parallelism. Perhaps we can be smarter about preventing corruption in the future and win back some performance. Git repo: http://repo.or.cz/w/qemu/stefanha.git/shortlog/refs/heads/generic-copy-on-read Stefan Hajnoczi (6): block: add request tracking block: add bdrv_set_copy_on_read() block: wait for overlapping requests block: request overlap detection block: core copy-on-read logic block: add -drive copy-on-read=on|off block.c | 243 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- block.h | 3 + block_int.h | 9 ++ blockdev.c | 6 ++ hmp-commands.hx | 5 +- qemu-config.c | 4 + qemu-options.hx | 9 ++- trace-events | 1 + 8 files changed, 276 insertions(+), 4 deletions(-) -- 1.7.6.3