[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V9 02/14] block: distinguish id and name in bdrv_fin
From: |
Wenchao Xia |
Subject: |
[Qemu-devel] [PATCH V9 02/14] block: distinguish id and name in bdrv_find_snapshot() |
Date: |
Mon, 11 Mar 2013 19:23:04 +0800 |
To make it clear about id and name in searching, the API is changed
a bit to distinguish them, and caller can choose to search by id or name.
Searching will be done with higher priority of id. This function also
returns negative value from bdrv_snapshot_list() instead of -ENOENT on
error now.
Signed-off-by: Wenchao Xia <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
block/snapshot.c | 46 ++++++++++++++++++++++++++++++++++++++--------
include/block/snapshot.h | 2 +-
savevm.c | 10 +++++-----
3 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/block/snapshot.c b/block/snapshot.c
index 8de73b4..1449b3d 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -13,8 +13,20 @@
#include "block/snapshot.h"
+/*
+ * Try find an internal snapshot with @id or @name, @id have higher priority
+ * in searching.
+ *
+ * @bs: block device to search on, must not be NULL.
+ * @sn_info: snapshot information to be filled in, must not be NULL.
+ * @id: snapshot id to search with, can be NULL.
+ * @name: snapshot name to search with, can be NULL.
+ *
+ * returns 0 and @sn_info is filled with related information if found,
+ * otherwise it returns negative value.
+ */
int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
- const char *name)
+ const char *id, const char *name)
{
QEMUSnapshotInfo *sn_tab, *sn;
int nb_sns, i, ret;
@@ -22,16 +34,34 @@ int bdrv_snapshot_find(BlockDriverState *bs,
QEMUSnapshotInfo *sn_info,
ret = -ENOENT;
nb_sns = bdrv_snapshot_list(bs, &sn_tab);
if (nb_sns < 0) {
- return ret;
+ return nb_sns;
}
- for (i = 0; i < nb_sns; i++) {
- sn = &sn_tab[i];
- if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) {
- *sn_info = *sn;
- ret = 0;
- break;
+
+ /* search by id */
+ if (id) {
+ for (i = 0; i < nb_sns; i++) {
+ sn = &sn_tab[i];
+ if (!strcmp(sn->id_str, id)) {
+ *sn_info = *sn;
+ ret = 0;
+ goto out;
+ }
}
}
+
+ /* search by name */
+ if (name) {
+ for (i = 0; i < nb_sns; i++) {
+ sn = &sn_tab[i];
+ if (!strcmp(sn->name, name)) {
+ *sn_info = *sn;
+ ret = 0;
+ goto out;
+ }
+ }
+ }
+
+ out:
g_free(sn_tab);
return ret;
}
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index 86891d1..fc9be7b 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -22,5 +22,5 @@
#include "block.h"
int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
- const char *name);
+ const char *id, const char *name);
#endif
diff --git a/savevm.c b/savevm.c
index 95f19ca..6557750 100644
--- a/savevm.c
+++ b/savevm.c
@@ -2073,7 +2073,7 @@ static int del_existing_snapshots(Monitor *mon, const
char *name)
bs = NULL;
while ((bs = bdrv_next(bs))) {
if (bdrv_can_snapshot(bs) &&
- bdrv_snapshot_find(bs, snapshot, name) >= 0)
+ bdrv_snapshot_find(bs, snapshot, name, name) >= 0)
{
ret = bdrv_snapshot_delete(bs, name);
if (ret < 0) {
@@ -2133,7 +2133,7 @@ void do_savevm(Monitor *mon, const QDict *qdict)
sn->vm_clock_nsec = qemu_get_clock_ns(vm_clock);
if (name) {
- ret = bdrv_snapshot_find(bs, old_sn, name);
+ ret = bdrv_snapshot_find(bs, old_sn, name, name);
if (ret >= 0) {
pstrcpy(sn->name, sizeof(sn->name), old_sn->name);
pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str);
@@ -2224,7 +2224,7 @@ int load_vmstate(const char *name)
}
/* Don't even try to load empty VM states */
- ret = bdrv_snapshot_find(bs_vm_state, &sn, name);
+ ret = bdrv_snapshot_find(bs_vm_state, &sn, name, name);
if (ret < 0) {
return ret;
} else if (sn.vm_state_size == 0) {
@@ -2248,7 +2248,7 @@ int load_vmstate(const char *name)
return -ENOTSUP;
}
- ret = bdrv_snapshot_find(bs, &sn, name);
+ ret = bdrv_snapshot_find(bs, &sn, name, name);
if (ret < 0) {
error_report("Device '%s' does not have the requested snapshot
'%s'",
bdrv_get_device_name(bs), name);
@@ -2354,7 +2354,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict)
while ((bs1 = bdrv_next(bs1))) {
if (bdrv_can_snapshot(bs1) && bs1 != bs) {
- ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str);
+ ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str, NULL);
if (ret < 0) {
available = 0;
break;
--
1.7.1
[Qemu-devel] [PATCH V9 03/14] qemu-img: remove unused parameter in collect_image_info(), Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 05/14] block: add snapshot info query function bdrv_query_snapshot_info_list(), Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 04/14] block: move collect_snapshots() and collect_image_info() to block/qapi.c, Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 06/14] block: add check for VM snapshot in bdrv_query_snapshot_info_list(), Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 02/14] block: distinguish id and name in bdrv_find_snapshot(),
Wenchao Xia <=
[Qemu-devel] [PATCH V9 09/14] qmp: add interface query-images, Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 07/14] block: add image info query function bdrv_query_image_info(), Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 10/14] hmp: add function hmp_info_snapshots(), Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 08/14] qmp: add interface query-snapshots, Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 11/14] hmp: switch snapshot info function to qmp based one, Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 12/14] block: move dump_human_image_info() to block/qapi.c, Wenchao Xia, 2013/03/11
[Qemu-devel] [PATCH V9 14/14] hmp: add command info images, Wenchao Xia, 2013/03/11