]> git.proxmox.com Git - pve-qemu-kvm.git/blame - debian/patches/backup-modify-job-api.patch
enable debian/patches/backup-vma-restore-tolerate-a-size-difference-up-to-4M.patch
[pve-qemu-kvm.git] / debian / patches / backup-modify-job-api.patch
CommitLineData
cbf9030a
DM
1Index: 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
122Index: 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);
135Index: 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 */