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 11/20] qmp: add interface query-images
Date: Thu,  7 Mar 2013 14:07:16 +0800	[thread overview]
Message-ID: <1362636445-7188-12-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1362636445-7188-1-git-send-email-xiawenc@linux.vnet.ibm.com>

  This mirror function will return image info including snapshots,
if specified backing image's info will also be returned. Now Qemu
have both query-images and query-block interfaces.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 block/qapi.c     |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 qapi-schema.json |   33 ++++++++++++++++++++
 qmp-commands.hx  |   86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 202 insertions(+), 0 deletions(-)

diff --git a/block/qapi.c b/block/qapi.c
index b903dd8..a67d380 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -202,3 +202,86 @@ SnapshotInfoList *qmp_query_snapshots(Error **errp)
     }
     return list;
 }
+
+/* Collect all info for one bs, p_list point to the empty tail to be filled,
+   return the empty tail of the new list. @bs must be the top one. */
+static DeviceImageInfoList **
+collect_device_image_info_list(BlockDriverState *bs,
+                               bool show_backing,
+                               DeviceImageInfoList **p_list,
+                               Error **errp)
+{
+    DeviceImageInfoList **p_next = p_list;
+    char *device_name = bs->device_name;
+
+    while (bs) {
+        DeviceImageInfo *dii = g_malloc0(sizeof(*dii));
+        DeviceImageInfoList *diil = g_malloc0(sizeof(*diil));
+        diil->value = dii;
+        *p_next = diil;
+        p_next = &diil->next;
+
+        dii->device = g_strdup(device_name);
+        if (!bdrv_is_inserted(bs)) {
+            dii->has_image = false;
+            break;
+        }
+        dii->has_image = true;
+        if (bdrv_query_image_info(bs, &dii->image, errp)) {
+            break;
+        }
+
+        if (show_backing && bs->drv && bs->backing_hd) {
+            bs = bs->backing_hd;
+        } else {
+            bs = NULL;
+        }
+    }
+    return p_next;
+}
+
+DeviceImageInfoList *qmp_query_images(bool has_device,
+                                      const char *device,
+                                      bool has_backing,
+                                      bool backing,
+                                      Error **errp)
+{
+    DeviceImageInfoList *head = NULL, **p_next = &head;
+    BlockDriverState *bs = NULL;
+    Error *err = NULL;
+    const char *target_device = NULL;
+    bool show_backing = false;
+
+    if (has_device) {
+        target_device = device;
+    }
+    if (has_backing) {
+        show_backing = backing;
+    }
+
+    if (target_device) {
+        bs = bdrv_find(device);
+        if (!bs) {
+            error_set(errp, QERR_DEVICE_NOT_FOUND, device);
+            return NULL;
+        }
+        collect_device_image_info_list(bs, show_backing, p_next, errp);
+        if (error_is_set(&err)) {
+            goto err;
+        }
+    } else {
+        while ((bs = bdrv_next(bs))) {
+            p_next = collect_device_image_info_list(bs, show_backing,
+                                                    p_next, errp);
+            if (error_is_set(&err)) {
+                goto err;
+            }
+        }
+    }
+
+    return head;
+
+ err:
+    qapi_free_DeviceImageInfoList(head);
+    return NULL;
+}
diff --git a/qapi-schema.json b/qapi-schema.json
index 3710495..71a9eba 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -294,6 +294,21 @@
            '*total-clusters': 'int', '*allocated-clusters': 'int',
            '*fragmented-clusters': 'int', '*compressed-clusters': 'int' } }
 
+# @DeviceImageInfo:
+#
+# Information about an image used by a QEMU block device
+#
+# @device: name of the block device
+#
+# @image: #optional info of the image used
+#
+# Since: 1.5
+#
+##
+
+{ 'type': 'DeviceImageInfo',
+  'data': {'device': 'str', '*image': 'ImageInfo' } }
+
 ##
 # @StatusInfo:
 #
