4 * Copyright (C) 2013 Proxmox Server Solutions
5 * Copyright (c) 2019 Virtuozzo International GmbH.
8 * Dietmar Maurer (dietmar@proxmox.com)
9 * Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
11 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12 * See the COPYING file in the top-level directory.
18 #include "block/block.h"
19 #include "qemu/co-shared-resource.h"
21 typedef struct BlockCopyInFlightReq
{
24 QLIST_ENTRY(BlockCopyInFlightReq
) list
;
25 CoQueue wait_queue
; /* coroutines blocked on this request */
26 } BlockCopyInFlightReq
;
28 typedef void (*ProgressBytesCallbackFunc
)(int64_t bytes
, void *opaque
);
29 typedef struct BlockCopyState
{
31 * BdrvChild objects are not owned or managed by block-copy. They are
32 * provided by block-copy user and user is responsible for appropriate
33 * permissions on these children.
37 BdrvDirtyBitmap
*copy_bitmap
;
38 int64_t in_flight_bytes
;
43 QLIST_HEAD(, BlockCopyInFlightReq
) inflight_reqs
;
45 BdrvRequestFlags write_flags
;
50 * Used by sync=top jobs, which first scan the source node for unallocated
51 * areas and clear them in the copy_bitmap. During this process, the bitmap
52 * is thus not fully initialized: It may still have bits set for areas that
53 * are unallocated and should actually not be copied.
55 * This is indicated by skip_unallocated.
57 * In this case, block_copy() will query the source’s allocation status,
58 * skip unallocated regions, clear them in the copy_bitmap, and invoke
59 * block_copy_reset_unallocated() every time it does.
61 bool skip_unallocated
;
63 ProgressMeter
*progress
;
64 /* progress_bytes_callback: called when some copying progress is done. */
65 ProgressBytesCallbackFunc progress_bytes_callback
;
66 void *progress_opaque
;
71 BlockCopyState
*block_copy_state_new(BdrvChild
*source
, BdrvChild
*target
,
73 BdrvRequestFlags write_flags
,
76 void block_copy_set_progress_callback(
78 ProgressBytesCallbackFunc progress_bytes_callback
,
79 void *progress_opaque
);
81 void block_copy_set_progress_meter(BlockCopyState
*s
, ProgressMeter
*pm
);
83 void block_copy_state_free(BlockCopyState
*s
);
85 int64_t block_copy_reset_unallocated(BlockCopyState
*s
,
86 int64_t offset
, int64_t *count
);
88 int coroutine_fn
block_copy(BlockCopyState
*s
, int64_t offset
, int64_t bytes
,
91 #endif /* BLOCK_COPY_H */