qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH 2/2] hmp: add hmp commands dirty bitmap add/clear/re


From: Rudy Zhang
Subject: [Qemu-block] [PATCH 2/2] hmp: add hmp commands dirty bitmap add/clear/remove'
Date: Thu, 21 Jan 2016 19:22:18 +0800

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 <address@hidden>
---
 hmp-commands.hx | 42 +++++++++++++++++++++++++++++++++++
 hmp.c           | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 hmp.h           |  3 +++
 3 files changed, 113 insertions(+)

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
address@hidden block_dirty_bitmap_add
address@hidden 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
address@hidden block_dirty_bitmap_clear
address@hidden 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
address@hidden block_dirty_bitmap_remove
address@hidden 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);
-- 
2.6.4




reply via email to

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