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 --- |