cryptospore / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
218e99
From c4aaafbe296b0e38a54191d294436ffd718a2c7b Mon Sep 17 00:00:00 2001
218e99
From: Max Reitz <mreitz@redhat.com>
218e99
Date: Wed, 6 Nov 2013 16:53:27 +0100
218e99
Subject: [PATCH 70/87] block: add snapshot info query function bdrv_query_snapshot_info_list()
218e99
218e99
RH-Author: Max Reitz <mreitz@redhat.com>
218e99
Message-id: <1383756824-6921-5-git-send-email-mreitz@redhat.com>
218e99
Patchwork-id: 55559
218e99
O-Subject: [RHEL-7.0 qemu-kvm PATCH v2 04/21] block: add snapshot info query function bdrv_query_snapshot_info_list()
218e99
Bugzilla: 980771
218e99
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
218e99
RH-Acked-by: Fam Zheng <famz@redhat.com>
218e99
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
218e99
218e99
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
218e99
218e99
BZ: 980771
218e99
218e99
This patch adds function bdrv_query_snapshot_info_list(), which will
218e99
retrieve snapshot info of an image in qmp object format. The implementation
218e99
is based on the code moved from qemu-img.c with modification to fit more
218e99
for qmp based block layer API.
218e99
218e99
Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
218e99
Reviewed-by: Eric Blake <eblake@redhat.com>
218e99
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
218e99
(cherry picked from commit fb0ed4539c6f02fa9e5a3cf9df2549713451eeca)
218e99
218e99
Signed-off-by: Max Reitz <mreitz@redhat.com>
218e99
---
218e99
 block/qapi.c         | 55 +++++++++++++++++++++++++++++++++++++++-------------
218e99
 include/block/qapi.h |  4 +++-
218e99
 qemu-img.c           |  5 ++++-
218e99
 3 files changed, 49 insertions(+), 15 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 block/qapi.c         |   55 ++++++++++++++++++++++++++++++++++++++-----------
218e99
 include/block/qapi.h |    4 ++-
218e99
 qemu-img.c           |    5 +++-
218e99
 3 files changed, 49 insertions(+), 15 deletions(-)
218e99
218e99
diff --git a/block/qapi.c b/block/qapi.c
218e99
index 794dbf8..1ed56da 100644
218e99
--- a/block/qapi.c
218e99
+++ b/block/qapi.c
218e99
@@ -26,29 +26,56 @@
218e99
 #include "block/block_int.h"
218e99
 #include "qmp-commands.h"
218e99
 
