[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 2/7] qmp: add qmp handlers to create disk snapshots
Add qmp handlers to take disk snapshots. This will be used when creating a domain snapshots. Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx> --- tools/libxl/libxl_internal.h | 4 +++ tools/libxl/libxl_qmp.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 6ea6c83..c3dec85 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1735,6 +1735,10 @@ _hidden int libxl__qmp_set_global_dirty_log(libxl__gc *gc, int domid, bool enabl _hidden int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, const libxl_device_disk *disk); /* Add a virtual CPU */ _hidden int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int index); +/* Create disk snapshots for a group of disks in a transaction */ +_hidden int libxl__qmp_disk_snapshot_transaction(libxl__gc *gc, int domid, + libxl_disk_snapshot *snapshot, + int nb); /* close and free the QMP handler */ _hidden void libxl__qmp_close(libxl__qmp_handler *qmp); /* remove the socket file, if the file has already been removed, diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c index 965c507..2216511 100644 --- a/tools/libxl/libxl_qmp.c +++ b/tools/libxl/libxl_qmp.c @@ -968,6 +968,72 @@ int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int idx) return qmp_run_command(gc, domid, "cpu-add", args, NULL, NULL); } +/* + * requires QEMU version >= 1.1 + * qmp command example: + * -> { "execute": "transaction", + * "arguments": { "actions": [ + * { "type": "blockdev-snapshot-sync", "data" : { "device": "ide-hd0", + * "snapshot-file": "/some/place/my-image", + * "format": "qcow2" } }, + * { 'type': 'blockdev-snapshot-internal-sync', 'data' : { + * "device": "ide-hd1", + * "name": "snapshot0" } } ] } } + * { 'type': 'blockdev-snapshot-internal-sync', 'data' : { + * "device": "ide-hd2", + * "name": "snapshot0" } } ] } } + * <- { "return": {} } + */ +int libxl__qmp_disk_snapshot_transaction(libxl__gc *gc, int domid, + libxl_disk_snapshot *snapshot, + int nb) +{ + libxl__json_object *args = NULL; + libxl__json_object *actions = NULL; + libxl__json_object **type = NULL; + libxl__json_object **data = NULL; + int i; + + type = (libxl__json_object**)calloc(nb, sizeof(libxl__json_object*)); + data = (libxl__json_object**)calloc(nb, sizeof(libxl__json_object*)); + actions = libxl__json_object_alloc(gc, JSON_ARRAY); + + for (i = 0; i < nb; i++) { + switch (snapshot[i].type) { + case LIBXL_DISK_SNAPSHOT_TYPE_INTERNAL: + /* internal disk snapshot */ + qmp_parameters_add_string(gc, &type[i], "type", + "blockdev-snapshot-internal-sync"); + qmp_parameters_add_string(gc, &data[i], "name", + snapshot[i].name); + qmp_parameters_add_string(gc, &data[i], "device", + snapshot[i].disk.vdev); + qmp_parameters_common_add(gc, &type[i], "data", data[i]); + flexarray_append(actions->u.array, (void*)type[i]); + break; + case LIBXL_DISK_SNAPSHOT_TYPE_EXTERNAL: + /* external disk snapshot */ + qmp_parameters_add_string(gc, &type[i], "type", + "blockdev-snapshot-sync"); + qmp_parameters_add_string(gc, &data[i], "device", + snapshot[i].disk.vdev); + qmp_parameters_add_string(gc, &data[i], "snapshot-file", + snapshot[i].u.external.external_path); + qmp_parameters_add_string(gc, &data[i], "format", + libxl_disk_format_to_string(snapshot[i].u.external.external_format)); + qmp_parameters_common_add(gc, &type[i], "data", data[i]); + flexarray_append(actions->u.array, (void*)type[i]); + break; + default: + LOG(ERROR, "Invalid disk snapshot type"); + return -1; + } + } + + qmp_parameters_common_add(gc, &args, "actions", actions); + return qmp_run_command(gc, domid, "transaction", args, NULL, NULL); +} + int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, const libxl_domain_config *guest_config) { -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |