9ae3a8
From 5c10b431d0dd4538d33c21d7a46f7c8754f42a83 Mon Sep 17 00:00:00 2001
9ae3a8
From: Max Reitz <mreitz@redhat.com>
9ae3a8
Date: Wed, 6 Nov 2013 16:53:29 +0100
9ae3a8
Subject: [PATCH 72/87] qmp: add ImageInfo in BlockDeviceInfo used by query-block
9ae3a8
9ae3a8
RH-Author: Max Reitz <mreitz@redhat.com>
9ae3a8
Message-id: <1383756824-6921-7-git-send-email-mreitz@redhat.com>
9ae3a8
Patchwork-id: 55561
9ae3a8
O-Subject: [RHEL-7.0 qemu-kvm PATCH v2 06/21] qmp: add ImageInfo in BlockDeviceInfo used by query-block
9ae3a8
Bugzilla: 980771
9ae3a8
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
RH-Acked-by: Fam Zheng <famz@redhat.com>
9ae3a8
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
9ae3a8
9ae3a8
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
9ae3a8
9ae3a8
BZ: 980771
9ae3a8
9ae3a8
Now image info will be retrieved as an embbed json object inside
9ae3a8
BlockDeviceInfo, backing chain info and all related internal snapshot
9ae3a8
info can be got in the enhanced recursive structure of ImageInfo. New
9ae3a8
recursive member *backing-image is added to reflect the backing chain
9ae3a8
status.
9ae3a8
9ae3a8
Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
(cherry picked from commit 553a7e871822d933beaefbd596f0e4eed1614373)
9ae3a8
9ae3a8
Signed-off-by: Max Reitz <mreitz@redhat.com>
9ae3a8
---
9ae3a8
 block/qapi.c         | 50 ++++++++++++++++++++++++++++++++++---
9ae3a8
 include/block/qapi.h |  4 ++-
9ae3a8
 qapi-schema.json     | 10 ++++++--
9ae3a8
 qmp-commands.hx      | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++--
9ae3a8
 4 files changed, 125 insertions(+), 8 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 block/qapi.c         |   50 ++++++++++++++++++++++++++++++++++--
9ae3a8
 include/block/qapi.h |    4 ++-
9ae3a8
 qapi-schema.json     |   10 ++++++-
9ae3a8
 qmp-commands.hx      |   69 ++++++++++++++++++++++++++++++++++++++++++++++++-
9ae3a8
 4 files changed, 125 insertions(+), 8 deletions(-)
9ae3a8
9ae3a8
diff --git a/block/qapi.c b/block/qapi.c
9ae3a8
index e9d8b74..a4bc411 100644
9ae3a8
--- a/block/qapi.c
9ae3a8
+++ b/block/qapi.c
9ae3a8
@@ -94,6 +94,13 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
9ae3a8
  * @p_info: location to store image information
9ae3a8
  * @errp: location to store error information
9ae3a8
  *
9ae3a8
+ * Store "flat" image information in @p_info.
9ae3a8
+ *
9ae3a8
+ * "Flat" means it does *not* query backing image information,
9ae3a8
+ * i.e. (*pinfo)->has_backing_image will be set to false and
9ae3a8
+ * (*pinfo)->backing_image to NULL even when the image does in fact have
9ae3a8
+ * a backing image.
9ae3a8
+ *
9ae3a8
  * @p_info will be set only on success. On error, store error in @errp.
9ae3a8
  */
