Lines Matching +full:block +full:- +full:copy
10 * See the COPYING.LIB file in the top-level directory.
16 #include "block/block_int.h"
17 #include "block/blockjob_int.h"
21 #include "sysemu/block-backend.h"
22 #include "block/copy-on-read.h"
26 * Maximum chunk size to feed to copy-on-read. This should be
67 unfiltered_bs = bdrv_skip_filters(s->target_bs); in stream_prepare()
72 bdrv_cor_filter_drop(s->cor_filter_bs); in stream_prepare()
73 s->cor_filter_bs = NULL; in stream_prepare()
90 base = bdrv_filter_or_cow_bs(s->above_base); in stream_prepare()
97 base_id = s->backing_file_str ?: unfiltered_base->filename; in stream_prepare()
98 if (unfiltered_base->drv) { in stream_prepare()
99 if (s->backing_mask_protocol && in stream_prepare()
100 unfiltered_base->drv->protocol_name) { in stream_prepare()
103 base_fmt = unfiltered_base->drv->format_name; in stream_prepare()
120 ret = -EPERM; in stream_prepare()
138 if (s->cor_filter_bs) { in stream_clean()
139 bdrv_cor_filter_drop(s->cor_filter_bs); in stream_clean()
140 s->cor_filter_bs = NULL; in stream_clean()
143 blk_unref(s->blk); in stream_clean()
144 s->blk = NULL; in stream_clean()
146 /* Reopen the image back in read-only mode if necessary */ in stream_clean()
147 if (s->bs_read_only) { in stream_clean()
148 /* Give up write permissions before making it read-only */ in stream_clean()
149 bdrv_reopen_set_read_only(s->target_bs, true, NULL); in stream_clean()
152 g_free(s->backing_file_str); in stream_clean()
159 int64_t len = -1; in stream_run()
165 unfiltered_bs = bdrv_skip_filters(s->target_bs); in stream_run()
166 if (unfiltered_bs == s->base_overlay) { in stream_run()
171 len = bdrv_co_getlength(s->target_bs); in stream_run()
176 job_progress_set_remaining(&s->common.job, len); in stream_run()
179 bool copy; in stream_run() local
180 int ret = -1; in stream_run()
185 block_job_ratelimit_sleep(&s->common); in stream_run()
186 if (job_is_cancelled(&s->common.job)) { in stream_run()
190 copy = false; in stream_run()
195 /* Allocated in the top, no need to copy. */ in stream_run()
198 * Copy if allocated in the intermediate images. Limit to the in stream_run()
199 * known-unallocated area [offset, offset+n*BDRV_SECTOR_SIZE). in stream_run()
202 s->base_overlay, true, in stream_run()
206 n = len - offset; in stream_run()
209 copy = (ret > 0); in stream_run()
213 if (copy) { in stream_run()
214 ret = stream_populate(s->blk, offset, n); in stream_run()
218 block_job_error_action(&s->common, s->on_error, true, -ret); in stream_run()
232 job_progress_update(&s->common.job, n); in stream_run()
233 if (copy) { in stream_run()
234 block_job_ratelimit_processed_bytes(&s->common, n); in stream_run()
289 assert(!bottom->drv->is_filter); in stream_start()
295 base->node_name, bs->node_name); in stream_start()
313 /* Make sure that the image is opened in read-write mode */ in stream_start()
323 /* failure, or cor-filter will hold the chain */ in stream_start()
335 qdict_put_str(opts, "driver", "copy-on-read"); in stream_start()
338 qdict_put_str(opts, "bottom", base_overlay->node_name); in stream_start()
340 qdict_put_str(opts, "node-name", filter_node_name); in stream_start()
349 cor_filter_bs->implicit = true; in stream_start()
359 s->blk = blk_new_with_bs(cor_filter_bs, BLK_PERM_CONSISTENT_READ, in stream_start()
361 if (!s->blk) { in stream_start()
368 blk_set_disable_request_queuing(s->blk, true); in stream_start()
369 blk_set_allow_aio_context_change(s->blk, true); in stream_start()
377 if (block_job_add_bdrv(&s->common, "active node", bs, 0, in stream_start()
383 /* Block all intermediate nodes between bs and base, because they will in stream_start()
385 * every block only once, assuming that it doesn't change, so forbid writes in stream_start()
388 * due to parallel block jobs running. in stream_start()
390 * bdrv_reopen_set_read_only() due to parallel block jobs running. in stream_start()
396 ret = block_job_add_bdrv(&s->common, "intermediate node", iter, 0, in stream_start()
405 s->base_overlay = base_overlay; in stream_start()
406 s->above_base = above_base; in stream_start()
407 s->backing_file_str = g_strdup(backing_file_str); in stream_start()
408 s->backing_mask_protocol = backing_mask_protocol; in stream_start()
409 s->cor_filter_bs = cor_filter_bs; in stream_start()
410 s->target_bs = bs; in stream_start()
411 s->bs_read_only = bs_read_only; in stream_start()
413 s->on_error = on_error; in stream_start()
415 job_start(&s->common.job); in stream_start()
420 job_early_fail(&s->common.job); in stream_start()