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

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

838 .instance_size = sizeof(MirrorBlockJob),
839 .job_type = BLOCK_JOB_TYPE_COMMIT,
840 .set_speed = mirror_set_speed,
841 .complete = mirror_complete,
842 .pause = mirror_pause,
843 .attached_aio_context = mirror_attached_aio_context,
844};
845
1/*
2 * Image mirroring
3 *
4 * Copyright Red Hat, Inc. 2012
5 *
6 * Authors:
7 * Paolo Bonzini <pbonzini@redhat.com>
8 *

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

838 .instance_size = sizeof(MirrorBlockJob),
839 .job_type = BLOCK_JOB_TYPE_COMMIT,
840 .set_speed = mirror_set_speed,
841 .complete = mirror_complete,
842 .pause = mirror_pause,
843 .attached_aio_context = mirror_attached_aio_context,
844};
845
846static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
847 const char *replaces,
846static void mirror_start_job(const char *job_id, BlockDriverState *bs,
847 BlockDriverState *target, const char *replaces,
848 int64_t speed, uint32_t granularity,
849 int64_t buf_size,
850 BlockMirrorBackingMode backing_mode,
851 BlockdevOnError on_source_error,
852 BlockdevOnError on_target_error,
853 bool unmap,
854 BlockCompletionFunc *cb,
855 void *opaque, Error **errp,

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

868 error_setg(errp, "Invalid parameter 'buf-size'");
869 return;
870 }
871
872 if (buf_size == 0) {
873 buf_size = DEFAULT_MIRROR_BUF_SIZE;
874 }
875
848 int64_t speed, uint32_t granularity,
849 int64_t buf_size,
850 BlockMirrorBackingMode backing_mode,
851 BlockdevOnError on_source_error,
852 BlockdevOnError on_target_error,
853 bool unmap,
854 BlockCompletionFunc *cb,
855 void *opaque, Error **errp,

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

868 error_setg(errp, "Invalid parameter 'buf-size'");
869 return;
870 }
871
872 if (buf_size == 0) {
873 buf_size = DEFAULT_MIRROR_BUF_SIZE;
874 }
875
876 s = block_job_create(NULL, driver, bs, speed, cb, opaque, errp);
876 s = block_job_create(job_id, driver, bs, speed, cb, opaque, errp);
877 if (!s) {
878 return;
879 }
880
881 s->target = blk_new();
882 blk_insert_bs(s->target, target);
883
884 s->replaces = g_strdup(replaces);

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

901
902 bdrv_op_block_all(target, s->common.blocker);
903
904 s->common.co = qemu_coroutine_create(mirror_run);
905 trace_mirror_start(bs, s, s->common.co, opaque);
906 qemu_coroutine_enter(s->common.co, s);
907}
908
877 if (!s) {
878 return;
879 }
880
881 s->target = blk_new();
882 blk_insert_bs(s->target, target);
883
884 s->replaces = g_strdup(replaces);

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

901
902 bdrv_op_block_all(target, s->common.blocker);
903
904 s->common.co = qemu_coroutine_create(mirror_run);
905 trace_mirror_start(bs, s, s->common.co, opaque);
906 qemu_coroutine_enter(s->common.co, s);
907}
908
909void mirror_start(BlockDriverState *bs, BlockDriverState *target,
910 const char *replaces,
909void mirror_start(const char *job_id, BlockDriverState *bs,
910 BlockDriverState *target, const char *replaces,
911 int64_t speed, uint32_t granularity, int64_t buf_size,
912 MirrorSyncMode mode, BlockMirrorBackingMode backing_mode,
913 BlockdevOnError on_source_error,
914 BlockdevOnError on_target_error,
915 bool unmap,
916 BlockCompletionFunc *cb,
917 void *opaque, Error **errp)
918{
919 bool is_none_mode;
920 BlockDriverState *base;
921
922 if (mode == MIRROR_SYNC_MODE_INCREMENTAL) {
923 error_setg(errp, "Sync mode 'incremental' not supported");
924 return;
925 }
926 is_none_mode = mode == MIRROR_SYNC_MODE_NONE;
927 base = mode == MIRROR_SYNC_MODE_TOP ? backing_bs(bs) : NULL;
911 int64_t speed, uint32_t granularity, int64_t buf_size,
912 MirrorSyncMode mode, BlockMirrorBackingMode backing_mode,
913 BlockdevOnError on_source_error,
914 BlockdevOnError on_target_error,
915 bool unmap,
916 BlockCompletionFunc *cb,
917 void *opaque, Error **errp)
918{
919 bool is_none_mode;
920 BlockDriverState *base;
921
922 if (mode == MIRROR_SYNC_MODE_INCREMENTAL) {
923 error_setg(errp, "Sync mode 'incremental' not supported");
924 return;
925 }
926 is_none_mode = mode == MIRROR_SYNC_MODE_NONE;
927 base = mode == MIRROR_SYNC_MODE_TOP ? backing_bs(bs) : NULL;
928 mirror_start_job(bs, target, replaces,
928 mirror_start_job(job_id, bs, target, replaces,
929 speed, granularity, buf_size, backing_mode,
930 on_source_error, on_target_error, unmap, cb, opaque, errp,
931 &mirror_job_driver, is_none_mode, base);
932}
933
934void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
935 int64_t speed,
936 BlockdevOnError on_error,

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

968 error_setg_errno(errp, -ret,
969 "Top image %s is larger than base image %s, and "
970 "resize of base image failed",
971 bs->filename, base->filename);
972 goto error_restore_flags;
973 }
974 }
975
929 speed, granularity, buf_size, backing_mode,
930 on_source_error, on_target_error, unmap, cb, opaque, errp,
931 &mirror_job_driver, is_none_mode, base);
932}
933
934void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
935 int64_t speed,
936 BlockdevOnError on_error,

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

968 error_setg_errno(errp, -ret,
969 "Top image %s is larger than base image %s, and "
970 "resize of base image failed",
971 bs->filename, base->filename);
972 goto error_restore_flags;
973 }
974 }
975
976 mirror_start_job(bs, base, NULL, speed, 0, 0, MIRROR_LEAVE_BACKING_CHAIN,
976 mirror_start_job(NULL, bs, base, NULL, speed, 0, 0,
977 MIRROR_LEAVE_BACKING_CHAIN,
977 on_error, on_error, false, cb, opaque, &local_err,
978 &commit_active_job_driver, false, base);
979 if (local_err) {
980 error_propagate(errp, local_err);
981 goto error_restore_flags;
982 }
983
984 return;
985
986error_restore_flags:
987 /* ignore error and errp for bdrv_reopen, because we want to propagate
988 * the original error */
989 bdrv_reopen(base, orig_base_flags, NULL);
990 return;
991}
978 on_error, on_error, false, cb, opaque, &local_err,
979 &commit_active_job_driver, false, base);
980 if (local_err) {
981 error_propagate(errp, local_err);
982 goto error_restore_flags;
983 }
984
985 return;
986
987error_restore_flags:
988 /* ignore error and errp for bdrv_reopen, because we want to propagate
989 * the original error */
990 bdrv_reopen(base, orig_base_flags, NULL);
991 return;
992}