-From 95b9266b030a4962284a0b9eebf9849291809fee Mon Sep 17 00:00:00 2001
+From 793525f2a3b92fdc0ce27e48c3421171b87c367c Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Tue, 13 Nov 2012 09:24:50 +0100
Subject: [PATCH v3 1/6] RFC: Efficient VM backup for qemu
Changes since v2:
* BackupDriver: remove cancel_cb
+* use enum for BackupFormat
+* vma: use bdrv_open instead of bdrv_file_open
Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
---
-From 290368c30f966c3e74d6cd926c0d044f7ba2a3ea Mon Sep 17 00:00:00 2001
+From 11bf5a3156abfd98d13cc5f03cd5f57e6dac06f3 Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Tue, 13 Nov 2012 10:03:52 +0100
Subject: [PATCH v3 2/6] add basic backup support to block driver
-From 262dc0d9c9f729dd5f74fc8772738207a4c1359d Mon Sep 17 00:00:00 2001
+From d97630338d62186229192d0724fae489fc500acc Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Tue, 13 Nov 2012 11:27:56 +0100
Subject: [PATCH v3 3/6] add backup related monitor commands
Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
---
backup.h | 13 ++
- blockdev.c | 376 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ blockdev.c | 375 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
hmp-commands.hx | 31 +++++
hmp.c | 63 +++++++++
hmp.h | 3 +
monitor.c | 7 +
- qapi-schema.json | 81 ++++++++++++
+ qapi-schema.json | 91 +++++++++++++
qmp-commands.hx | 27 ++++
- 8 files changed, 601 insertions(+), 0 deletions(-)
+ 8 files changed, 610 insertions(+), 0 deletions(-)
diff --git a/backup.h b/backup.h
index e1f0290..ae4aa8c 100644
+
#endif /* QEMU_BACKUP_H */
diff --git a/blockdev.c b/blockdev.c
-index e73fd6e..e89aa14 100644
+index e73fd6e..08ac7ad 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -20,6 +20,7 @@
static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
-@@ -1321,6 +1322,381 @@ void qmp_drive_mirror(const char *device, const char *target,
+@@ -1321,6 +1322,380 @@ void qmp_drive_mirror(const char *device, const char *target,
drive_get_ref(drive_get_by_blockdev(bs));
}
+ }
+}
+
-+char *qmp_backup(const char *backupfile, bool has_format, const char *format,
++char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
+ bool has_config_filename, const char *config_filename,
+ bool has_devlist, const char *devlist,
+ bool has_speed, int64_t speed, Error **errp)
+ GList *bcblist = NULL;
+
+ /* Todo: try to auto-detect format based on file name */
-+ format = has_format ? format : "vma";
++ format = has_format ? format : BACKUP_FORMAT_VMA;
+
+ /* fixme: find driver for specifued format */
+ const BackupDriver *driver = NULL;
+
+ if (!driver) {
-+ error_set(errp, ERROR_CLASS_GENERIC_ERROR,
-+ "no backup driver for format '%s'", format);
++ error_set(errp, ERROR_CLASS_GENERIC_ERROR, "unknown backup format");
+ return NULL;
+ }
+
show current migration capabilities
@item info migrate_cache_size
diff --git a/hmp.c b/hmp.c
-index 180ba2b..600792f 100644
+index 180ba2b..77076fa 100644
--- a/hmp.c
+++ b/hmp.c
@@ -130,6 +130,38 @@ void hmp_info_mice(Monitor *mon)
+
+ Error *errp = NULL;
+
-+ qmp_backup(backupfile, false, NULL, false, NULL, !!devlist, devlist,
-+ qdict_haskey(qdict, "speed"), speed, &errp);
++ qmp_backup(backupfile, true, BACKUP_FORMAT_VMA, false, NULL, !!devlist,
++ devlist, qdict_haskey(qdict, "speed"), speed, &errp);
+
+ if (error_is_set(&errp)) {
+ monitor_printf(mon, "%s\n", error_get_pretty(errp));
.args_type = "",
.params = "",
diff --git a/qapi-schema.json b/qapi-schema.json
-index 5dfa052..bcc70b1 100644
+index 5dfa052..2d3699b 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -358,6 +358,39 @@
# @query-events:
#
# Return a list of supported QMP events by this server
-@@ -1764,6 +1797,54 @@
+@@ -1764,6 +1797,64 @@
'data': { 'path': 'str' },
'returns': [ 'ObjectPropertyInfo' ] }
++
++##
++# @BackupFormat
++#
++# An enumeration of supported backup formats.
++#
++# @vma: Proxmox vma backup format
++##
++{ 'enum': 'BackupFormat',
++ 'data': [ 'vma' ] }
+
+##
+# @backup:
+#
+# Since: 1.4.0
+##
-+{ 'command': 'backup', 'data': { 'backupfile': 'str', '*format': 'str',
++{ 'command': 'backup', 'data': { 'backupfile': 'str', '*format': 'BackupFormat',
+ '*config-filename': 'str',
+ '*devlist': 'str', '*speed': 'int' },
+ 'returns': 'str' }
-From 9fb6fd584178db5b5a9f0b59f78c30b3c3066f73 Mon Sep 17 00:00:00 2001
+From 5fbe9dc9bb921a1ee4814028d42c4fc46b04e172 Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Tue, 13 Nov 2012 11:11:38 +0100
Subject: [PATCH v3 4/6] introduce new vma archive format
block-obj-$(CONFIG_POSIX) += event_notifier-posix.o aio-posix.o
block-obj-$(CONFIG_WIN32) += event_notifier-win32.o aio-win32.o
diff --git a/blockdev.c b/blockdev.c
-index e89aa14..6764e73 100644
+index 08ac7ad..e16091f 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -21,6 +21,7 @@
static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
-@@ -1483,10 +1484,11 @@ char *qmp_backup(const char *backupfile, bool has_format, const char *format,
+@@ -1483,10 +1484,11 @@ char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
/* Todo: try to auto-detect format based on file name */
- format = has_format ? format : "vma";
+ format = has_format ? format : BACKUP_FORMAT_VMA;
- /* fixme: find driver for specifued format */
const BackupDriver *driver = NULL;
- if (!driver) {
-+ if (strcmp(format, "vma") == 0) {
++ if (format == BACKUP_FORMAT_VMA) {
+ driver = &backup_vma_driver;
+ } else {
- error_set(errp, ERROR_CLASS_GENERIC_ERROR,
- "no backup driver for format '%s'", format);
+ error_set(errp, ERROR_CLASS_GENERIC_ERROR, "unknown backup format");
return NULL;
+ }
diff --git a/docs/specs/vma_spec.txt b/docs/specs/vma_spec.txt
new file mode 100644
index 0000000..052c629
-From da1ef0e71e40f35bc2274201fb28a58b09d53456 Mon Sep 17 00:00:00 2001
+From 6a409b2401390d672b7f2a105d8446475fa5bee2 Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Wed, 14 Nov 2012 09:57:04 +0100
Subject: [PATCH v3 5/6] add regression tests for backup
-From ca0d410ca44dcb666c6eecf8d8f2f4a18355950f Mon Sep 17 00:00:00 2001
+From ea2827e070e10b515be9b05628e372d281fcf868 Mon Sep 17 00:00:00 2001
From: Dietmar Maurer <dietmar@proxmox.com>
Date: Thu, 29 Nov 2012 10:46:49 +0100
Subject: [PATCH v3 6/6] add vm state to backups
Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
---
blockdev.c | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
- hmp.c | 2 +-
+ hmp.c | 5 +-
qapi-schema.json | 6 +-
- 3 files changed, 199 insertions(+), 5 deletions(-)
+ 3 files changed, 201 insertions(+), 6 deletions(-)
diff --git a/blockdev.c b/blockdev.c
-index 6764e73..4f7e38b 100644
+index e16091f..a5e2058 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -22,6 +22,8 @@
+ goto out;
+}
+
- char *qmp_backup(const char *backupfile, bool has_format, const char *format,
+ char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
bool has_config_filename, const char *config_filename,
bool has_devlist, const char *devlist,
- bool has_speed, int64_t speed, Error **errp)
{
BlockDriverState *bs;
Error *local_err = NULL;
-@@ -1481,6 +1647,8 @@ char *qmp_backup(const char *backupfile, bool has_format, const char *format,
+@@ -1481,6 +1647,8 @@ char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
gchar **devs = NULL;
GList *bcblist = NULL;
+ bool save_state = has_state ? state : false;
+
/* Todo: try to auto-detect format based on file name */
- format = has_format ? format : "vma";
+ format = has_format ? format : BACKUP_FORMAT_VMA;
-@@ -1562,6 +1730,22 @@ char *qmp_backup(const char *backupfile, bool has_format, const char *format,
+@@ -1561,6 +1729,22 @@ char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
size_t total = 0;
/* register all devices for vma writer */
l = bcblist;
while (l) {
BackupCB *bcb = l->data;
-@@ -1625,8 +1809,16 @@ char *qmp_backup(const char *backupfile, bool has_format, const char *format,
+@@ -1624,8 +1808,16 @@ char *qmp_backup(const char *backupfile, bool has_format, BackupFormat format,
backup_state.total = total;
backup_state.transferred = 0;
backup_state.zero_bytes = 0;
return g_strdup(backup_state.uuid_str);
diff --git a/hmp.c b/hmp.c
-index 600792f..e92bba9 100644
+index 77076fa..61ba5c3 100644
--- a/hmp.c
+++ b/hmp.c
-@@ -1031,7 +1031,7 @@ void hmp_backup(Monitor *mon, const QDict *qdict)
+@@ -1031,8 +1031,9 @@ void hmp_backup(Monitor *mon, const QDict *qdict)
Error *errp = NULL;
- qmp_backup(backupfile, false, NULL, false, NULL, !!devlist, devlist,
-- qdict_haskey(qdict, "speed"), speed, &errp);
-+ qdict_haskey(qdict, "speed"), speed, false, false, &errp);
-
+ qmp_backup(backupfile, true, BACKUP_FORMAT_VMA, false, NULL, !!devlist,
+- devlist, qdict_haskey(qdict, "speed"), speed, &errp);
+-
++ devlist, qdict_haskey(qdict, "speed"), speed, false, false,
++ &errp);
++
if (error_is_set(&errp)) {
monitor_printf(mon, "%s\n", error_get_pretty(errp));
+ error_free(errp);
diff --git a/qapi-schema.json b/qapi-schema.json
-index bcc70b1..2af4359 100644
+index 2d3699b..3f4889e 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
-@@ -1812,13 +1812,15 @@
+@@ -1822,13 +1822,15 @@
#
# @speed: #optional the maximum speed, in bytes per second
#
#
# Since: 1.4.0
##
- { 'command': 'backup', 'data': { 'backupfile': 'str', '*format': 'str',
+ { 'command': 'backup', 'data': { 'backupfile': 'str', '*format': 'BackupFormat',
- '*config-filename': 'str',
- '*devlist': 'str', '*speed': 'int' },
+ '*config-filename': 'str', '*devlist': 'str',