]>
Commit | Line | Data |
---|---|---|
cbf9030a DM |
1 | Index: new/block/backup.c |
2 | =================================================================== | |
3fe80761 DM |
3 | --- new.orig/block/backup.c 2014-07-16 11:53:56.000000000 +0200 |
4 | +++ new/block/backup.c 2014-07-16 12:01:34.000000000 +0200 | |
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 | ||
38f36829 | 65 | @@ -248,9 +260,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 | ||
38f36829 | 80 | @@ -343,8 +357,10 @@ |
cbf9030a DM |
81 | |
82 | hbitmap_free(job->bitmap); | |
83 | ||
84 | - bdrv_iostatus_disable(target); | |
85 | - bdrv_unref(target); | |
86 | + if (target) { | |
87 | + bdrv_iostatus_disable(target); | |
88 | + bdrv_unref(target); | |
89 | + } | |
90 | ||
91 | block_job_completed(&job->common, ret); | |
92 | } | |
38f36829 | 93 | @@ -353,13 +369,15 @@ |
cbf9030a DM |
94 | int64_t speed, MirrorSyncMode sync_mode, |
95 | BlockdevOnError on_source_error, | |
96 | BlockdevOnError on_target_error, | |
97 | + BackupDumpFunc *dump_cb, | |
98 | BlockDriverCompletionFunc *cb, void *opaque, | |
bd240f3b | 99 | + bool paused, |
cbf9030a DM |
100 | Error **errp) |
101 | { | |
102 | int64_t len; | |
103 | ||
104 | assert(bs); | |
105 | - assert(target); | |
106 | + assert(target || dump_cb); | |
107 | assert(cb); | |
108 | ||
109 | if ((on_source_error == BLOCKDEV_ON_ERROR_STOP || | |
38f36829 | 110 | @@ -382,10 +400,12 @@ |
cbf9030a DM |
111 | return; |
112 | } | |
113 | ||
114 | + job->dump_cb = dump_cb; | |
115 | job->on_source_error = on_source_error; | |
116 | job->on_target_error = on_target_error; | |
117 | job->target = target; | |
bd240f3b DM |
118 | job->sync_mode = sync_mode; |
119 | + job->common.paused = paused; | |
120 | job->common.len = len; | |
121 | job->common.co = qemu_coroutine_create(backup_run); | |
122 | qemu_coroutine_enter(job->common.co, job); | |
cbf9030a DM |
123 | Index: new/blockdev.c |
124 | =================================================================== | |
3fe80761 DM |
125 | --- new.orig/blockdev.c 2014-07-16 11:53:56.000000000 +0200 |
126 | +++ new/blockdev.c 2014-07-16 12:01:34.000000000 +0200 | |
e549ff74 | 127 | @@ -2115,7 +2115,7 @@ |
cbf9030a DM |
128 | } |
129 | ||
130 | backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error, | |
131 | - block_job_cb, bs, &local_err); | |
bd240f3b | 132 | + NULL, block_job_cb, bs, false, &local_err); |
cbf9030a DM |
133 | if (local_err != NULL) { |
134 | bdrv_unref(target_bs); | |
135 | error_propagate(errp, local_err); | |
136 | Index: new/include/block/block_int.h | |
137 | =================================================================== | |
3fe80761 DM |
138 | --- new.orig/include/block/block_int.h 2014-07-16 11:53:56.000000000 +0200 |
139 | +++ new/include/block/block_int.h 2014-07-16 12:01:34.000000000 +0200 | |
e549ff74 | 140 | @@ -56,6 +56,9 @@ |
38f36829 | 141 | #define BLOCK_OPT_REDUNDANCY "redundancy" |
e549ff74 | 142 | #define BLOCK_OPT_NOCOW "nocow" |
cbf9030a DM |
143 | |
144 | +typedef int BackupDumpFunc(void *opaque, BlockDriverState *bs, | |
5cf8ed03 | 145 | + int64_t sector_num, int n_sectors, unsigned char *buf); |
cbf9030a DM |
146 | + |
147 | typedef struct BdrvTrackedRequest { | |
148 | BlockDriverState *bs; | |
38f36829 | 149 | int64_t offset; |
e549ff74 | 150 | @@ -539,7 +542,9 @@ |
cbf9030a DM |
151 | int64_t speed, MirrorSyncMode sync_mode, |
152 | BlockdevOnError on_source_error, | |
153 | BlockdevOnError on_target_error, | |
154 | + BackupDumpFunc *dump_cb, | |
155 | BlockDriverCompletionFunc *cb, void *opaque, | |
bd240f3b | 156 | + bool paused, |
cbf9030a DM |
157 | Error **errp); |
158 | ||
bd240f3b | 159 | #endif /* BLOCK_INT_H */ |