aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--block/backup.c6
-rw-r--r--block/block-copy.c24
-rw-r--r--include/block/block-copy.h13
3 files changed, 28 insertions, 15 deletions
diff --git a/block/backup.c b/block/backup.c
index b5b7939..1057ed0 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -478,8 +478,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
job->bitmap_mode = bitmap_mode;
job->bcs = block_copy_state_new(bs, target, cluster_size, write_flags,
- backup_progress_bytes_callback,
- backup_progress_reset_callback, job, errp);
+ errp);
if (!job->bcs) {
goto error;
}
@@ -487,6 +486,9 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
job->cluster_size = cluster_size;
job->len = len;
+ block_copy_set_callbacks(job->bcs, backup_progress_bytes_callback,
+ backup_progress_reset_callback, job);
+
/* Required permissions are already taken by block-copy-state target */
block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
&error_abort);
diff --git a/block/block-copy.c b/block/block-copy.c
index 61e5ea5..fcb112d 100644
--- a/block/block-copy.c
+++ b/block/block-copy.c
@@ -66,12 +66,10 @@ void block_copy_state_free(BlockCopyState *s)
g_free(s);
}
-BlockCopyState *block_copy_state_new(
- BlockDriverState *source, BlockDriverState *target,
- int64_t cluster_size, BdrvRequestFlags write_flags,
- ProgressBytesCallbackFunc progress_bytes_callback,
- ProgressResetCallbackFunc progress_reset_callback,
- void *progress_opaque, Error **errp)
+BlockCopyState *block_copy_state_new(BlockDriverState *source,
+ BlockDriverState *target,
+ int64_t cluster_size,
+ BdrvRequestFlags write_flags, Error **errp)
{
BlockCopyState *s;
int ret;
@@ -95,9 +93,6 @@ BlockCopyState *block_copy_state_new(
.cluster_size = cluster_size,
.len = bdrv_dirty_bitmap_size(copy_bitmap),
.write_flags = write_flags,
- .progress_bytes_callback = progress_bytes_callback,
- .progress_reset_callback = progress_reset_callback,
- .progress_opaque = progress_opaque,
};
s->copy_range_size = QEMU_ALIGN_DOWN(MIN(blk_get_max_transfer(s->source),
@@ -144,6 +139,17 @@ fail:
return NULL;
}
+void block_copy_set_callbacks(
+ BlockCopyState *s,
+ ProgressBytesCallbackFunc progress_bytes_callback,
+ ProgressResetCallbackFunc progress_reset_callback,
+ void *progress_opaque)
+{
+ s->progress_bytes_callback = progress_bytes_callback;
+ s->progress_reset_callback = progress_reset_callback;
+ s->progress_opaque = progress_opaque;
+}
+
/*
* Copy range to target with a bounce buffer and return the bytes copied. If
* error occurred, return a negative error number
diff --git a/include/block/block-copy.h b/include/block/block-copy.h
index 962f910..340d856 100644
--- a/include/block/block-copy.h
+++ b/include/block/block-copy.h
@@ -66,12 +66,17 @@ typedef struct BlockCopyState {
void *progress_opaque;
} BlockCopyState;
-BlockCopyState *block_copy_state_new(
- BlockDriverState *source, BlockDriverState *target,
- int64_t cluster_size, BdrvRequestFlags write_flags,
+BlockCopyState *block_copy_state_new(BlockDriverState *source,
+ BlockDriverState *target,
+ int64_t cluster_size,
+ BdrvRequestFlags write_flags,
+ Error **errp);
+
+void block_copy_set_callbacks(
+ BlockCopyState *s,
ProgressBytesCallbackFunc progress_bytes_callback,
ProgressResetCallbackFunc progress_reset_callback,
- void *progress_opaque, Error **errp);
+ void *progress_opaque);
void block_copy_state_free(BlockCopyState *s);