9ae3a8
 void bdrv_query_image_info(BlockDriverState *bs,
9ae3a8
@@ -167,9 +174,15 @@ void bdrv_query_image_info(BlockDriverState *bs,
9ae3a8
     *p_info = info;
9ae3a8
 }
9ae3a8
 
9ae3a8
-BlockInfo *bdrv_query_info(BlockDriverState *bs)
9ae3a8
+/* @p_info will be set only on success. */
9ae3a8
+void bdrv_query_info(BlockDriverState *bs,
9ae3a8
+                     BlockInfo **p_info,
9ae3a8
+                     Error **errp)
9ae3a8
 {
9ae3a8
     BlockInfo *info = g_malloc0(sizeof(*info));
9ae3a8
+    BlockDriverState *bs0;
9ae3a8
+    ImageInfo **p_image_info;
9ae3a8
+    Error *local_err = NULL;
9ae3a8
     info->device = g_strdup(bs->device_name);
9ae3a8
     info->type = g_strdup("unknown");
9ae3a8
     info->locked = bdrv_dev_is_medium_locked(bs);
9ae3a8
@@ -223,8 +236,30 @@ BlockInfo *bdrv_query_info(BlockDriverState *bs)
9ae3a8
             info->inserted->iops_wr =
9ae3a8
                            bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE];
9ae3a8
         }
9ae3a8
+
9ae3a8
+        bs0 = bs;
9ae3a8
+        p_image_info = &info->inserted->image;
9ae3a8
+        while (1) {
9ae3a8
+            bdrv_query_image_info(bs0, p_image_info, &local_err);
9ae3a8
+            if (error_is_set(&local_err)) {
9ae3a8
+                error_propagate(errp, local_err);
9ae3a8
+                goto err;
9ae3a8
+            }
9ae3a8
+            if (bs0->drv && bs0->backing_hd) {
9ae3a8
+                bs0 = bs0->backing_hd;
9ae3a8
+                (*p_image_info)->has_backing_image = true;
9ae3a8
+                p_image_info = &((*p_image_info)->backing_image);
9ae3a8
+            } else {
9ae3a8
+                break;
9ae3a8
+            }
9ae3a8
+        }
9ae3a8
     }
9ae3a8
-    return info;
9ae3a8
+
9ae3a8
+    *p_info = info;
9ae3a8
+    return;
9ae3a8
+
9ae3a8
+ err:
9ae3a8
+    qapi_free_BlockInfo(info);
9ae3a8
 }
9ae3a8
 
9ae3a8
 BlockStats *bdrv_query_stats(const BlockDriverState *bs)
9ae3a8
@@ -261,16 +296,25 @@ BlockInfoList *qmp_query_block(Error **errp)
9ae3a8
 {
9ae3a8
     BlockInfoList *head = NULL, **p_next = &head;
9ae3a8
     BlockDriverState *bs = NULL;
9ae3a8
+    Error *local_err = NULL;
9ae3a8
 
9ae3a8
      while ((bs = bdrv_next(bs))) {
9ae3a8
         BlockInfoList *info = g_malloc0(sizeof(*info));
9ae3a8
-        info->value = bdrv_query_info(bs);
9ae3a8
+        bdrv_query_info(bs, &info->value, &local_err);
9ae3a8
+        if (error_is_set(&local_err)) {
9ae3a8
+            error_propagate(errp, local_err);
9ae3a8
+            goto err;
9ae3a8
+        }
9ae3a8
 
9ae3a8
         *p_next = info;
9ae3a8
         p_next = &info->next;
9ae3a8
     }
9ae3a8
 
9ae3a8
     return head;
9ae3a8
+
9ae3a8
+ err:
9ae3a8
+    qapi_free_BlockInfoList(head);
9ae3a8
+    return NULL;
9ae3a8
 }
9ae3a8
 
9ae3a8
 BlockStatsList *qmp_query_blockstats(Error **errp)
9ae3a8
diff --git a/include/block/qapi.h b/include/block/qapi.h
9ae3a8
index ab1f48f..0496cc9 100644
9ae3a8
--- a/include/block/qapi.h
9ae3a8
+++ b/include/block/qapi.h
9ae3a8
@@ -35,7 +35,9 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
9ae3a8
 void bdrv_query_image_info(BlockDriverState *bs,
9ae3a8
                            ImageInfo **p_info,
9ae3a8
                            Error **errp);