@@ -853,6 +868,24 @@
   'returns': ['SnapshotInfo'] }
 
 ##
+# @query-images:
+#
+# Get block device image information
+#
+# @device: #optional the name of the device to get image info from. If not
+#          specified, all block devices will be queried
+# @backing: #optional true to show information on backing images, false or
+#          omitted to show just the top image of a block device
+#
+# Returns: a list of @DeviceImageInfo describing each virtual block device
+#
+# Since: 1.5
+##
+{ 'command': 'query-images',
+  'data': { '*device': 'str', '*backing': 'bool' },
+  'returns': ['DeviceImageInfo'] }
+
+##
 # @BlockDeviceStats:
 #
 # Statistics of a virtual block device or a block backing device.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index d505209..f0482c2 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1798,6 +1798,92 @@ EQMP
     },
 
 SQMP
+query-images
+-----------
+
+Show block device image information
+
+Each device is represented by a json-object. The returned value is a json-array
+of all devices' images
+
+Each json-object contain the following:
+
+- "device": device name (json-string)
+- "image": image information(json-object, optional) containing:
+         - "filename": image file name (json-string)
+         - "format": image format (json-string)
+         - "virtual-size": image capacity in bytes (json-int)
+         - "dirty-flag": true if image is not cleanly closed, not present means
+                         clean (json-bool, optional)
+         - "actual-size": actual size on disk in bytes of the image, not
+                          present when image does not support thin provision
+                          (json-int, optional)
+         - "cluster-size": size of a cluster in bytes, only present when image
+                           format support cluster (json-int, optional)
+         - "encrypted": true if the image is encrypted, only present when image
+                        support encryption (json-bool, optional)
+         - "backing_file": backing file name, only present when image format
+                           support backing file chain (json-string, optional)
+         - "full-backing-filename": full path of the backing file
+                                    (json-string, optional)
+         - "backing-filename-format": the format of the backing file
+                                      (json-string, optional)
+         - "snapshots": the internal snapshot info, it is an optional list of
+            json-object containing the following:
+             - "id": unique snapshot id (json-string)
+             - "name": snapshot name (json-string)
+             - "vm-state-size": size of the VM state in bytes (json-int)
+             - "date-sec": UTC date of the snapshot in seconds (json-int)
+             - "date-nsec": fractional part in nano seconds to be used with
+                            date-sec(json-int)
+             - "vm-clock-sec": VM clock relative to boot in seconds (json-int)
+             - "vm-clock-nsec": fractional part in nano seconds to be used with
+                                vm-clock-sec (json-int)
+
+Example:
+
+-> { "execute": "query-images" }
+<- {
+      "return":[
+         {
+            "device":"ide0-hd0",
+            "image":{
+               "filename":"disks/test0.img",
+               "format":"qcow2",
+               "virtual-size":1024000
+            }
+         },
+         {
+            "device":"ide0-hd1",
+            "image":{
+               "filename":"disks/test1.img",
+               "format":"qcow2",
+               "virtual-size":2048000,
+               "snapshots":[
+                  {
+                     "id": "1",
+                     "name": "snapshot1",
+                     "vm-state-size": 0,
+                     "date-sec": 10000200,
+                     "date-nsec": 12,
+                     "vm-clock-sec": 206,
+                     "vm-clock-nsec": 30
+                  }
+               ]
+            }
+         }
+      ]
+   }
+
+EQMP
+
+    {
+        .name       = "query-images",
+        .args_type  = "device:B?, backing:-b",
+        .mhandler.cmd_new = qmp_marshal_input_query_images,
+    },
+
+SQMP
 query-blockstats
 ----------------
 
-- 
1.7.1

  parent reply	other threads:[~2013-03-07  6:10 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 ` [Qemu-devel] [PATCH V8 07/20] block: add snapshot info query function bdrv_query_snapshot_info_list() Wenchao Xia
2013-03-08 22:15   ` 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 ` Wenchao Xia [this message]
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-12-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.