Allow data compression during block-stream job for backup backing chain. Signed-off-by: Andrey Shinkevich <andrey.shinkev...@virtuozzo.com> --- block/stream.c | 10 ++++++++-- blockdev.c | 12 +++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/block/stream.c b/block/stream.c index 5562ccb..25f9324 100644 --- a/block/stream.c +++ b/block/stream.c @@ -41,10 +41,16 @@ typedef struct StreamBlockJob { static int coroutine_fn stream_populate(BlockBackend *blk, int64_t offset, uint64_t bytes) { + BlockDriverState *bs = blk_bs(blk); + int flags = BDRV_REQ_COPY_ON_READ | BDRV_REQ_PREFETCH; + + if (bs->all_write_compressed) { + flags |= BDRV_REQ_WRITE_COMPRESSED; + } + assert(bytes < SIZE_MAX); - return blk_co_preadv(blk, offset, bytes, NULL, - BDRV_REQ_COPY_ON_READ | BDRV_REQ_PREFETCH); + return blk_co_preadv(blk, offset, bytes, NULL, flags); } static void stream_abort(Job *job) diff --git a/blockdev.c b/blockdev.c index 2103730..fd824da 100644 --- a/blockdev.c +++ b/blockdev.c @@ -471,7 +471,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, int bdrv_flags = 0; int on_read_error, on_write_error; bool account_invalid, account_failed; - bool writethrough, read_only; + bool writethrough, read_only, compress; BlockBackend *blk; BlockDriverState *bs; ThrottleConfig cfg; @@ -570,6 +570,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, } read_only = qemu_opt_get_bool(opts, BDRV_OPT_READ_ONLY, false); + compress = qemu_opt_get_bool(opts, BDRV_OPT_COMPRESS, false); /* init */ if ((!file || !*file) && !qdict_size(bs_opts)) { @@ -595,6 +596,8 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts, qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY, read_only ? "on" : "off"); qdict_set_default_str(bs_opts, BDRV_OPT_AUTO_READ_ONLY, "on"); + qdict_set_default_str(bs_opts, BDRV_OPT_COMPRESS, + compress ? "on" : "off"); assert((bdrv_flags & BDRV_O_CACHE_MASK) == 0); if (runstate_check(RUN_STATE_INMIGRATE)) { @@ -3308,6 +3311,13 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device, goto out; } + if (bs->all_write_compressed && + bs->drv->bdrv_co_pwritev_compressed_part == NULL) { + error_setg(errp, "Compression is not supported for this drive %s", + bdrv_get_device_name(bs)); + goto out; + } + /* backing_file string overrides base bs filename */ base_name = has_backing_file ? backing_file : base_name; -- 1.8.3.1