Lines Matching +full:block +full:- +full:copy
11 * See the COPYING file in the top-level directory.
18 #include "block/block.h"
19 #include "block/block_int.h"
20 #include "block/blockjob_int.h"
21 #include "block/block_backup.h"
22 #include "block/block-copy.h"
23 #include "block/dirty-bitmap.h"
26 #include "sysemu/block-backend.h"
28 #include "qemu/error-report.h"
30 #include "block/copy-before-write.h"
59 bool sync = (((ret == 0) || (job->bitmap_mode == BITMAP_SYNC_MODE_ALWAYS)) \ in backup_cleanup_sync_bitmap()
60 && (job->bitmap_mode != BITMAP_SYNC_MODE_NEVER)); in backup_cleanup_sync_bitmap()
67 bm = bdrv_dirty_bitmap_abdicate(job->sync_bitmap, NULL); in backup_cleanup_sync_bitmap()
73 bm = bdrv_reclaim_dirty_bitmap(job->sync_bitmap, NULL); in backup_cleanup_sync_bitmap()
78 if (ret < 0 && job->bitmap_mode == BITMAP_SYNC_MODE_ALWAYS) { in backup_cleanup_sync_bitmap()
79 /* If we failed and synced, merge in the bits we didn't copy: */ in backup_cleanup_sync_bitmap()
80 bdrv_dirty_bitmap_merge_internal(bm, block_copy_dirty_bitmap(job->bcs), in backup_cleanup_sync_bitmap()
88 if (s->sync_bitmap) { in backup_commit()
96 if (s->sync_bitmap) { in backup_abort()
97 backup_cleanup_sync_bitmap(s, -1); in backup_abort()
104 block_job_remove_all_bdrv(&s->common); in backup_clean()
105 bdrv_cbw_drop(s->cbw); in backup_clean()
114 if (backup_job->sync_mode != MIRROR_SYNC_MODE_NONE) { in backup_do_checkpoint()
115 error_setg(errp, "The backup job only supports block checkpoint in" in backup_do_checkpoint()
120 bdrv_set_dirty_bitmap(block_copy_dirty_bitmap(backup_job->bcs), 0, in backup_do_checkpoint()
121 backup_job->len); in backup_do_checkpoint()
128 return block_job_error_action(&job->common, job->on_source_error, in backup_error_action()
131 return block_job_error_action(&job->common, job->on_target_error, in backup_error_action()
140 if (s->wait) { in backup_block_copy_callback()
141 s->wait = false; in backup_block_copy_callback()
142 aio_co_wake(s->common.job.co); in backup_block_copy_callback()
144 job_enter(&s->common.job); in backup_block_copy_callback()
156 job->bg_bcs_call = s = block_copy_async(job->bcs, 0, in backup_loop()
157 QEMU_ALIGN_UP(job->len, job->cluster_size), in backup_loop()
158 job->perf.max_workers, job->perf.max_chunk, in backup_loop()
162 !job_is_cancelled(&job->common.job)) in backup_loop()
164 job_yield(&job->common.job); in backup_loop()
168 assert(job_is_cancelled(&job->common.job)); in backup_loop()
174 job->wait = true; in backup_loop()
181 if (job_is_cancelled(&job->common.job) || in backup_loop()
190 * Job is not cancelled but only block-copy call. This is possible in backup_loop()
191 * after job pause. Now the pause is finished, start new block-copy in backup_loop()
198 /* The only remaining case is failed block-copy call. */ in backup_loop()
202 act = backup_error_action(job, error_is_read, -ret); in backup_loop()
208 * Go to pause prior to starting new block-copy call on the next in backup_loop()
211 job_pause_point(&job->common.job); in backup_loop()
214 /* Proceed to new block-copy call to retry. */ in backup_loop()
225 job->bg_bcs_call = NULL; in backup_loop()
232 BdrvDirtyBitmap *bcs_bitmap = block_copy_dirty_bitmap(job->bcs); in backup_init_bcs_bitmap()
234 if (job->sync_mode == MIRROR_SYNC_MODE_BITMAP) { in backup_init_bcs_bitmap()
236 bdrv_dirty_bitmap_merge_internal(bcs_bitmap, job->sync_bitmap, NULL, in backup_init_bcs_bitmap()
238 } else if (job->sync_mode == MIRROR_SYNC_MODE_TOP) { in backup_init_bcs_bitmap()
243 block_copy_set_skip_unallocated(job->bcs, true); in backup_init_bcs_bitmap()
247 job_progress_set_remaining(&job->common.job, estimate); in backup_init_bcs_bitmap()
257 if (s->sync_mode == MIRROR_SYNC_MODE_TOP) { in backup_run()
261 for (offset = 0; offset < s->len; ) { in backup_run()
263 return -ECANCELED; in backup_run()
269 return -ECANCELED; in backup_run()
274 ret = block_copy_reset_unallocated(s->bcs, offset, &count); in backup_run()
282 block_copy_set_skip_unallocated(s->bcs, false); in backup_run()
285 if (s->sync_mode == MIRROR_SYNC_MODE_NONE) { in backup_run()
308 if (s->bg_bcs_call && !block_copy_call_finished(s->bg_bcs_call)) { in backup_pause()
309 block_copy_call_cancel(s->bg_bcs_call); in backup_pause()
310 s->wait = true; in backup_pause()
321 * don't yet have s->bcs. in backup_set_speed()
323 if (s->bcs) { in backup_set_speed()
324 block_copy_set_speed(s->bcs, speed); in backup_set_speed()
325 if (s->bg_bcs_call) { in backup_set_speed()
326 block_copy_kick(s->bg_bcs_call); in backup_set_speed()
335 bdrv_cancel_in_flight(s->target_bs); in backup_cancel()
415 if (perf->max_workers < 1 || perf->max_workers > INT_MAX) { in backup_job_create()
416 error_setg(errp, "max-workers must be between 1 and %d", INT_MAX); in backup_job_create()
420 if (perf->max_chunk < 0) { in backup_job_create()
421 error_setg(errp, "max-chunk must be zero (which means no limit) or " in backup_job_create()
442 error_setg_errno(errp, -len, "Unable to get length for '%s'", in backup_job_create()
450 error_setg_errno(errp, -target_len, "Unable to get length for '%s'", in backup_job_create()
461 perf->min_cluster_size, &bcs, errp); in backup_job_create()
468 if (perf->max_chunk && perf->max_chunk < cluster_size) { in backup_job_create()
469 error_setg(errp, "Required max-chunk (%" PRIi64 ") is less than backup " in backup_job_create()
470 "cluster size (%" PRIi64 ")", perf->max_chunk, cluster_size); in backup_job_create()
474 /* job->len is fixed, so we can't allow resize */ in backup_job_create()
482 job->cbw = cbw; in backup_job_create()
483 job->source_bs = bs; in backup_job_create()
484 job->target_bs = target; in backup_job_create()
485 job->on_source_error = on_source_error; in backup_job_create()
486 job->on_target_error = on_target_error; in backup_job_create()
487 job->sync_mode = sync_mode; in backup_job_create()
488 job->sync_bitmap = sync_bitmap; in backup_job_create()
489 job->bitmap_mode = bitmap_mode; in backup_job_create()
490 job->bcs = bcs; in backup_job_create()
491 job->cluster_size = cluster_size; in backup_job_create()
492 job->len = len; in backup_job_create()
493 job->perf = *perf; in backup_job_create()
495 block_copy_set_copy_opts(bcs, perf->use_copy_range, compress); in backup_job_create()
496 block_copy_set_progress_meter(bcs, &job->common.job.progress); in backup_job_create()
499 /* Required permissions are taken by copy-before-write filter target */ in backup_job_create()
501 block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL, in backup_job_create()
505 return &job->common; in backup_job_create()