218e99
-void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
218e99
+/*
218e99
+ * Returns 0 on success, with *p_list either set to describe snapshot
218e99
+ * information, or NULL because there are no snapshots.  Returns -errno on
218e99
+ * error, with *p_list untouched.
218e99
+ */
218e99
+int bdrv_query_snapshot_info_list(BlockDriverState *bs,
218e99
+                                  SnapshotInfoList **p_list,
218e99
+                                  Error **errp)
218e99
 {
218e99
     int i, sn_count;
218e99
     QEMUSnapshotInfo *sn_tab = NULL;
218e99
-    SnapshotInfoList *info_list, *cur_item = NULL;
218e99
+    SnapshotInfoList *info_list, *cur_item = NULL, *head = NULL;
218e99
+    SnapshotInfo *info;
218e99
+
218e99
     sn_count = bdrv_snapshot_list(bs, &sn_tab);
218e99
+    if (sn_count < 0) {
218e99
+        const char *dev = bdrv_get_device_name(bs);
218e99
+        switch (sn_count) {
218e99
+        case -ENOMEDIUM:
218e99
+            error_setg(errp, "Device '%s' is not inserted", dev);
218e99
+            break;
218e99
+        case -ENOTSUP:
218e99
+            error_setg(errp,
218e99
+                       "Device '%s' does not support internal snapshots",
218e99
+                       dev);
218e99
+            break;
218e99
+        default:
218e99
+            error_setg_errno(errp, -sn_count,
218e99
+                             "Can't list snapshots of device '%s'", dev);
218e99
+            break;
218e99
+        }
218e99
+        return sn_count;
218e99
+    }
218e99
 
218e99
     for (i = 0; i < sn_count; i++) {
218e99
-        info->has_snapshots = true;
218e99
-        info_list = g_new0(SnapshotInfoList, 1);
218e99
+        info = g_new0(SnapshotInfo, 1);
218e99
+        info->id            = g_strdup(sn_tab[i].id_str);
218e99
+        info->name          = g_strdup(sn_tab[i].name);
218e99
+        info->vm_state_size = sn_tab[i].vm_state_size;
218e99
+        info->date_sec      = sn_tab[i].date_sec;
218e99
+        info->date_nsec     = sn_tab[i].date_nsec;
218e99
+        info->vm_clock_sec  = sn_tab[i].vm_clock_nsec / 1000000000;
218e99
+        info->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
218e99
 
218e99
-        info_list->value                = g_new0(SnapshotInfo, 1);
218e99
-        info_list->value->id            = g_strdup(sn_tab[i].id_str);
218e99
-        info_list->value->name          = g_strdup(sn_tab[i].name);
218e99
-        info_list->value->vm_state_size = sn_tab[i].vm_state_size;
218e99
-        info_list->value->date_sec      = sn_tab[i].date_sec;
218e99
-        info_list->value->date_nsec     = sn_tab[i].date_nsec;
218e99
-        info_list->value->vm_clock_sec  = sn_tab[i].vm_clock_nsec / 1000000000;
218e99
-        info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
218e99
+        info_list = g_new0(SnapshotInfoList, 1);
218e99
+        info_list->value = info;
218e99
 
218e99
         /* XXX: waiting for the qapi to support qemu-queue.h types */
218e99
         if (!cur_item) {
218e99
-            info->snapshots = cur_item = info_list;
218e99
+            head = cur_item = info_list;
218e99
         } else {
218e99
             cur_item->next = info_list;
218e99
             cur_item = info_list;
218e99
@@ -57,6 +84,8 @@ void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
218e99
     }
218e99
 
218e99
     g_free(sn_tab);
218e99
+    *p_list = head;
218e99
+    return 0;
218e99
 }
218e99
 
218e99
 void bdrv_collect_image_info(BlockDriverState *bs,
218e99
diff --git a/include/block/qapi.h b/include/block/qapi.h
218e99
index e6e568d..4f223d1 100644
218e99
--- a/include/block/qapi.h
218e99
+++ b/include/block/qapi.h
218e99
@@ -29,7 +29,9 @@
218e99
 #include "block/block.h"
218e99
 #include "block/snapshot.h"
218e99
 
218e99
-void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info);
218e99
+int bdrv_query_snapshot_info_list(BlockDriverState *bs,
218e99
+                                  SnapshotInfoList **p_list,
218e99
+                                  Error **errp);
218e99
 void bdrv_collect_image_info(BlockDriverState *bs,
218e99
                              ImageInfo *info,
218e99
                              const char *filename);
218e99
diff --git a/qemu-img.c b/qemu-img.c
218e99
index 97b4212..e1fb148 100644
218e99
--- a/qemu-img.c
218e99
+++ b/qemu-img.c
218e99
@@ -1686,7 +1686,10 @@ static ImageInfoList *collect_image_info_list(const char *filename,
218e99
 
218e99
         info = g_new0(ImageInfo, 1);
218e99
         bdrv_collect_image_info(bs, info, filename);
218e99
-        bdrv_collect_snapshots(bs, info);
218e99
+        bdrv_query_snapshot_info_list(bs, &info->snapshots, NULL);
218e99
+        if (info->snapshots) {
218e99
+            info->has_snapshots = true;
218e99
+        }
218e99
 
218e99
         elem = g_new0(ImageInfoList, 1);
218e99
         elem->value = info;
218e99
-- 
218e99
1.7.1
218e99