diff mbox

[2/2] hmp: add hmp commands dirty bitmap add/clear/remove'

Message ID 1453375338-13508-3-git-send-email-rudyflyzhang@gmail.com
State New
Headers show

Commit Message

Rudy Zhang Jan. 21, 2016, 11:22 a.m. UTC
Add several hmp commands: 'block_dirty_bitmap_add', 'block_dirty_bitmap_clear',
'block_dirty_bitmap_remove'. The bitmap is used for incremental backup to trace io.

Usage:
	block_dirty_bitmap_add device bitmap [granularity] -- Add dirty bitmap for 'device'
	block_dirty_bitmap_clear device bitmap -- Clear dirty bitmap for 'device'
	block_dirty_bitmap_remove device bitmap -- Remove dirty bitmap for 'device'

Signed-off-by: Rudy Zhang <rudyflyzhang@gmail.com>
---
 hmp-commands.hx | 42 +++++++++++++++++++++++++++++++++++
 hmp.c           | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 hmp.h           |  3 +++
 3 files changed, 113 insertions(+)
diff mbox

Patch

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 7378aaa..8f1f95b 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -154,6 +154,48 @@  ETEXI
     },
 
 STEXI
+@item block_dirty_bitmap_add
+@findex block_dirty_bitmap_add
+Add the block dirty bitmap.
+ETEXI
+
+    {
+        .name       = "block_dirty_bitmap_add",
+        .args_type  = "node:B,bitmap:s,granularity:o?",
+        .params     = "device bitmap [granularity]",
+        .help       = "Add dirty bitmap for 'device'",
+        .mhandler.cmd = hmp_block_dirty_bitmap_add,
+    },
+
+STEXI
+@item block_dirty_bitmap_clear
+@findex block_dirty_bitmap_clear
+Clear the block dirty bitmap.
+ETEXI
+
+    {
+        .name       = "block_dirty_bitmap_clear",
+        .args_type  = "node:B,bitmap:s",
+        .params     = "device bitmap",
+        .help       = "Clear dirty bitmap for 'device'",
+        .mhandler.cmd = hmp_block_dirty_bitmap_clear,
+    },
+
+STEXI
+@item block_dirty_bitmap_remove
+@findex block_dirty_bitmap_remove
+Remove the block dirty bitmap.
+ETEXI
+
+    {
+        .name       = "block_dirty_bitmap_remove",
+        .args_type  = "node:B,bitmap:s",
+        .params     = "device bitmap",
+        .help       = "Remove dirty bitmap for 'device'",
+        .mhandler.cmd = hmp_block_dirty_bitmap_remove,
+    },
+
+STEXI
 @item block_job_resume
 @findex block_job_resume
 Resume a paused block streaming operation.
diff --git a/hmp.c b/hmp.c
index f8c33cd..b5eecbc 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1495,6 +1495,74 @@  void hmp_block_job_complete(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, &error);
 }
 
+void hmp_block_dirty_bitmap_add(Monitor *mon, const QDict *qdict)
+{
+    Error *error = NULL;
+    const char *node = qdict_get_str(qdict, "node");
+    const char *bitmap = qdict_get_str(qdict, "bitmap");
+    uint32_t granularity = qdict_get_try_int(qdict, "granularity", 0);
+
+    if (!node) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "node");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    if (!bitmap) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    qmp_block_dirty_bitmap_add(node, bitmap,
+                             !!granularity, granularity, &error);
+    hmp_handle_error(mon, &error);
+}
+
+void hmp_block_dirty_bitmap_clear(Monitor *mon, const QDict *qdict)
+{
+    Error *error = NULL;
+    const char *node = qdict_get_str(qdict, "node");
+    const char *bitmap = qdict_get_str(qdict, "bitmap");
+
+    if (!node) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "node");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    if (!bitmap) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    qmp_block_dirty_bitmap_clear(node, bitmap, &error);
+    hmp_handle_error(mon, &error);
+}
+
+void hmp_block_dirty_bitmap_remove(Monitor *mon, const QDict *qdict)
+{
+    Error *error = NULL;
+    const char *node = qdict_get_str(qdict, "node");
+    const char *bitmap = qdict_get_str(qdict, "bitmap");
+
+    if (!node) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "node");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    if (!bitmap) {
+        error_setg(&error, QERR_MISSING_PARAMETER, "bitmap");
+        hmp_handle_error(mon, &error);
+        return;
+    }
+
+    qmp_block_dirty_bitmap_remove(node, bitmap, &error);
+    hmp_handle_error(mon, &error);
+}
+
 typedef struct HMPMigrationStatus
 {
     QEMUTimer *timer;
diff --git a/hmp.h b/hmp.h
index a8c5b5a..ea07116 100644
--- a/hmp.h
+++ b/hmp.h
@@ -81,6 +81,9 @@  void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
 void hmp_block_job_pause(Monitor *mon, const QDict *qdict);
 void hmp_block_job_resume(Monitor *mon, const QDict *qdict);
 void hmp_block_job_complete(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_add(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_clear(Monitor *mon, const QDict *qdict);
+void hmp_block_dirty_bitmap_remove(Monitor *mon, const QDict *qdict);
 void hmp_migrate(Monitor *mon, const QDict *qdict);
 void hmp_device_add(Monitor *mon, const QDict *qdict);
 void hmp_device_del(Monitor *mon, const QDict *qdict);