1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef BLOCK_COPY_H
16#define BLOCK_COPY_H
17
18#include "block/block.h"
19#include "qemu/co-shared-resource.h"
20
21typedef struct BlockCopyInFlightReq {
22 int64_t start_byte;
23 int64_t end_byte;
24 QLIST_ENTRY(BlockCopyInFlightReq) list;
25 CoQueue wait_queue;
26} BlockCopyInFlightReq;
27
28typedef void (*ProgressBytesCallbackFunc)(int64_t bytes, void *opaque);
29typedef void (*ProgressResetCallbackFunc)(void *opaque);
30typedef struct BlockCopyState {
31
32
33
34
35
36 BdrvChild *source;
37 BdrvChild *target;
38 BdrvDirtyBitmap *copy_bitmap;
39 int64_t cluster_size;
40 bool use_copy_range;
41 int64_t copy_size;
42 uint64_t len;
43 QLIST_HEAD(, BlockCopyInFlightReq) inflight_reqs;
44
45 BdrvRequestFlags write_flags;
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 bool skip_unallocated;
62
63
64 ProgressBytesCallbackFunc progress_bytes_callback;
65
66
67
68
69
70
71 ProgressResetCallbackFunc progress_reset_callback;
72 void *progress_opaque;
73
74 SharedResource *mem;
75} BlockCopyState;
76
77BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
78 int64_t cluster_size,
79 BdrvRequestFlags write_flags,
80 Error **errp);
81
82void block_copy_set_callbacks(
83 BlockCopyState *s,
84 ProgressBytesCallbackFunc progress_bytes_callback,
85 ProgressResetCallbackFunc progress_reset_callback,
86 void *progress_opaque);
87
88void block_copy_state_free(BlockCopyState *s);
89
90int64_t block_copy_reset_unallocated(BlockCopyState *s,
91 int64_t offset, int64_t *count);
92
93int coroutine_fn block_copy(BlockCopyState *s, int64_t start, uint64_t bytes,
94 bool *error_is_read);
95
96#endif
97