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 <rudyflyzh...@gmail.com> --- 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 +@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); -- 2.6.4