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 struct BlockCopyState {
30
31
32
33
34
35 BdrvChild *source;
36 BdrvChild *target;
37 BdrvDirtyBitmap *copy_bitmap;
38 int64_t in_flight_bytes;
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 ProgressMeter *progress;
64
65 ProgressBytesCallbackFunc progress_bytes_callback;
66 void *progress_opaque;
67
68 SharedResource *mem;
69} BlockCopyState;
70
71BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
72 int64_t cluster_size,
73 BdrvRequestFlags write_flags,
74 Error **errp);
75
76void block_copy_set_progress_callback(
77 BlockCopyState *s,
78 ProgressBytesCallbackFunc progress_bytes_callback,
79 void *progress_opaque);
80
81void block_copy_set_progress_meter(BlockCopyState *s, ProgressMeter *pm);
82
83void block_copy_state_free(BlockCopyState *s);
84
85int64_t block_copy_reset_unallocated(BlockCopyState *s,
86 int64_t offset, int64_t *count);
87
88int coroutine_fn block_copy(BlockCopyState *s, int64_t start, uint64_t bytes,
89 bool *error_is_read);
90
91#endif
92