[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 18/33] qmp: add interface blockdev-snapshot-delete-in
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 18/33] qmp: add interface blockdev-snapshot-delete-internal-sync |
Date: |
Fri, 13 Sep 2013 13:50:48 +0200 |
From: Wenchao Xia <address@hidden>
This interface use id and name as optional parameters, to handle the
case that one image contain multiple snapshots with same name which
may be '', but with different id.
Adding parameter id is for historical compatiability reason, and
that case is not possible in qemu's new interface for internal
snapshot at block device level, but still possible in qemu-img.
Signed-off-by: Wenchao Xia <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
blockdev.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++
include/qemu-common.h | 3 +++
qapi-schema.json | 27 +++++++++++++++++++++++
qmp-commands.hx | 41 ++++++++++++++++++++++++++++++++++
4 files changed, 132 insertions(+)
diff --git a/blockdev.c b/blockdev.c
index 0f4a7b5..84d55c1 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -871,6 +871,67 @@ void qmp_blockdev_snapshot_internal_sync(const char
*device,
&snapshot, errp);
}
+SnapshotInfo *qmp_blockdev_snapshot_delete_internal_sync(const char *device,
+ bool has_id,
+ const char *id,
+ bool has_name,
+ const char *name,
+ Error **errp)
+{
+ BlockDriverState *bs = bdrv_find(device);
+ QEMUSnapshotInfo sn;
+ Error *local_err = NULL;
+ SnapshotInfo *info = NULL;
+ int ret;
+
+ if (!bs) {
+ error_set(errp, QERR_DEVICE_NOT_FOUND, device);
+ return NULL;
+ }
+
+ if (!has_id) {
+ id = NULL;
+ }
+
+ if (!has_name) {
+ name = NULL;
+ }
+
+ if (!id && !name) {
+ error_setg(errp, "Name or id must be provided");
+ return NULL;
+ }
+
+ ret = bdrv_snapshot_find_by_id_and_name(bs, id, name, &sn, &local_err);
+ if (error_is_set(&local_err)) {
+ error_propagate(errp, local_err);
+ return NULL;
+ }
+ if (!ret) {
+ error_setg(errp,
+ "Snapshot with id '%s' and name '%s' does not exist on "
+ "device '%s'",
+ STR_OR_NULL(id), STR_OR_NULL(name), device);
+ return NULL;
+ }
+
+ bdrv_snapshot_delete(bs, id, name, &local_err);
+ if (error_is_set(&local_err)) {
+ error_propagate(errp, local_err);
+ return NULL;
+ }
+
+ info = g_malloc0(sizeof(SnapshotInfo));
+ info->id = g_strdup(sn.id_str);
+ info->name = g_strdup(sn.name);
+ info->date_nsec = sn.date_nsec;
+ info->date_sec = sn.date_sec;
+ info->vm_state_size = sn.vm_state_size;
+ info->vm_clock_nsec = sn.vm_clock_nsec % 1000000000;
+ info->vm_clock_sec = sn.vm_clock_nsec / 1000000000;
+
+ return info;
+}
/* New and old BlockDriverState structs for group snapshots */
diff --git a/include/qemu-common.h b/include/qemu-common.h
index 6948bb9..5054836 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -191,6 +191,9 @@ int64_t strtosz_suffix(const char *nptr, char **end, const
char default_suffix);
int64_t strtosz_suffix_unit(const char *nptr, char **end,
const char default_suffix, int64_t unit);
+/* used to print char* safely */
+#define STR_OR_NULL(str) ((str) ? (str) : "null")
+
/* path.c */
void init_paths(const char *prefix);
const char *path(const char *pathname);
diff --git a/qapi-schema.json b/qapi-schema.json
index 43faf91..145eca8 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1825,6 +1825,33 @@
'data': 'BlockdevSnapshotInternal' }
##
+# @blockdev-snapshot-delete-internal-sync
+#
+# Synchronously delete an internal snapshot of a block device, when the format
+# of the image used support it. The snapshot is identified by name or id or
+# both. One of the name or id is required. Return SnapshotInfo for the
+# successfully deleted snapshot.
+#
+# @device: the name of the device to delete the snapshot from
+#
+# @id: optional the snapshot's ID to be deleted
+#
+# @name: optional the snapshot's name to be deleted
+#
+# Returns: SnapshotInfo on success
+# If @device is not a valid block device, DeviceNotFound
+# If snapshot not found, GenericError
+# If the format of the image used does not support it,
+# BlockFormatFeatureNotSupported
+# If @id and @name are both not specified, GenericError
+#
+# Since 1.7
+##
+{ 'command': 'blockdev-snapshot-delete-internal-sync',
+ 'data': { 'device': 'str', '*id': 'str', '*name': 'str'},
+ 'returns': 'SnapshotInfo' }
+
+##
# @human-monitor-command:
#
# Execute a command on the human monitor and return the output.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 5c9ddef..b17c46e 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1127,6 +1127,47 @@ Example:
EQMP
{
+ .name = "blockdev-snapshot-delete-internal-sync",
+ .args_type = "device:B,id:s?,name:s?",
+ .mhandler.cmd_new =
+ qmp_marshal_input_blockdev_snapshot_delete_internal_sync,
+ },
+
+SQMP
+blockdev-snapshot-delete-internal-sync
+--------------------------------------
+
+Synchronously delete an internal snapshot of a block device when the format of
+image used supports it. The snapshot is identified by name or id or both. One
+of name or id is required. If the snapshot is not found, the operation will
+fail.
+
+Arguments:
+
+- "device": device name (json-string)
+- "id": ID of the snapshot (json-string, optional)
+- "name": name of the snapshot (json-string, optional)
+
+Example:
+
+-> { "execute": "blockdev-snapshot-delete-internal-sync",
+ "arguments": { "device": "ide-hd0",
+ "name": "snapshot0" }
+ }
+<- { "return": {
+ "id": "1",
+ "name": "snapshot0",
+ "vm-state-size": 0,
+ "date-sec": 1000012,
+ "date-nsec": 10,
+ "vm-clock-sec": 100,
+ "vm-clock-nsec": 20
+ }
+ }
+
+EQMP
+
+ {
.name = "drive-mirror",
.args_type = "sync:s,device:B,target:s,speed:i?,mode:s?,format:s?,"
"on-source-error:s?,on-target-error:s?,"
--
1.8.1.4
- [Qemu-devel] [PULL 11/33] qemu-iotests: add infrastructure of fd passing via SCM, (continued)
- [Qemu-devel] [PULL 11/33] qemu-iotests: add infrastructure of fd passing via SCM, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 10/33] qemu-iotests: add unix socket help program, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 09/33] qemu-iotest: qcow2 image option amendment, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 08/33] qcow2: Implement bdrv_amend_options, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 12/33] qemu-iotests: add tests for runtime fd passing via SCM rights, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 13/33] qemu-iotests: New test case in 061, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 15/33] snapshot: distinguish id and name in snapshot delete, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 14/33] snapshot: new function bdrv_snapshot_find_by_id_and_name(), Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 16/33] qmp: add internal snapshot support in qmp_transaction, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 17/33] qmp: add interface blockdev-snapshot-internal-sync, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 18/33] qmp: add interface blockdev-snapshot-delete-internal-sync,
Kevin Wolf <=
- [Qemu-devel] [PULL 19/33] hmp: add interface hmp_snapshot_blkdev_internal, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 20/33] hmp: add interface hmp_snapshot_delete_blkdev_internal, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 21/33] qemu-iotests: add 057 internal snapshot for block device test case, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 22/33] bdrv: Use "Error" for opening images, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 23/33] bdrv: Use "Error" for creating images, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 26/33] qemu-img create: Emit filename on error, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 24/33] block: Error parameter for open functions, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 25/33] block: Error parameter for create functions, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 29/33] coroutine: add ./configure --disable-coroutine-pool, Kevin Wolf, 2013/09/13
- [Qemu-devel] [PULL 28/33] qemu-iotests: Adjustments due to error propagation, Kevin Wolf, 2013/09/13