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