9ae3a8
-BlockInfo *bdrv_query_info(BlockDriverState *s);
9ae3a8
+void bdrv_query_info(BlockDriverState *bs,
9ae3a8
+                     BlockInfo **p_info,
9ae3a8
+                     Error **errp);
9ae3a8
 BlockStats *bdrv_query_stats(const BlockDriverState *bs);
9ae3a8
 
9ae3a8
 void bdrv_snapshot_dump(fprintf_function func_fprintf, void *f,
9ae3a8
diff --git a/qapi-schema.json b/qapi-schema.json
9ae3a8
index 32b41b0..4091b99 100644
9ae3a8
--- a/qapi-schema.json
9ae3a8
+++ b/qapi-schema.json
9ae3a8
@@ -236,6 +236,8 @@
9ae3a8
 #
9ae3a8
 # @snapshots: #optional list of VM snapshots
9ae3a8
 #
9ae3a8
+# @backing-image: #optional info of the backing image (since 1.6)
9ae3a8
+#
9ae3a8
 # Since: 1.3
9ae3a8
 #
9ae3a8
 ##
9ae3a8
@@ -245,7 +247,8 @@
9ae3a8
            '*actual-size': 'int', 'virtual-size': 'int',
9ae3a8
            '*cluster-size': 'int', '*encrypted': 'bool',
9ae3a8
            '*backing-filename': 'str', '*full-backing-filename': 'str',
9ae3a8
-           '*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'] } }
9ae3a8
+           '*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'],
9ae3a8
+           '*backing-image': 'ImageInfo' } }
9ae3a8
 
9ae3a8
 ##
9ae3a8
 # @ImageCheck:
9ae3a8
@@ -768,6 +771,8 @@
9ae3a8
 #
9ae3a8
 # @iops_wr: write I/O operations per second is specified
9ae3a8
 #
9ae3a8
+# @image: the info of image used (since: 1.6)
9ae3a8
+#
9ae3a8
 # Since: 0.14.0
9ae3a8
 #
9ae3a8
 # Notes: This interface is only found in @BlockInfo.
9ae3a8
@@ -777,7 +782,8 @@
9ae3a8
             '*backing_file': 'str', 'backing_file_depth': 'int',
9ae3a8
             'encrypted': 'bool', 'encryption_key_missing': 'bool',
9ae3a8
             'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
9ae3a8
-            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int'} }
9ae3a8
+            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int',
9ae3a8
+            'image': 'ImageInfo' } }
9ae3a8
 
9ae3a8
 ##
9ae3a8
 # @BlockDeviceIoStatus:
9ae3a8
diff --git a/qmp-commands.hx b/qmp-commands.hx
9ae3a8
index d1f6f8b..f71c34e 100644
9ae3a8
--- a/qmp-commands.hx
9ae3a8
+++ b/qmp-commands.hx
9ae3a8
@@ -1713,6 +1713,47 @@ Each json-object contain the following:
9ae3a8
          - "iops": limit total I/O operations per second (json-int)
9ae3a8
          - "iops_rd": limit read operations per second (json-int)
9ae3a8
          - "iops_wr": limit write operations per second (json-int)
