mirror.c (0db832f42e445398b2815cd740e9cd915e7dd644) mirror.c (12fa4af61fb2a08b156134c3b6717534c637c995)
1/*
2 * Image mirroring
3 *
4 * Copyright Red Hat, Inc. 2012
5 *
6 * Authors:
7 * Paolo Bonzini <pbonzini@redhat.com>
8 *

--- 489 unchanged lines hidden (view full) ---

498static void mirror_exit(BlockJob *job, void *opaque)
499{
500 MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
501 MirrorExitData *data = opaque;
502 AioContext *replace_aio_context = NULL;
503 BlockDriverState *src = s->source;
504 BlockDriverState *target_bs = blk_bs(s->target);
505 BlockDriverState *mirror_top_bs = s->mirror_top_bs;
1/*
2 * Image mirroring
3 *
4 * Copyright Red Hat, Inc. 2012
5 *
6 * Authors:
7 * Paolo Bonzini <pbonzini@redhat.com>
8 *

--- 489 unchanged lines hidden (view full) ---

498static void mirror_exit(BlockJob *job, void *opaque)
499{
500 MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
501 MirrorExitData *data = opaque;
502 AioContext *replace_aio_context = NULL;
503 BlockDriverState *src = s->source;
504 BlockDriverState *target_bs = blk_bs(s->target);
505 BlockDriverState *mirror_top_bs = s->mirror_top_bs;
506 Error *local_err = NULL;
506
507 /* Make sure that the source BDS doesn't go away before we called
508 * block_job_completed(). */
509 bdrv_ref(src);
510 bdrv_ref(mirror_top_bs);
511
512 /* We don't access the source any more. Dropping any WRITE/RESIZE is
513 * required before it could become a backing file of target_bs. */
514 bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL,
515 &error_abort);
516 if (s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
517 BlockDriverState *backing = s->is_none_mode ? src : s->base;
518 if (backing_bs(target_bs) != backing) {
507
508 /* Make sure that the source BDS doesn't go away before we called
509 * block_job_completed(). */
510 bdrv_ref(src);
511 bdrv_ref(mirror_top_bs);
512
513 /* We don't access the source any more. Dropping any WRITE/RESIZE is
514 * required before it could become a backing file of target_bs. */
515 bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL,
516 &error_abort);
517 if (s->backing_mode == MIRROR_SOURCE_BACKING_CHAIN) {
518 BlockDriverState *backing = s->is_none_mode ? src : s->base;
519 if (backing_bs(target_bs) != backing) {
519 bdrv_set_backing_hd(target_bs, backing);
520 bdrv_set_backing_hd(target_bs, backing, &local_err);
521 if (local_err) {
522 error_report_err(local_err);
523 data->ret = -EPERM;
524 }
520 }
521 }
522
523 if (s->to_replace) {
524 replace_aio_context = bdrv_get_aio_context(s->to_replace);
525 aio_context_acquire(replace_aio_context);
526 }
527

--- 752 unchanged lines hidden ---
525 }
526 }
527
528 if (s->to_replace) {
529 replace_aio_context = bdrv_get_aio_context(s->to_replace);
530 aio_context_acquire(replace_aio_context);
531 }
532

--- 752 unchanged lines hidden ---