]> git.proxmox.com Git - pve-qemu-kvm.git/blob - debian/patches/backup-modify-job-api.patch
update to qemu 2.2.0-rc2
[pve-qemu-kvm.git] / debian / patches / backup-modify-job-api.patch
1 Index: new/block/backup.c
2 ===================================================================
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
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;
13 @@ -136,14 +137,21 @@
14 goto out;
15 }
16
17 + int64_t start_sec = start * BACKUP_SECTORS_PER_CLUSTER;
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,
21 - n, BDRV_REQ_MAY_UNMAP);
22 + if (job->dump_cb) {
23 + ret = job->dump_cb(job->common.opaque, job->target, start_sec, n, NULL);
24 + }
25 + if (job->target) {
26 + ret = bdrv_co_write_zeroes(job->target, start_sec, n, BDRV_REQ_MAY_UNMAP);
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) {
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);
37 + }
38 }
39 if (ret < 0) {
40 trace_backup_do_cow_write_fail(job, start, ret);
41 @@ -205,7 +213,9 @@
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 = {
52 @@ -221,9 +231,11 @@
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 {
61 + return BLOCK_ERROR_ACTION_REPORT;
62 }
63 }
64
65 @@ -264,9 +276,11 @@
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
80 @@ -359,7 +373,9 @@
81
82 hbitmap_free(job->bitmap);
83
84 - bdrv_iostatus_disable(target);
85 + if (target) {
86 + bdrv_iostatus_disable(target);
87 + }
88
89 data = g_malloc(sizeof(*data));
90 data->ret = ret;
91 @@ -370,13 +386,15 @@
92 int64_t speed, MirrorSyncMode sync_mode,
93 BlockdevOnError on_source_error,
94 BlockdevOnError on_target_error,
95 + BackupDumpFunc *dump_cb,
96 BlockCompletionFunc *cb, void *opaque,
97 + bool paused,
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 ||
108 @@ -399,10 +417,12 @@
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;
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);
121 Index: new/blockdev.c
122 ===================================================================
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);
127
128 backup_start(bs, target_bs, speed, sync, on_source_error, on_target_error,
129 - block_job_cb, bs, &local_err);
130 + NULL, block_job_cb, bs, false, &local_err);
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 ===================================================================
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 @@
139 #define BLOCK_OPT_REDUNDANCY "redundancy"
140 #define BLOCK_OPT_NOCOW "nocow"
141
142 +typedef int BackupDumpFunc(void *opaque, BlockDriverState *bs,
143 + int64_t sector_num, int n_sectors, unsigned char *buf);
144 +
145 typedef struct BdrvTrackedRequest {
146 BlockDriverState *bs;
147 int64_t offset;
148 @@ -583,7 +586,9 @@
149 int64_t speed, MirrorSyncMode sync_mode,
150 BlockdevOnError on_source_error,
151 BlockdevOnError on_target_error,
152 + BackupDumpFunc *dump_cb,
153 BlockCompletionFunc *cb, void *opaque,
154 + bool paused,
155 Error **errp);
156
157 void blk_dev_change_media_cb(BlockBackend *blk, bool load);