]>
Commit | Line | Data |
---|---|---|
cbf9030a DM |
1 | Index: new/block/backup.c |
2 | =================================================================== | |
24bb7da3 DM |
3 | --- new.orig/block/backup.c 2014-11-20 07:55:31.000000000 +0100 |
4 | +++ new/block/backup.c 2014-11-20 08:56:23.000000000 +0100 | |
cbf9030a DM |
5 | @@ -39,6 +39,7 @@ |
6 | BlockDriverState *target; | |
7 | MirrorSyncMode sync_mode; | |
8 | RateLimit limit; | |
9 | + BackupDumpFunc *dump_cb; | |
10 | BlockdevOnError on_source_error; | |
11 | BlockdevOnError on_target_error; | |
12 | CoRwlock flush_rwlock; | |
38f36829 | 13 | @@ -136,14 +137,21 @@ |
5cf8ed03 | 14 | goto out; |
cbf9030a DM |
15 | } |
16 | ||
5cf8ed03 | 17 | + int64_t start_sec = start * BACKUP_SECTORS_PER_CLUSTER; |
cbf9030a DM |
18 | if (buffer_is_zero(iov.iov_base, iov.iov_len)) { |
19 | - ret = bdrv_co_write_zeroes(job->target, | |
38f36829 DM |
20 | - start * BACKUP_SECTORS_PER_CLUSTER, |
21 | - n, BDRV_REQ_MAY_UNMAP); | |
cbf9030a | 22 | + if (job->dump_cb) { |
5cf8ed03 DM |
23 | + ret = job->dump_cb(job->common.opaque, job->target, start_sec, n, NULL); |
24 | + } | |
25 | + if (job->target) { | |
38f36829 | 26 | + ret = bdrv_co_write_zeroes(job->target, start_sec, n, BDRV_REQ_MAY_UNMAP); |
cbf9030a DM |
27 | + } |
28 | } else { | |
29 | - ret = bdrv_co_writev(job->target, | |
30 | - start * BACKUP_SECTORS_PER_CLUSTER, n, | |
31 | - &bounce_qiov); | |
32 | + if (job->dump_cb) { | |
5cf8ed03 DM |
33 | + ret = job->dump_cb(job->common.opaque, job->target, start_sec, n, bounce_buffer); |
34 | + } | |
35 | + if (job->target) { | |
36 | + ret = bdrv_co_writev(job->target, start_sec, n, &bounce_qiov); | |
cbf9030a DM |
37 | + } |
38 | } | |
39 | if (ret < 0) { | |
40 | trace_backup_do_cow_write_fail(job, start, ret); | |
38f36829 | 41 | @@ -205,7 +213,9 @@ |
cbf9030a DM |
42 | { |
43 | BackupBlockJob *s = container_of(job, BackupBlockJob, common); | |
44 | ||
45 | - bdrv_iostatus_reset(s->target); | |
46 | + if (s->target) { | |
47 | + bdrv_iostatus_reset(s->target); | |
48 | + } | |
49 | } | |
50 | ||
51 | static const BlockJobDriver backup_job_driver = { | |
38f36829 | 52 | @@ -221,9 +231,11 @@ |
cbf9030a DM |
53 | if (read) { |
54 | return block_job_error_action(&job->common, job->common.bs, | |
55 | job->on_source_error, true, error); | |
56 | - } else { | |
57 | + } else if (job->target) { | |
58 | return block_job_error_action(&job->common, job->target, | |
59 | job->on_target_error, false, error); | |
60 | + } else { | |
e549ff74 | 61 | + return BLOCK_ERROR_ACTION_REPORT; |
cbf9030a DM |
62 | } |
63 | } | |
64 | ||
24bb7da3 | 65 | @@ -264,9 +276,11 @@ |
cbf9030a DM |
66 | |
67 | job->bitmap = hbitmap_alloc(end, 0); | |
68 | ||
69 | - bdrv_set_enable_write_cache(target, true); | |
70 | - bdrv_set_on_error(target, on_target_error, on_target_error); | |
71 | - bdrv_iostatus_enable(target); | |
72 | + if (target) { | |
73 | + bdrv_set_enable_write_cache(target, true); | |
74 | + bdrv_set_on_error(target, on_target_error, on_target_error); | |
75 | + bdrv_iostatus_enable(target); | |
76 | + } | |
77 | ||
78 | bdrv_add_before_write_notifier(bs, &before_write); | |
79 | ||
24bb7da3 | 80 | @@ -359,7 +373,9 @@ |
cbf9030a DM |
81 | |
82 | hbitmap_free(job->bitmap); | |
83 | ||
84 | - bdrv_iostatus_disable(target); | |
cbf9030a DM |
85 | + if (target) { |
86 | + bdrv_iostatus_disable(target); | |
cbf9030a DM |
87 | + } |
88 | ||
24bb7da3 DM |
89 | data = g_malloc(sizeof(*data)); |
90 | data->ret = ret; | |
91 | @@ -370,13 +386,15 @@ | |
cbf9030a DM |
92 | int64_t speed, MirrorSyncMode sync_mode, |
93 | BlockdevOnError on_source_error, | |
94 | BlockdevOnError on_target_error, | |
95 | + BackupDumpFunc *dump_cb, | |
24bb7da3 | 96 | BlockCompletionFunc *cb, void *opaque, |
bd240f3b | 97 | + bool paused, |
cbf9030a DM |
98 | Error **errp) |
99 | { | |
100 | int64_t len; | |
101 | ||
102 | assert(bs); | |
103 | - assert(target); | |
104 | + assert(target || dump_cb); | |
105 | assert(cb); | |
106 | ||
107 | if ((on_source_error == BLOCKDEV_ON_ERROR_STOP || | |
24bb7da3 | 108 | @@ -399,10 +417,12 @@ |
cbf9030a DM |
109 | return; |
110 | } | |
111 | ||
112 | + job->dump_cb = dump_cb; | |
113 | job->on_source_error = on_source_error; | |
114 | job->on_target_error = on_target_error; | |
115 | job->target = target; | |
bd240f3b DM |
116 | job->sync_mode = sync_mode; |
117 | + job->common.paused = paused; | |
118 | job->common.len = len; | |
119 | job->common.co = qemu_coroutine_create(backup_run); | |
120 | qemu_coroutine_enter(job->common.co, job); | |
cbf9030a DM |
121 | Index: new/blockdev.c |
122 | =================================================================== | |
24bb7da3 DM |
123 | --- new.orig/blockdev.c 2014-11-20 07:55:31.000000000 +0100 |
124 | +++ new/blockdev.c 2014-11-20 08:48:02.000000000 +0100 | |
125 | @@ -2223,7 +2223,7 @@ | |
126 | bdrv_set_aio_context(target_bs, aio_context); | |
cbf9030a DM |
127 | |
128 | backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error, | |
129 | - block_job_cb, bs, &local_err); | |
bd240f3b | 130 | + NULL, block_job_cb, bs, false, &local_err); |
cbf9030a DM |
131 | if (local_err != NULL) { |
132 | bdrv_unref(target_bs); | |
133 | error_propagate(errp, local_err); | |
134 | Index: new/include/block/block_int.h | |
135 | =================================================================== | |
24bb7da3 DM |
136 | --- new.orig/include/block/block_int.h 2014-11-20 07:55:31.000000000 +0100 |
137 | +++ new/include/block/block_int.h 2014-11-20 08:52:59.000000000 +0100 | |
138 | @@ -57,6 +57,9 @@ | |
38f36829 | 139 | #define BLOCK_OPT_REDUNDANCY "redundancy" |
e549ff74 | 140 | #define BLOCK_OPT_NOCOW "nocow" |
cbf9030a DM |
141 | |
142 | +typedef int BackupDumpFunc(void *opaque, BlockDriverState *bs, | |
5cf8ed03 | 143 | + int64_t sector_num, int n_sectors, unsigned char *buf); |
cbf9030a DM |
144 | + |
145 | typedef struct BdrvTrackedRequest { | |
146 | BlockDriverState *bs; | |
38f36829 | 147 | int64_t offset; |
24bb7da3 | 148 | @@ -583,7 +586,9 @@ |
cbf9030a DM |
149 | int64_t speed, MirrorSyncMode sync_mode, |
150 | BlockdevOnError on_source_error, | |
151 | BlockdevOnError on_target_error, | |
152 | + BackupDumpFunc *dump_cb, | |
24bb7da3 | 153 | BlockCompletionFunc *cb, void *opaque, |
bd240f3b | 154 | + bool paused, |
cbf9030a DM |
155 | Error **errp); |
156 | ||
24bb7da3 | 157 | void blk_dev_change_media_cb(BlockBackend *blk, bool load); |