]> git.proxmox.com Git - pve-qemu.git/blob - debian/patches/pve/0016-backup-vma-add-dir-format.patch
import stable-4 build files
[pve-qemu.git] / debian / patches / pve / 0016-backup-vma-add-dir-format.patch
1 From 210be0fc498989e7b029de90b9d2599fdcc343d3 Mon Sep 17 00:00:00 2001
2 From: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 Date: Wed, 9 Dec 2015 15:21:54 +0100
4 Subject: [PATCH 16/47] backup: vma: add dir format
5
6 ---
7 blockdev.c | 124 +++++++++++++++++++++++++++++++++++++++++--------------
8 hmp-commands.hx | 8 ++--
9 hmp.c | 4 +-
10 qapi-schema.json | 2 +-
11 vma.c | 2 +-
12 5 files changed, 103 insertions(+), 37 deletions(-)
13
14 diff --git a/blockdev.c b/blockdev.c
15 index 5417bb0..d8b1db8 100644
16 --- a/blockdev.c
17 +++ b/blockdev.c
18 @@ -3001,6 +3001,8 @@ typedef struct PVEBackupDevInfo {
19 uint8_t dev_id;
20 //bool started;
21 bool completed;
22 + char targetfile[PATH_MAX];
23 + BlockDriverState *target;
24 } PVEBackupDevInfo;
25
26 static void pvebackup_run_next_job(void);
27 @@ -3069,8 +3071,6 @@ static void pvebackup_complete_cb(void *opaque, int ret)
28 {
29 PVEBackupDevInfo *di = opaque;
30
31 - assert(backup_state.vmaw);
32 -
33 di->completed = true;
34
35 if (ret < 0 && !backup_state.error) {
36 @@ -3081,8 +3081,11 @@ static void pvebackup_complete_cb(void *opaque, int ret)
37 BlockDriverState *bs = di->bs;
38
39 di->bs = NULL;
40 + di->target = NULL;
41
42 - vma_writer_close_stream(backup_state.vmaw, di->dev_id);
43 + if (backup_state.vmaw) {
44 + vma_writer_close_stream(backup_state.vmaw, di->dev_id);
45 + }
46
47 block_job_cb(bs, ret);
48
49 @@ -3162,6 +3165,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
50 {
51 BlockBackend *blk;
52 BlockDriverState *bs = NULL;
53 + const char *backup_dir = NULL;
54 Error *local_err = NULL;
55 uuid_t uuid;
56 VmaWriter *vmaw = NULL;
57 @@ -3179,11 +3183,6 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
58 /* Todo: try to auto-detect format based on file name */
59 format = has_format ? format : BACKUP_FORMAT_VMA;
60
61 - if (format != BACKUP_FORMAT_VMA) {
62 - error_set(errp, ERROR_CLASS_GENERIC_ERROR, "unknown backup format");
63 - return NULL;
64 - }
65 -
66 if (has_devlist) {
67 devs = g_strsplit_set(devlist, ",;:", -1);
68
69 @@ -3252,27 +3251,62 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
70
71 uuid_generate(uuid);
72
73 - vmaw = vma_writer_create(backup_file, uuid, &local_err);
74 - if (!vmaw) {
75 - if (local_err) {
76 - error_propagate(errp, local_err);
77 + if (format == BACKUP_FORMAT_VMA) {
78 + vmaw = vma_writer_create(backup_file, uuid, &local_err);
79 + if (!vmaw) {
80 + if (local_err) {
81 + error_propagate(errp, local_err);
82 + }
83 + goto err;
84 }
85 - goto err;
86 - }
87
88 - /* register all devices for vma writer */
89 - l = di_list;
90 - while (l) {
91 - PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
92 - l = g_list_next(l);
93 + /* register all devices for vma writer */
94 + l = di_list;
95 + while (l) {
96 + PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
97 + l = g_list_next(l);
98
99 - const char *devname = bdrv_get_device_name(di->bs);
100 - di->dev_id = vma_writer_register_stream(vmaw, devname, di->size);
101 - if (di->dev_id <= 0) {
102 - error_set(errp, ERROR_CLASS_GENERIC_ERROR,
103 - "register_stream failed");
104 + const char *devname = bdrv_get_device_name(di->bs);
105 + di->dev_id = vma_writer_register_stream(vmaw, devname, di->size);
106 + if (di->dev_id <= 0) {
107 + error_set(errp, ERROR_CLASS_GENERIC_ERROR,
108 + "register_stream failed");
109 + goto err;
110 + }
111 + }
112 + } else if (format == BACKUP_FORMAT_DIR) {
113 + if (mkdir(backup_file, 0640) != 0) {
114 + error_setg_errno(errp, errno, "can't create directory '%s'\n",
115 + backup_file);
116 goto err;
117 }
118 + backup_dir = backup_file;
119 +
120 + l = di_list;
121 + while (l) {
122 + PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
123 + l = g_list_next(l);
124 +
125 + const char *devname = bdrv_get_device_name(di->bs);
126 + snprintf(di->targetfile, PATH_MAX, "%s/%s.raw", backup_dir, devname);
127 +
128 + int flags = BDRV_O_RDWR;
129 + bdrv_img_create(di->targetfile, "raw", NULL, NULL, NULL,
130 + di->size, flags, &local_err, false);
131 + if (local_err) {
132 + error_propagate(errp, local_err);
133 + goto err;
134 + }
135 +
136 + di->target = bdrv_open(di->targetfile, NULL, NULL, flags, &local_err);
137 + if (!di->target) {
138 + error_propagate(errp, local_err);
139 + goto err;
140 + }
141 + }
142 + } else {
143 + error_set(errp, ERROR_CLASS_GENERIC_ERROR, "unknown backup format");
144 + goto err;
145 }
146
147 /* add configuration file to archive */
148 @@ -3285,12 +3319,27 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
149 goto err;
150 }
151
152 - const char *basename = g_path_get_basename(config_file);
153 - if (vma_writer_add_config(vmaw, basename, cdata, clen) != 0) {
154 - error_setg(errp, "unable to add config data to vma archive");
155 - g_free(cdata);
156 - goto err;
157 + char *basename = g_path_get_basename(config_file);
158 +
159 + if (format == BACKUP_FORMAT_VMA) {
160 + if (vma_writer_add_config(vmaw, basename, cdata, clen) != 0) {
161 + error_setg(errp, "unable to add config data to vma archive");
162 + g_free(cdata);
163 + g_free(basename);
164 + goto err;
165 + }
166 + } else if (format == BACKUP_FORMAT_DIR) {
167 + char config_path[PATH_MAX];
168 + snprintf(config_path, PATH_MAX, "%s/%s", backup_dir, basename);
169 + if (!g_file_set_contents(config_path, cdata, clen, &err)) {
170 + error_setg(errp, "unable to write config file '%s'", config_path);
171 + g_free(cdata);
172 + g_free(basename);
173 + goto err;
174 + }
175 }
176 +
177 + g_free(basename);
178 g_free(cdata);
179 }
180
181 @@ -3330,7 +3379,7 @@ UuidInfo *qmp_backup(const char *backup_file, bool has_format,
182 PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
183 l = g_list_next(l);
184
185 - backup_start(NULL, di->bs, NULL, speed, MIRROR_SYNC_MODE_FULL, NULL,
186 + backup_start(NULL, di->bs, di->target, speed, MIRROR_SYNC_MODE_FULL, NULL,
187 BLOCKDEV_ON_ERROR_REPORT, BLOCKDEV_ON_ERROR_REPORT,
188 pvebackup_dump_cb, pvebackup_complete_cb, di,
189 1, NULL, &local_err);
190 @@ -3352,8 +3401,17 @@ err:
191
192 l = di_list;
193 while (l) {
194 - g_free(l->data);
195 + PVEBackupDevInfo *di = (PVEBackupDevInfo *)l->data;
196 l = g_list_next(l);
197 +
198 + if (di->target) {
199 + bdrv_unref(di->target);
200 + }
201 +
202 + if (di->targetfile[0]) {
203 + unlink(di->targetfile);
204 + }
205 + g_free(di);
206 }
207 g_list_free(di_list);
208
209 @@ -3367,6 +3425,10 @@ err:
210 unlink(backup_file);
211 }
212
213 + if (backup_dir) {
214 + rmdir(backup_dir);
215 + }
216 +
217 return NULL;
218 }
219
220 diff --git a/hmp-commands.hx b/hmp-commands.hx
221 index 8f2f3e0..0e20ef9 100644
222 --- a/hmp-commands.hx
223 +++ b/hmp-commands.hx
224 @@ -89,9 +89,11 @@ ETEXI
225
226 {
227 .name = "backup",
228 - .args_type = "backupfile:s,speed:o?,devlist:s?",
229 - .params = "backupfile [speed [devlist]]",
230 - .help = "create a VM Backup.",
231 + .args_type = "directory:-d,backupfile:s,speed:o?,devlist:s?",
232 + .params = "[-d] backupfile [speed [devlist]]",
233 + .help = "create a VM Backup."
234 + "\n\t\t\t Use -d to dump data into a directory instead"
235 + "\n\t\t\t of using VMA format.",
236 .mhandler.cmd = hmp_backup,
237 },
238
239 diff --git a/hmp.c b/hmp.c
240 index 95da164..c23cf2f 100644
241 --- a/hmp.c
242 +++ b/hmp.c
243 @@ -1544,11 +1544,13 @@ void hmp_backup(Monitor *mon, const QDict *qdict)
244 {
245 Error *error = NULL;
246
247 + int dir = qdict_get_try_bool(qdict, "directory", 0);
248 const char *backup_file = qdict_get_str(qdict, "backupfile");
249 const char *devlist = qdict_get_try_str(qdict, "devlist");
250 int64_t speed = qdict_get_try_int(qdict, "speed", 0);
251
252 - qmp_backup(backup_file, true, BACKUP_FORMAT_VMA, false, NULL, !!devlist,
253 + qmp_backup(backup_file, true, dir ? BACKUP_FORMAT_DIR : BACKUP_FORMAT_VMA,
254 + false, NULL, !!devlist,
255 devlist, qdict_haskey(qdict, "speed"), speed, &error);
256
257 hmp_handle_error(mon, &error);
258 diff --git a/qapi-schema.json b/qapi-schema.json
259 index 89d9ea6..147137d 100644
260 --- a/qapi-schema.json
261 +++ b/qapi-schema.json
262 @@ -395,7 +395,7 @@
263 # @vma: Proxmox vma backup format
264 ##
265 { 'enum': 'BackupFormat',
266 - 'data': [ 'vma' ] }
267 + 'data': [ 'vma', 'dir' ] }
268
269 ##
270 # @backup:
271 diff --git a/vma.c b/vma.c
272 index 79bdd00..c88a4358 100644
273 --- a/vma.c
274 +++ b/vma.c
275 @@ -263,7 +263,7 @@ static int extract_content(int argc, char **argv)
276 g_free(statefn);
277 } else if (di) {
278 char *devfn = NULL;
279 - int flags = BDRV_O_RDWR|BDRV_O_CACHE_WB;
280 + int flags = BDRV_O_RDWR;
281 bool write_zero = true;
282
283 if (readmap) {
284 --
285 2.1.4
286