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 <rudyflyzh...@gmail.com> --- 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