]>
Commit | Line | Data |
---|---|---|
cbf9030a DM |
1 | Index: new/block/backup.c |
2 | =================================================================== | |
5cf8ed03 DM |
3 | --- new.orig/block/backup.c 2013-12-05 08:18:53.000000000 +0100 |
4 | +++ new/block/backup.c 2013-12-05 13:16:21.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; | |
5cf8ed03 DM |
13 | @@ -136,13 +137,21 @@ |
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, | |
20 | - start * BACKUP_SECTORS_PER_CLUSTER, n); | |
21 | + if (job->dump_cb) { | |
5cf8ed03 DM |
22 | + ret = job->dump_cb(job->common.opaque, job->target, start_sec, n, NULL); |
23 | + } | |
24 | + if (job->target) { | |
25 | + ret = bdrv_co_write_zeroes(job->target, start_sec, n); | |
cbf9030a DM |
26 | + } |
27 | } else { | |
28 | - ret = bdrv_co_writev(job->target, | |
29 | - start * BACKUP_SECTORS_PER_CLUSTER, n, | |
30 | - &bounce_qiov); | |
31 | + if (job->dump_cb) { | |
5cf8ed03 DM |
32 | + ret = job->dump_cb(job->common.opaque, job->target, start_sec, n, bounce_buffer); |
33 | + } | |
34 | + if (job->target) { | |
35 | + ret = bdrv_co_writev(job->target, start_sec, n, &bounce_qiov); | |
cbf9030a DM |
36 | + } |
37 | } | |
38 | if (ret < 0) { | |
39 | trace_backup_do_cow_write_fail(job, start, ret); | |
40 | @@ -199,7 +208,9 @@ | |
41 | { | |
42 | BackupBlockJob *s = container_of(job, BackupBlockJob, common); | |
43 | ||
44 | - bdrv_iostatus_reset(s->target); | |
45 | + if (s->target) { | |
46 | + bdrv_iostatus_reset(s->target); | |
47 | + } | |
48 | } | |
49 | ||
50 | static const BlockJobDriver backup_job_driver = { | |
51 | @@ -215,9 +226,11 @@ | |
52 | if (read) { | |
53 | return block_job_error_action(&job->common, job->common.bs, | |
54 | job->on_source_error, true, error); | |
55 | - } else { | |
56 | + } else if (job->target) { | |
57 | return block_job_error_action(&job->common, job->target, | |
58 | job->on_target_error, false, error); | |
59 | + } else { | |
60 | + return BDRV_ACTION_REPORT; | |
61 | } | |
62 | } | |
63 | ||
64 | @@ -242,9 +255,11 @@ | |
65 | ||
66 | job->bitmap = hbitmap_alloc(end, 0); | |
67 | ||
68 | - bdrv_set_enable_write_cache(target, true); | |
69 | - bdrv_set_on_error(target, on_target_error, on_target_error); | |
70 | - bdrv_iostatus_enable(target); | |
71 | + if (target) { | |
72 | + bdrv_set_enable_write_cache(target, true); | |
73 | + bdrv_set_on_error(target, on_target_error, on_target_error); | |
74 | + bdrv_iostatus_enable(target); | |
75 | + } | |
76 | ||
77 | bdrv_add_before_write_notifier(bs, &before_write); | |
78 | ||
79 | @@ -337,8 +352,10 @@ | |
80 | ||
81 | hbitmap_free(job->bitmap); | |
82 | ||
83 | - bdrv_iostatus_disable(target); | |
84 | - bdrv_unref(target); | |
85 | + if (target) { | |
86 | + bdrv_iostatus_disable(target); | |
87 | + bdrv_unref(target); | |
88 | + } | |
89 | ||
90 | block_job_completed(&job->common, ret); | |
91 | } | |
bd240f3b | 92 | @@ -347,13 +364,15 @@ |
cbf9030a DM |
93 | int64_t speed, MirrorSyncMode sync_mode, |
94 | BlockdevOnError on_source_error, | |
95 | BlockdevOnError on_target_error, | |
96 | + BackupDumpFunc *dump_cb, | |
97 | BlockDriverCompletionFunc *cb, void *opaque, | |
bd240f3b | 98 | + bool paused, |
cbf9030a DM |
99 | Error **errp) |
100 | { | |
101 | int64_t len; | |
102 | ||
103 | assert(bs); | |
104 | - assert(target); | |
105 | + assert(target || dump_cb); | |
106 | assert(cb); | |
107 | ||
108 | if ((on_source_error == BLOCKDEV_ON_ERROR_STOP || | |
bd240f3b | 109 | @@ -376,10 +395,12 @@ |
cbf9030a DM |
110 | return; |
111 | } | |
112 | ||
113 | + job->dump_cb = dump_cb; | |
114 | job->on_source_error = on_source_error; | |
115 | job->on_target_error = on_target_error; | |
116 | job->target = target; | |
bd240f3b DM |
117 | job->sync_mode = sync_mode; |
118 | + job->common.paused = paused; | |
119 | job->common.len = len; | |
120 | job->common.co = qemu_coroutine_create(backup_run); | |
121 | qemu_coroutine_enter(job->common.co, job); | |
cbf9030a DM |
122 | Index: new/blockdev.c |
123 | =================================================================== | |
5cf8ed03 DM |
124 | --- new.orig/blockdev.c 2013-12-05 08:18:53.000000000 +0100 |
125 | +++ new/blockdev.c 2013-12-05 13:07:43.000000000 +0100 | |
cbf9030a DM |
126 | @@ -1932,7 +1932,7 @@ |
127 | } | |
128 | ||
129 | backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error, | |
130 | - block_job_cb, bs, &local_err); | |
bd240f3b | 131 | + NULL, block_job_cb, bs, false, &local_err); |
cbf9030a DM |
132 | if (local_err != NULL) { |
133 | bdrv_unref(target_bs); | |
134 | error_propagate(errp, local_err); | |
135 | Index: new/include/block/block_int.h | |
136 | =================================================================== | |
5cf8ed03 DM |
137 | --- new.orig/include/block/block_int.h 2013-12-05 08:18:53.000000000 +0100 |
138 | +++ new/include/block/block_int.h 2013-12-05 13:16:53.000000000 +0100 | |
cbf9030a DM |
139 | @@ -54,6 +54,9 @@ |
140 | #define BLOCK_OPT_LAZY_REFCOUNTS "lazy_refcounts" | |
141 | #define BLOCK_OPT_ADAPTER_TYPE "adapter_type" | |
142 | ||
143 | +typedef int BackupDumpFunc(void *opaque, BlockDriverState *bs, | |
5cf8ed03 | 144 | + int64_t sector_num, int n_sectors, unsigned char *buf); |
cbf9030a DM |
145 | + |
146 | typedef struct BdrvTrackedRequest { | |
147 | BlockDriverState *bs; | |
148 | int64_t sector_num; | |
bd240f3b | 149 | @@ -427,7 +430,9 @@ |
cbf9030a DM |
150 | int64_t speed, MirrorSyncMode sync_mode, |
151 | BlockdevOnError on_source_error, | |
152 | BlockdevOnError on_target_error, | |
153 | + BackupDumpFunc *dump_cb, | |
154 | BlockDriverCompletionFunc *cb, void *opaque, | |
bd240f3b | 155 | + bool paused, |
cbf9030a DM |
156 | Error **errp); |
157 | ||
bd240f3b | 158 | #endif /* BLOCK_INT_H */ |