We'll need a possibility to set compress and use_copy_range options after initialization of the state. So make corresponding part of block_copy_state_new() separate and public.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/block/block-copy.h | 2 ++ block/block-copy.c | 56 ++++++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/include/block/block-copy.h b/include/block/block-copy.h index c013a20e1e..b74fb80067 100644 --- a/include/block/block-copy.h +++ b/include/block/block-copy.h @@ -26,6 +26,8 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, int64_t cluster_size, bool use_copy_range, bool compress, Error **errp); +void block_copy_set_copy_opts(BlockCopyState *s, bool use_copy_range, + bool compress); void block_copy_set_progress_meter(BlockCopyState *s, ProgressMeter *pm); void block_copy_state_free(BlockCopyState *s); diff --git a/block/block-copy.c b/block/block-copy.c index 22a7c64c10..8baf8b9403 100644 --- a/block/block-copy.c +++ b/block/block-copy.c @@ -245,6 +245,37 @@ static uint32_t block_copy_max_transfer(BdrvChild *source, BdrvChild *target) target->bs->bl.max_transfer)); } +/* Function should be called prior any actual copy request */ +void block_copy_set_copy_opts(BlockCopyState *s, bool use_copy_range, + bool compress) +{ + if (compress) { + s->write_flags |= BDRV_REQ_WRITE_COMPRESSED; + } + + if (block_copy_max_transfer(s->source, s->target) < s->cluster_size) { + /* + * copy_range does not respect max_transfer. We don't want to bother + * with requests smaller than block-copy cluster size, so fallback to + * buffered copying (read and write respect max_transfer on their + * behalf). + */ + s->use_copy_range = false; + s->copy_size = s->cluster_size; + } else if (compress) { + /* Compression supports only cluster-size writes and no copy-range. */ + s->use_copy_range = false; + s->copy_size = s->cluster_size; + } else { + /* + * We enable copy-range, but keep small copy_size, until first + * successful copy_range (look at block_copy_do_copy). + */ + s->use_copy_range = use_copy_range; + s->copy_size = MAX(s->cluster_size, BLOCK_COPY_MAX_BUFFER); + } +} + BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, int64_t cluster_size, bool use_copy_range, bool compress, Error **errp) @@ -288,32 +319,11 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target, .copy_bitmap = copy_bitmap, .cluster_size = cluster_size, .len = bdrv_dirty_bitmap_size(copy_bitmap), - .write_flags = BDRV_REQ_SERIALISING | - (compress ? BDRV_REQ_WRITE_COMPRESSED : 0), + .write_flags = BDRV_REQ_SERIALISING, .mem = shres_create(BLOCK_COPY_MAX_MEM), }; - if (block_copy_max_transfer(source, target) < cluster_size) { - /* - * copy_range does not respect max_transfer. We don't want to bother - * with requests smaller than block-copy cluster size, so fallback to - * buffered copying (read and write respect max_transfer on their - * behalf). - */ - s->use_copy_range = false; - s->copy_size = cluster_size; - } else if (compress) { - /* Compression supports only cluster-size writes and no copy-range. */ - s->use_copy_range = false; - s->copy_size = cluster_size; - } else { - /* - * We enable copy-range, but keep small copy_size, until first - * successful copy_range (look at block_copy_do_copy). - */ - s->use_copy_range = use_copy_range; - s->copy_size = MAX(s->cluster_size, BLOCK_COPY_MAX_BUFFER); - } + block_copy_set_copy_opts(s, use_copy_range, compress); ratelimit_init(&s->rate_limit); QLIST_INIT(&s->tasks); -- 2.29.2