9ae3a8
+         - "image": the detail of the image, it is a json-object containing
9ae3a8
+            the following:
9ae3a8
+             - "filename": image file name (json-string)
9ae3a8
+             - "format": image format (json-string)
9ae3a8
+             - "virtual-size": image capacity in bytes (json-int)
9ae3a8
+             - "dirty-flag": true if image is not cleanly closed, not present
9ae3a8
+                             means clean (json-bool, optional)
9ae3a8
+             - "actual-size": actual size on disk in bytes of the image, not
9ae3a8
+                              present when image does not support thin
9ae3a8
+                              provision (json-int, optional)
9ae3a8
+             - "cluster-size": size of a cluster in bytes, not present if image
9ae3a8
+                               format does not support it (json-int, optional)
9ae3a8
+             - "encrypted": true if the image is encrypted, not present means
9ae3a8
+                            false or the image format does not support
9ae3a8
+                            encryption (json-bool, optional)
9ae3a8
+             - "backing_file": backing file name, not present means no backing
9ae3a8
+                               file is used or the image format does not
9ae3a8
+                               support backing file chain
9ae3a8
+                               (json-string, optional)
9ae3a8
+             - "full-backing-filename": full path of the backing file, not
9ae3a8
+                                        present if it equals backing_file or no
9ae3a8
+                                        backing file is used
9ae3a8
+                                        (json-string, optional)
9ae3a8
+             - "backing-filename-format": the format of the backing file, not
9ae3a8
+                                          present means unknown or no backing
9ae3a8
+                                          file (json-string, optional)
9ae3a8
+             - "snapshots": the internal snapshot info, it is an optional list
9ae3a8
+                of json-object containing the following:
9ae3a8
+                 - "id": unique snapshot id (json-string)
9ae3a8
+                 - "name": snapshot name (json-string)
9ae3a8
+                 - "vm-state-size": size of the VM state in bytes (json-int)
9ae3a8
+                 - "date-sec": UTC date of the snapshot in seconds (json-int)
9ae3a8
+                 - "date-nsec": fractional part in nanoseconds to be used with
9ae3a8
+                                date-sec(json-int)
9ae3a8
+                 - "vm-clock-sec": VM clock relative to boot in seconds
9ae3a8
+                                   (json-int)
9ae3a8
+                 - "vm-clock-nsec": fractional part in nanoseconds to be used
9ae3a8
+                                    with vm-clock-sec (json-int)
9ae3a8
+             - "backing-image": the detail of the backing image, it is an
9ae3a8
+                                optional json-object only present when a
9ae3a8
+                                backing image present for this image
9ae3a8
 
9ae3a8
 - "io-status": I/O operation status, only present if the device supports it
9ae3a8
                and the VM is configured to stop on errors. It's always reset
9ae3a8
@@ -1733,14 +1774,38 @@ Example:
9ae3a8
                "ro":false,
9ae3a8
                "drv":"qcow2",
9ae3a8
                "encrypted":false,
9ae3a8
-               "file":"disks/test.img",
9ae3a8
-               "backing_file_depth":0,
9ae3a8
+               "file":"disks/test.qcow2",
9ae3a8
+               "backing_file_depth":1,
9ae3a8
                "bps":1000000,
9ae3a8
                "bps_rd":0,
9ae3a8
                "bps_wr":0,
9ae3a8
                "iops":1000000,
9ae3a8
                "iops_rd":0,
9ae3a8
                "iops_wr":0,
9ae3a8
+               "image":{
9ae3a8
+                  "filename":"disks/test.qcow2",
9ae3a8
+                  "format":"qcow2",
9ae3a8
+                  "virtual-size":2048000,
9ae3a8
+                  "backing_file":"base.qcow2",
9ae3a8
+                  "full-backing-filename":"disks/base.qcow2",
9ae3a8
+                  "backing-filename-format:"qcow2",
9ae3a8
+                  "snapshots":[
9ae3a8
+                     {
9ae3a8
+                        "id": "1",
9ae3a8
+                        "name": "snapshot1",
9ae3a8
+                        "vm-state-size": 0,
9ae3a8
+                        "date-sec": 10000200,
9ae3a8
+                        "date-nsec": 12,
9ae3a8
+                        "vm-clock-sec": 206,
9ae3a8
+                        "vm-clock-nsec": 30
9ae3a8
+                     }
9ae3a8
+                  ],
9ae3a8
+                  "backing-image":{
9ae3a8
+                      "filename":"disks/base.qcow2",
9ae3a8
+                      "format":"qcow2",
9ae3a8
+                      "virtual-size":2048000
9ae3a8
+                  }
9ae3a8
+               }
9ae3a8
             },
9ae3a8
             "type":"unknown"
9ae3a8
          },
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8