[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 1/2] hmp: add hmp command for incremental backup
From: |
Rudy Zhang |
Subject: |
[Qemu-block] [PATCH 1/2] hmp: add hmp command for incremental backup |
Date: |
Thu, 21 Jan 2016 19:22:17 +0800 |
Add hmp command for incremental backup in drive-backup.
It need a bitmap to backup data from drive-image to incremental image,
so before it need add bitmap for this device to track io.
Usage:
drive_backup [-n] [-f] device target [bitmap] [format]
Signed-off-by: Rudy Zhang <address@hidden>
---
hmp-commands.hx | 5 +++--
hmp.c | 16 ++++++++++++++--
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index bb52e4d..7378aaa 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1180,12 +1180,13 @@ ETEXI
{
.name = "drive_backup",
- .args_type = "reuse:-n,full:-f,device:B,target:s,format:s?",
- .params = "[-n] [-f] device target [format]",
+ .args_type = "reuse:-n,full:-f,device:B,target:s,bitmap:s?,format:s?",
+ .params = "[-n] [-f] device target [bitmap] [format]",
.help = "initiates a point-in-time\n\t\t\t"
"copy for a device. The device's contents are\n\t\t\t"
"copied to the new image file, excluding data
that\n\t\t\t"
"is written after the command is started.\n\t\t\t"
+ "With bitmap will start incremental backup.\n\t\t\t"
"The -n flag requests QEMU to reuse the image
found\n\t\t\t"
"in new-image-file, instead of recreating it from
scratch.\n\t\t\t"
"The -f flag requests QEMU to copy the whole
disk,\n\t\t\t"
diff --git a/hmp.c b/hmp.c
index 54f2620..f8c33cd 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1086,11 +1086,13 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
{
const char *device = qdict_get_str(qdict, "device");
const char *filename = qdict_get_str(qdict, "target");
+ const char *bitmap = qdict_get_try_str(qdict, "bitmap");
const char *format = qdict_get_try_str(qdict, "format");
bool reuse = qdict_get_try_bool(qdict, "reuse", false);
bool full = qdict_get_try_bool(qdict, "full", false);
enum NewImageMode mode;
Error *err = NULL;
+ enum MirrorSyncMode sync;
if (!filename) {
error_setg(&err, QERR_MISSING_PARAMETER, "target");
@@ -1098,6 +1100,17 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
return;
}
+ if (full && bitmap) {
+ error_setg(&err, "Parameter 'bitmap' if conflict with '-f'");
+ hmp_handle_error(mon, &err);
+ return;
+ } else if (full)
+ sync = MIRROR_SYNC_MODE_FULL;
+ else if (bitmap)
+ sync = MIRROR_SYNC_MODE_INCREMENTAL;
+ else
+ sync = MIRROR_SYNC_MODE_TOP;
+
if (reuse) {
mode = NEW_IMAGE_MODE_EXISTING;
} else {
@@ -1105,8 +1118,7 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
}
qmp_drive_backup(device, filename, !!format, format,
- full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
- true, mode, false, 0, false, NULL,
+ sync, true, mode, false, 0, !!bitmap, bitmap,
false, 0, false, 0, &err);
hmp_handle_error(mon, &err);
}
--
2.6.4