This can be used by management applications starting with a job in background mode to determine when the switch to active mode should happen.
While the same information is already there, as the job-agnostic @offset, it's not clear to users what the value means for mirror: it's documentet to be relative to @len only and @len is documented to be able to change in both directions while the job runs. Suggested-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- block/mirror.c | 6 ++++++ qapi/block-core.json | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index ac83309b82..e7b4905b70 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -86,6 +86,9 @@ typedef struct MirrorBlockJob { int64_t active_write_bytes_in_flight; bool prepared; bool in_drain; + + /* Additional information intended for users (returned in mirror_query) */ + int64_t data_sent; } MirrorBlockJob; typedef struct MirrorBDSOpaque { @@ -215,6 +218,7 @@ static void coroutine_fn mirror_iteration_done(MirrorOp *op, int ret) } if (!s->initial_zeroing_ongoing) { job_progress_update(&s->common.job, op->bytes); + s->data_sent += op->bytes; } } qemu_iovec_destroy(&op->qiov); @@ -1259,6 +1263,7 @@ static void mirror_query(BlockJob *job, BlockJobInfo *info) info->u.mirror = (BlockJobInfoMirror) { .actively_synced = s->actively_synced, + .data_sent = s->data_sent, .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap), }; } @@ -1384,6 +1389,7 @@ do_sync_target_write(MirrorBlockJob *job, MirrorMethod method, job->active_write_bytes_in_flight -= bytes; if (ret >= 0) { job_progress_update(&job->common.job, bytes); + job->data_sent += bytes; } else { BlockErrorAction action; diff --git a/qapi/block-core.json b/qapi/block-core.json index 91594eace4..656be5ce2e 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1308,12 +1308,15 @@ # @actively-synced: Whether the source is actively synced to the target, i.e. # same data and new writes are done synchronously to both. # +# @data-sent: How much data was sent in total until now. +# # @remaining-dirty: How much of the source is dirty relative to the target. # # Since 8.0 ## { 'struct': 'BlockJobInfoMirror', - 'data': { 'actively-synced': 'bool', 'remaining-dirty': 'int64' } } + 'data': { 'actively-synced': 'bool', 'data-sent': 'int64', + 'remaining-dirty': 'int64' } } ## # @BlockJobInfo: -- 2.30.2