Lines Matching refs:op

156         MirrorOp *op;  in mirror_wait_on_conflicts()  local
158 QTAILQ_FOREACH(op, &s->ops_in_flight, next) { in mirror_wait_on_conflicts()
159 uint64_t op_start_chunk = op->offset / s->granularity; in mirror_wait_on_conflicts()
160 uint64_t op_nb_chunks = DIV_ROUND_UP(op->offset + op->bytes, in mirror_wait_on_conflicts()
164 if (op == self) { in mirror_wait_on_conflicts()
177 if (op->waiting_for_op) { in mirror_wait_on_conflicts()
181 self->waiting_for_op = op; in mirror_wait_on_conflicts()
184 qemu_co_queue_wait(&op->waiting_requests, NULL); in mirror_wait_on_conflicts()
196 static void coroutine_fn mirror_iteration_done(MirrorOp *op, int ret) in mirror_iteration_done() argument
198 MirrorBlockJob *s = op->s; in mirror_iteration_done()
203 trace_mirror_iteration_done(s, op->offset, op->bytes, ret); in mirror_iteration_done()
206 s->bytes_in_flight -= op->bytes; in mirror_iteration_done()
207 iov = op->qiov.iov; in mirror_iteration_done()
208 for (i = 0; i < op->qiov.niov; i++) { in mirror_iteration_done()
214 chunk_num = op->offset / s->granularity; in mirror_iteration_done()
215 nb_chunks = DIV_ROUND_UP(op->bytes, s->granularity); in mirror_iteration_done()
218 QTAILQ_REMOVE(&s->ops_in_flight, op, next); in mirror_iteration_done()
224 job_progress_update(&s->common.job, op->bytes); in mirror_iteration_done()
227 qemu_iovec_destroy(&op->qiov); in mirror_iteration_done()
229 qemu_co_queue_restart_all(&op->waiting_requests); in mirror_iteration_done()
230 g_free(op); in mirror_iteration_done()
233 static void coroutine_fn mirror_write_complete(MirrorOp *op, int ret) in mirror_write_complete() argument
235 MirrorBlockJob *s = op->s; in mirror_write_complete()
240 bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset, op->bytes); in mirror_write_complete()
247 mirror_iteration_done(op, ret); in mirror_write_complete()
250 static void coroutine_fn mirror_read_complete(MirrorOp *op, int ret) in mirror_read_complete() argument
252 MirrorBlockJob *s = op->s; in mirror_read_complete()
257 bdrv_set_dirty_bitmap(s->dirty_bitmap, op->offset, op->bytes); in mirror_read_complete()
263 mirror_iteration_done(op, ret); in mirror_read_complete()
267 ret = blk_co_pwritev(s->target, op->offset, op->qiov.size, &op->qiov, 0); in mirror_read_complete()
268 mirror_write_complete(op, ret); in mirror_read_complete()
318 MirrorOp *op; in mirror_wait_for_free_in_flight_slot() local
320 QTAILQ_FOREACH(op, &s->ops_in_flight, next) { in mirror_wait_for_free_in_flight_slot()
330 if (!op->is_pseudo_op && op->is_in_flight && !op->is_active_write) { in mirror_wait_for_free_in_flight_slot()
331 qemu_co_queue_wait(&op->waiting_requests, NULL); in mirror_wait_for_free_in_flight_slot()
348 MirrorOp *op = opaque; in mirror_co_read() local
349 MirrorBlockJob *s = op->s; in mirror_co_read()
357 op->bytes = MIN(s->buf_size, MIN(max_bytes, op->bytes)); in mirror_co_read()
358 assert(op->bytes); in mirror_co_read()
359 assert(op->bytes < BDRV_REQUEST_MAX_BYTES); in mirror_co_read()
360 *op->bytes_handled = op->bytes; in mirror_co_read()
363 *op->bytes_handled += mirror_cow_align(s, &op->offset, &op->bytes); in mirror_co_read()
366 assert(*op->bytes_handled <= UINT_MAX); in mirror_co_read()
367 assert(op->bytes <= s->buf_size); in mirror_co_read()
371 assert(QEMU_IS_ALIGNED(op->offset, s->granularity)); in mirror_co_read()
373 assert(QEMU_IS_ALIGNED(op->bytes, BDRV_SECTOR_SIZE)); in mirror_co_read()
374 nb_chunks = DIV_ROUND_UP(op->bytes, s->granularity); in mirror_co_read()
377 trace_mirror_yield_in_flight(s, op->offset, s->in_flight); in mirror_co_read()
384 qemu_iovec_init(&op->qiov, nb_chunks); in mirror_co_read()
387 size_t remaining = op->bytes - op->qiov.size; in mirror_co_read()
391 qemu_iovec_add(&op->qiov, buf, MIN(s->granularity, remaining)); in mirror_co_read()
396 s->bytes_in_flight += op->bytes; in mirror_co_read()
397 op->is_in_flight = true; in mirror_co_read()
398 trace_mirror_one_iteration(s, op->offset, op->bytes); in mirror_co_read()
401 ret = bdrv_co_preadv(s->mirror_top_bs->backing, op->offset, op->bytes, in mirror_co_read()
402 &op->qiov, 0); in mirror_co_read()
404 mirror_read_complete(op, ret); in mirror_co_read()
409 MirrorOp *op = opaque; in mirror_co_zero() local
412 op->s->in_flight++; in mirror_co_zero()
413 op->s->bytes_in_flight += op->bytes; in mirror_co_zero()
414 *op->bytes_handled = op->bytes; in mirror_co_zero()
415 op->is_in_flight = true; in mirror_co_zero()
417 ret = blk_co_pwrite_zeroes(op->s->target, op->offset, op->bytes, in mirror_co_zero()
418 op->s->unmap ? BDRV_REQ_MAY_UNMAP : 0); in mirror_co_zero()
419 mirror_write_complete(op, ret); in mirror_co_zero()
424 MirrorOp *op = opaque; in mirror_co_discard() local
427 op->s->in_flight++; in mirror_co_discard()
428 op->s->bytes_in_flight += op->bytes; in mirror_co_discard()
429 *op->bytes_handled = op->bytes; in mirror_co_discard()
430 op->is_in_flight = true; in mirror_co_discard()
432 ret = blk_co_pdiscard(op->s->target, op->offset, op->bytes); in mirror_co_discard()
433 mirror_write_complete(op, ret); in mirror_co_discard()
439 MirrorOp *op; in mirror_perform() local
443 op = g_new(MirrorOp, 1); in mirror_perform()
444 *op = (MirrorOp){ in mirror_perform()
450 qemu_co_queue_init(&op->waiting_requests); in mirror_perform()
454 co = qemu_coroutine_create(mirror_co_read, op); in mirror_perform()
457 co = qemu_coroutine_create(mirror_co_zero, op); in mirror_perform()
460 co = qemu_coroutine_create(mirror_co_discard, op); in mirror_perform()
465 op->co = co; in mirror_perform()
467 QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next); in mirror_perform()
1447 MirrorOp *op; in active_write_prepare() local
1451 op = g_new(MirrorOp, 1); in active_write_prepare()
1452 *op = (MirrorOp){ in active_write_prepare()
1460 qemu_co_queue_init(&op->waiting_requests); in active_write_prepare()
1461 QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next); in active_write_prepare()
1478 mirror_wait_on_conflicts(op, s, offset, bytes); in active_write_prepare()
1482 return op; in active_write_prepare()
1485 static void coroutine_fn GRAPH_RDLOCK active_write_settle(MirrorOp *op) in active_write_settle() argument
1487 uint64_t start_chunk = op->offset / op->s->granularity; in active_write_settle()
1488 uint64_t end_chunk = DIV_ROUND_UP(op->offset + op->bytes, in active_write_settle()
1489 op->s->granularity); in active_write_settle()
1491 if (!--op->s->in_active_write_counter && in active_write_settle()
1492 qatomic_read(&op->s->actively_synced)) { in active_write_settle()
1493 BdrvChild *source = op->s->mirror_top_bs->backing; in active_write_settle()
1502 assert(!bdrv_get_dirty_count(op->s->dirty_bitmap)); in active_write_settle()
1505 bitmap_clear(op->s->in_flight_bitmap, start_chunk, end_chunk - start_chunk); in active_write_settle()
1506 QTAILQ_REMOVE(&op->s->ops_in_flight, op, next); in active_write_settle()
1507 qemu_co_queue_restart_all(&op->waiting_requests); in active_write_settle()
1508 g_free(op); in active_write_settle()
1530 MirrorOp *op = NULL; in bdrv_mirror_top_do_write() local
1535 op = active_write_prepare(s->job, offset, bytes); in bdrv_mirror_top_do_write()
1570 active_write_settle(op); in bdrv_mirror_top_do_write()