All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, aliguori@us.ibm.com, capitulino@redhat.com,
	stefanha@gmail.com, armbru@redhat.com, pbonzini@redhat.com,
	Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH V8 07/20] block: add snapshot info query function bdrv_query_snapshot_info_list()
Date: Thu,  7 Mar 2013 14:07:12 +0800	[thread overview]
Message-ID: <1362636445-7188-8-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1362636445-7188-1-git-send-email-xiawenc@linux.vnet.ibm.com>

  This patch adds function bdrv_query_snapshot_info_list(), which will
retrieve snapshot info of an image in qmp object format. The implementation
is based on the code moved from qemu-img.c with modification to fit more
for qmp based block layer API.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 block/qapi.c         |   52 +++++++++++++++++++++++++++++++++++++------------
 include/block/qapi.h |    4 ++-
 qemu-img.c           |    4 ++-
 3 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/block/qapi.c b/block/qapi.c
index 643839c..b503cfa 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -14,29 +14,53 @@
 #include "block/qapi.h"
 #include "block/block_int.h"
 
-void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
+/* return 0 on success, and @p_list will be set only on success. */
+int bdrv_query_snapshot_info_list(BlockDriverState *bs,
+                                  SnapshotInfoList **p_list,
+                                  Error **errp)
 {
     int i, sn_count;
     QEMUSnapshotInfo *sn_tab = NULL;
-    SnapshotInfoList *info_list, *cur_item = NULL;
+    SnapshotInfoList *info_list, *cur_item = NULL, *head = NULL;
+    SnapshotInfo *info;
+
     sn_count = bdrv_snapshot_list(bs, &sn_tab);
+    if (sn_count < 0) {
+        const char *dev = bdrv_get_device_name(bs);
+        switch (sn_count) {
+        case -ENOMEDIUM:
+            error_setg(errp, "Device '%s' is not inserted", dev);
+            break;
+        case -ENOTSUP:
+            error_setg(errp,
+                       "Device '%s' does not support internal snapshots",
+                       dev);
+            break;
+        default:
+            error_setg(errp, "Can't list snapshots of device '%s': %s",
+                       dev, strerror(-sn_count));
+            break;
+        }
+        return sn_count;
+    }
 
     for (i = 0; i < sn_count; i++) {
-        info->has_snapshots = true;
-        info_list = g_new0(SnapshotInfoList, 1);
 
-        info_list->value                = g_new0(SnapshotInfo, 1);
-        info_list->value->id            = g_strdup(sn_tab[i].id_str);
-        info_list->value->name          = g_strdup(sn_tab[i].name);
-        info_list->value->vm_state_size = sn_tab[i].vm_state_size;
-        info_list->value->date_sec      = sn_tab[i].date_sec;
-        info_list->value->date_nsec     = sn_tab[i].date_nsec;
-        info_list->value->vm_clock_sec  = sn_tab[i].vm_clock_nsec / 1000000000;
-        info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
+        info = g_new0(SnapshotInfo, 1);
+        info->id            = g_strdup(sn_tab[i].id_str);
+        info->name          = g_strdup(sn_tab[i].name);
+        info->vm_state_size = sn_tab[i].vm_state_size;
+        info->date_sec      = sn_tab[i].date_sec;
+        info->date_nsec     = sn_tab[i].date_nsec;
+        info->vm_clock_sec  = sn_tab[i].vm_clock_nsec / 1000000000;
+        info->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
+
+        info_list = g_new0(SnapshotInfoList, 1);
+        info_list->value = info;
 
         /* XXX: waiting for the qapi to support qemu-queue.h types */
         if (!cur_item) {
-            info->snapshots = cur_item = info_list;
+            head = cur_item = info_list;
         } else {
             cur_item->next = info_list;
             cur_item = info_list;
@@ -45,6 +69,8 @@ void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
     }
 
     g_free(sn_tab);
+    *p_list = head;
+    return 0;
 }
 
 void bdrv_collect_image_info(BlockDriverState *bs,
diff --git a/include/block/qapi.h b/include/block/qapi.h
index a126768..030964b 100644
--- a/include/block/qapi.h
+++ b/include/block/qapi.h
@@ -4,7 +4,9 @@
 #include "qapi-types.h"
 #include "block/block.h"
 
-void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info);
+int bdrv_query_snapshot_info_list(BlockDriverState *bs,
+                                  SnapshotInfoList **p_list,
+                                  Error **errp);
 void bdrv_collect_image_info(BlockDriverState *bs,
                              ImageInfo *info,
                              const char *filename,
diff --git a/qemu-img.c b/qemu-img.c
index bbc8f5b..32a72f5 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1735,7 +1735,9 @@ static ImageInfoList *collect_image_info_list(const char *filename,
 
         info = g_new0(ImageInfo, 1);
         bdrv_collect_image_info(bs, info, filename, fmt);
-        bdrv_collect_snapshots(bs, info);
+        if (!bdrv_query_snapshot_info_list(bs, &info->snapshots, NULL)) {
+            info->has_snapshots = true;
+        }
 
         elem = g_new0(ImageInfoList, 1);
         elem->value = info;
-- 
1.7.1

  parent reply	other threads:[~2013-03-07  6:09 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-07  6:07 [Qemu-devel] [PATCH V8 00/20] qmp/hmp interfaces for internal snapshot info Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 01/20] build: add block/snapshot.c Wenchao Xia
2013-03-08 20:18   ` Eric Blake
2013-03-09  4:00     ` Wenchao Xia
2013-03-09 13:10       ` Eric Blake
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 02/20] build: add block/qapi.c Wenchao Xia
2013-03-08 20:22   ` Eric Blake
2013-03-09  4:05     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 03/20] block: move bdrv_snapshot_find() to block/snapshot.c Wenchao Xia
2013-03-08 20:27   ` Eric Blake
2013-03-09  4:17     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 04/20] block: distinguish id and name in bdrv_find_snapshot() Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 05/20] qemu-img: remove unused parameter in collect_image_info() Wenchao Xia
2013-03-08 20:34   ` Eric Blake
2013-03-09  4:18     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 06/20] block: move collect_snapshots() and collect_image_info() to block/qapi.c Wenchao Xia
2013-03-08 22:04   ` Eric Blake
2013-03-09  4:20     ` Wenchao Xia
2013-03-07  6:07 ` Wenchao Xia [this message]
2013-03-08 22:15   ` [Qemu-devel] [PATCH V8 07/20] block: add snapshot info query function bdrv_query_snapshot_info_list() Eric Blake
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 08/20] block: add filter for vm snapshot in bdrv_query_snapshot_info_list() Wenchao Xia
2013-03-08 22:55   ` Eric Blake
2013-03-09  4:24     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 09/20] block: add image info query function bdrv_query_image_info() Wenchao Xia
2013-03-08 23:08   ` Eric Blake
2013-03-09  4:26     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 10/20] qmp: add interface query-snapshots Wenchao Xia
2013-03-08 23:30   ` Eric Blake
2013-03-09  4:28     ` Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 11/20] qmp: add interface query-images Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 12/20] hmp: add function hmp_info_snapshots() Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 13/20] hmp: switch snapshot info function to qmp based one Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 14/20] block: move dump_human_image_info() to block/qapi.c Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 15/20] block: dump to buffer for bdrv_image_info_dump() Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 16/20] hmp: add command info images Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 17/20] block: return bool for bdrv_can_snapshot() Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 18/20] block: move snapshot related functions to block/snapshot.c Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 19/20] block: move bdrv_snapshot_dump() to block/qapi.c Wenchao Xia
2013-03-07  6:07 ` [Qemu-devel] [PATCH V8 20/20] block: rename bdrv_query_info() to bdrv_query_block_info() Wenchao Xia
2013-03-07  7:36 ` [Qemu-devel] [PATCH V8 00/20] qmp/hmp interfaces for internal snapshot info Markus Armbruster
2013-03-11  1:24   ` Wenchao Xia
2013-03-11  8:34     ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1362636445-7188-8-git-send-email-xiawenc@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=capitulino@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.