qemu-block
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]