Patchwork [V11,11/17] qmp: add ImageInfo in BlockDeviceInfo used by query-block

login
register
mail settings
Submitter Wayne Xia
Date April 2, 2013, 11:47 a.m.
Message ID <1364903250-10429-12-git-send-email-xiawenc@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/232979/
State New
Headers show

Comments

Wayne Xia - April 2, 2013, 11:47 a.m.
Now image info will be retrieved as an embbed json object inside
BlockDeviceInfo, backing chain info and all related internal snapshot
info can be got in the enhanced recursive structure of ImageInfo.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 block/qapi.c         |   38 ++++++++++++++++++++++++++--
 include/block/qapi.h |    4 ++-
 qapi-schema.json     |    5 +++-
 qmp-commands.hx      |   67 +++++++++++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 108 insertions(+), 6 deletions(-)
Kevin Wolf - April 8, 2013, 10:04 a.m.
Am 02.04.2013 um 13:47 hat Wenchao Xia geschrieben:
>   Now image info will be retrieved as an embbed json object inside
> BlockDeviceInfo, backing chain info and all related internal snapshot
> info can be got in the enhanced recursive structure of ImageInfo.
> 
> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> ---
>  block/qapi.c         |   38 ++++++++++++++++++++++++++--
>  include/block/qapi.h |    4 ++-
>  qapi-schema.json     |    5 +++-
>  qmp-commands.hx      |   67 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  4 files changed, 108 insertions(+), 6 deletions(-)
> 
> diff --git a/block/qapi.c b/block/qapi.c
> index fa61c85..e98a028 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -202,9 +202,14 @@ int bdrv_query_image_info(BlockDriverState *bs,
>      return 0;
>  }
>  
> -BlockInfo *bdrv_query_info(BlockDriverState *bs)
> +/* @p_info will be set only on success. */
> +void bdrv_query_info(BlockDriverState *bs,
> +                     BlockInfo **p_info,
> +                     Error **errp)
>  {
>      BlockInfo *info = g_malloc0(sizeof(*info));
> +    BlockDriverState *bs0;
> +    ImageInfo **p_image_info;
>      info->device = g_strdup(bs->device_name);
>      info->type = g_strdup("unknown");
>      info->locked = bdrv_dev_is_medium_locked(bs);
> @@ -258,8 +263,28 @@ BlockInfo *bdrv_query_info(BlockDriverState *bs)
>              info->inserted->iops_wr =
>                             bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE];
>          }
> +
> +        bs0 = bs;
> +        p_image_info = &info->inserted->image;
> +        while (1) {
> +            if (bdrv_query_image_info(bs0, p_image_info, errp)) {
> +                goto err;
> +            }
> +            if (bs0->drv && bs0->backing_hd) {
> +                bs0 = bs0->backing_hd;
> +                (*p_image_info)->has_backing_image = true;
> +                p_image_info = &((*p_image_info)->backing_image);
> +            } else {
> +                break;
> +            }
> +        }
>      }
> -    return info;
> +
> +    *p_info = info;
> +    return;
> +
> + err:
> +    qapi_free_BlockInfo(info);
>  }
>  
>  SnapshotInfoList *qmp_query_snapshots(Error **errp)
> @@ -286,11 +311,18 @@ BlockInfoList *qmp_query_block(Error **errp)
>  
>      while ((bs = bdrv_next(bs))) {
>          BlockInfoList *info = g_malloc0(sizeof(*info));
> -        info->value = bdrv_query_info(bs);
> +        bdrv_query_info(bs, &info->value, errp);
> +        if (error_is_set(errp)) {
> +            goto err;
> +        }

This doesn't do what you think it does: The caller can pass NULL as
errp, and then this becomes never true. I think you need to use a
local_err and propagate it to errp in error cases.

>  
>          *p_next = info;
>          p_next = &info->next;
>      }
>  
>      return head;
> +
> + err:
> +    qapi_free_BlockInfoList(head);
> +    return NULL;
>  }

Kevin
Stefan Hajnoczi - April 8, 2013, 1:33 p.m.
On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 6b20684..b856be7 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>           - "iops": limit total I/O operations per second (json-int)
>           - "iops_rd": limit read operations per second (json-int)
>           - "iops_wr": limit write operations per second (json-int)
> +         - "image": the detail of the image, it is a json-object containing
> +            the following:
> +             - "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, not present if image
> +                               format does not support it (json-int, optional)
> +             - "encrypted": true if the image is encrypted, not present means
> +                            false or the image format does not support
> +                            encryption (json-bool, optional)
> +             - "backing_file": backing file name, not present means no backing
> +                               file is used or the image format does not
> +                               support backing file chain
> +                               (json-string, optional)
> +             - "full-backing-filename": full path of the backing file, not
> +                                        present if it equals backing_file or no
> +                                        backing file is used
> +                                        (json-string, optional)
> +             - "backing-filename-format": the format of the backing file, not
> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
> +                                    with vm-clock-sec (json-int)
> +             - "backing-image": the detail of the backing image, it is an
> +                                optional json-object only present when a
> +                                backing image present for this image

Please don't duplicate the ImageInfo documentation from
qapi-schema.json.

I'm not sure how the documentation gets generated but we need to avoid
this, otherwise it will quickly get out of sync.

Stefan
Wayne Xia - April 10, 2013, 7:30 a.m.
于 2013-4-8 21:33, Stefan Hajnoczi 写道:
> On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>> index 6b20684..b856be7 100644
>> --- a/qmp-commands.hx
>> +++ b/qmp-commands.hx
>> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>>            - "iops": limit total I/O operations per second (json-int)
>>            - "iops_rd": limit read operations per second (json-int)
>>            - "iops_wr": limit write operations per second (json-int)
>> +         - "image": the detail of the image, it is a json-object containing
>> +            the following:
>> +             - "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, not present if image
>> +                               format does not support it (json-int, optional)
>> +             - "encrypted": true if the image is encrypted, not present means
>> +                            false or the image format does not support
>> +                            encryption (json-bool, optional)
>> +             - "backing_file": backing file name, not present means no backing
>> +                               file is used or the image format does not
>> +                               support backing file chain
>> +                               (json-string, optional)
>> +             - "full-backing-filename": full path of the backing file, not
>> +                                        present if it equals backing_file or no
>> +                                        backing file is used
>> +                                        (json-string, optional)
>> +             - "backing-filename-format": the format of the backing file, not
>> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
>> +                                    with vm-clock-sec (json-int)
>> +             - "backing-image": the detail of the backing image, it is an
>> +                                optional json-object only present when a
>> +                                backing image present for this image
>
> Please don't duplicate the ImageInfo documentation from
> qapi-schema.json.
>
> I'm not sure how the documentation gets generated but we need to avoid
> this, otherwise it will quickly get out of sync.
>
> Stefan
>
   So remove this section? It seems no other way to sync them except
manually change both of them.
Markus Armbruster - April 10, 2013, 4:17 p.m.
Stefan Hajnoczi <stefanha@gmail.com> writes:

> On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>> index 6b20684..b856be7 100644
>> --- a/qmp-commands.hx
>> +++ b/qmp-commands.hx
>> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>>           - "iops": limit total I/O operations per second (json-int)
>>           - "iops_rd": limit read operations per second (json-int)
>>           - "iops_wr": limit write operations per second (json-int)
>> +         - "image": the detail of the image, it is a json-object containing
>> +            the following:
>> +             - "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, not present if image
>> + format does not support it (json-int, optional)
>> +             - "encrypted": true if the image is encrypted, not present means
>> +                            false or the image format does not support
>> +                            encryption (json-bool, optional)
>> + - "backing_file": backing file name, not present means no backing
>> +                               file is used or the image format does not
>> +                               support backing file chain
>> +                               (json-string, optional)
>> +             - "full-backing-filename": full path of the backing file, not
>> + present if it equals backing_file or no
>> +                                        backing file is used
>> +                                        (json-string, optional)
>> +             - "backing-filename-format": the format of the backing file, not
>> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
>> +                                    with vm-clock-sec (json-int)
>> +             - "backing-image": the detail of the backing image, it is an
>> +                                optional json-object only present when a
>> +                                backing image present for this image
>
> Please don't duplicate the ImageInfo documentation from
> qapi-schema.json.

No, this is actually how it still needs to be done.

qmp-commands.hx predates qapi-schema.json.  We still generate
QMP/qmp-commands.txt from qmp-commands.hx, not from qapi-schema.json.

> I'm not sure how the documentation gets generated but we need to avoid
> this, otherwise it will quickly get out of sync.

If I remember correctly, Luiz wants to get rid of qmp-commands.hx.  But
we're not there, yet.
Markus Armbruster - April 10, 2013, 4:27 p.m.
Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:

>   Now image info will be retrieved as an embbed json object inside
> BlockDeviceInfo, backing chain info and all related internal snapshot
> info can be got in the enhanced recursive structure of ImageInfo.
>
> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> ---
>  block/qapi.c         |   38 ++++++++++++++++++++++++++--
>  include/block/qapi.h |    4 ++-
>  qapi-schema.json     |    5 +++-
>  qmp-commands.hx      |   67 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  4 files changed, 108 insertions(+), 6 deletions(-)
>
> diff --git a/block/qapi.c b/block/qapi.c
> index fa61c85..e98a028 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -202,9 +202,14 @@ int bdrv_query_image_info(BlockDriverState *bs,
>      return 0;
>  }
>  
> -BlockInfo *bdrv_query_info(BlockDriverState *bs)
> +/* @p_info will be set only on success. */
> +void bdrv_query_info(BlockDriverState *bs,
> +                     BlockInfo **p_info,
> +                     Error **errp)
>  {
>      BlockInfo *info = g_malloc0(sizeof(*info));
> +    BlockDriverState *bs0;
> +    ImageInfo **p_image_info;
>      info->device = g_strdup(bs->device_name);
>      info->type = g_strdup("unknown");
>      info->locked = bdrv_dev_is_medium_locked(bs);
> @@ -258,8 +263,28 @@ BlockInfo *bdrv_query_info(BlockDriverState *bs)
>              info->inserted->iops_wr =
>                             bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE];
>          }
> +
> +        bs0 = bs;
> +        p_image_info = &info->inserted->image;
> +        while (1) {
> +            if (bdrv_query_image_info(bs0, p_image_info, errp)) {
> +                goto err;
> +            }
> +            if (bs0->drv && bs0->backing_hd) {
> +                bs0 = bs0->backing_hd;
> +                (*p_image_info)->has_backing_image = true;
> +                p_image_info = &((*p_image_info)->backing_image);
> +            } else {
> +                break;
> +            }
> +        }
>      }
> -    return info;
> +
> +    *p_info = info;
> +    return;
> +
> + err:
> +    qapi_free_BlockInfo(info);
>  }
>  
>  SnapshotInfoList *qmp_query_snapshots(Error **errp)
> @@ -286,11 +311,18 @@ BlockInfoList *qmp_query_block(Error **errp)
>  
>      while ((bs = bdrv_next(bs))) {
>          BlockInfoList *info = g_malloc0(sizeof(*info));
> -        info->value = bdrv_query_info(bs);
> +        bdrv_query_info(bs, &info->value, errp);
> +        if (error_is_set(errp)) {
> +            goto err;
> +        }
>  
>          *p_next = info;
>          p_next = &info->next;
>      }
>  
>      return head;
> +
> + err:
> +    qapi_free_BlockInfoList(head);
> +    return NULL;
>  }
> diff --git a/include/block/qapi.h b/include/block/qapi.h
> index 0039a70..e0fd0a5 100644
> --- a/include/block/qapi.h
> +++ b/include/block/qapi.h
> @@ -35,5 +35,7 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
>  int bdrv_query_image_info(BlockDriverState *bs,
>                            ImageInfo **p_info,
>                            Error **errp);
> -BlockInfo *bdrv_query_info(BlockDriverState *bs);
> +void bdrv_query_info(BlockDriverState *bs,
> +                     BlockInfo **p_info,
> +                     Error **errp);
>  #endif
> diff --git a/qapi-schema.json b/qapi-schema.json
> index ad9dd82..02dabc3 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -756,6 +756,8 @@
>  #
>  # @iops_wr: write I/O operations per second is specified
>  #
> +# @image: the info of image used (since: 1.5)
> +#
>  # Since: 0.14.0
>  #
>  # Notes: This interface is only found in @BlockInfo.
> @@ -765,7 +767,8 @@
>              '*backing_file': 'str', 'backing_file_depth': 'int',
>              'encrypted': 'bool', 'encryption_key_missing': 'bool',
>              'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
> -            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int'} }
> +            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int',
> +            'image': 'ImageInfo' } }
>  
>  ##
>  # @BlockDeviceIoStatus:
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 6b20684..b856be7 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>           - "iops": limit total I/O operations per second (json-int)
>           - "iops_rd": limit read operations per second (json-int)
>           - "iops_wr": limit write operations per second (json-int)
> +         - "image": the detail of the image, it is a json-object containing
> +            the following:
> +             - "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, not present if image
> +                               format does not support it (json-int, optional)
> +             - "encrypted": true if the image is encrypted, not present means
> +                            false or the image format does not support
> +                            encryption (json-bool, optional)
> +             - "backing_file": backing file name, not present means no backing
> +                               file is used or the image format does not
> +                               support backing file chain
> +                               (json-string, optional)
> +             - "full-backing-filename": full path of the backing file, not
> +                                        present if it equals backing_file or no
> +                                        backing file is used
> +                                        (json-string, optional)
> +             - "backing-filename-format": the format of the backing file, not
> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
> +                                    with vm-clock-sec (json-int)
> +             - "backing-image": the detail of the backing image, it is an
> +                                optional json-object only present when a
> +                                backing image present for this image
>  
>  - "io-status": I/O operation status, only present if the device supports it
>                 and the VM is configured to stop on errors. It's always reset
> @@ -1724,13 +1765,37 @@ Example:
>                 "drv":"qcow2",
>                 "encrypted":false,
>                 "file":"disks/test.img",
> -               "backing_file_depth":0,
> +               "backing_file_depth":1,
>                 "bps":1000000,
>                 "bps_rd":0,
>                 "bps_wr":0,
>                 "iops":1000000,
>                 "iops_rd":0,
>                 "iops_wr":0,
> +               "image":{
> +                  "filename":"disks/test.img",

Please change to "disks/test.qcow2".  I don't want people to get the
idea they should name their QCOW2 images .img.

> +                  "format":"qcow2",

I wonder how inserted.file and inserted.drv are related to
inserted.image.filename and inserted.image.format.  Redundant or not?
Kevin?

> +                  "virtual-size":2048000,
> +                  "backing_file":"base.img",
> +                  "full-backing-filename":"disks/base.img",
> +                  "backing-filename-format:"qcow2",
> +                  "snapshots":[
> +                     {
> +                        "id": "1",
> +                        "name": "snapshot1",
> +                        "vm-state-size": 0,
> +                        "date-sec": 10000200,
> +                        "date-nsec": 12,
> +                        "vm-clock-sec": 206,
> +                        "vm-clock-nsec": 30
> +                     }
> +                  ],
> +                  "backing-image":{
> +                      "filename":"disks/base.img",
> +                      "format":"qcow2",

And here I wonder how inserted.image.full-backing-filename and
.backing-filename-format are related to
inserted.image.backing-image.filename and .backing-image.format.  Kevin?

> +                      "virtual-size":2048000
> +                  }
> +               }
>              },
>              "type":"unknown"
>           },
Luiz Capitulino - April 10, 2013, 6:57 p.m.
On Wed, 10 Apr 2013 18:17:04 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Stefan Hajnoczi <stefanha@gmail.com> writes:
> 
> > On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
> >> diff --git a/qmp-commands.hx b/qmp-commands.hx
> >> index 6b20684..b856be7 100644
> >> --- a/qmp-commands.hx
> >> +++ b/qmp-commands.hx
> >> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
> >>           - "iops": limit total I/O operations per second (json-int)
> >>           - "iops_rd": limit read operations per second (json-int)
> >>           - "iops_wr": limit write operations per second (json-int)
> >> +         - "image": the detail of the image, it is a json-object containing
> >> +            the following:
> >> +             - "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, not present if image
> >> + format does not support it (json-int, optional)
> >> +             - "encrypted": true if the image is encrypted, not present means
> >> +                            false or the image format does not support
> >> +                            encryption (json-bool, optional)
> >> + - "backing_file": backing file name, not present means no backing
> >> +                               file is used or the image format does not
> >> +                               support backing file chain
> >> +                               (json-string, optional)
> >> +             - "full-backing-filename": full path of the backing file, not
> >> + present if it equals backing_file or no
> >> +                                        backing file is used
> >> +                                        (json-string, optional)
> >> +             - "backing-filename-format": the format of the backing file, not
> >> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
> >> +                                    with vm-clock-sec (json-int)
> >> +             - "backing-image": the detail of the backing image, it is an
> >> +                                optional json-object only present when a
> >> +                                backing image present for this image
> >
> > Please don't duplicate the ImageInfo documentation from
> > qapi-schema.json.
> 
> No, this is actually how it still needs to be done.
> 
> qmp-commands.hx predates qapi-schema.json.  We still generate
> QMP/qmp-commands.txt from qmp-commands.hx, not from qapi-schema.json.

Unfortunately, yes. However, as there are just a few commands missing
to be converted to the qapi, we could start generating the docs from
qapi-schema.json and avoid the duplication.

There's a problem though. qapi-schema.json is not tied to the QMP protocol
as qmp-commands.hx is, so I'm not sure it's a good place for the examples,
as the examples _are_ QMP specific. On the other hand, I don't know where
should the examples go.

Ideas?

> > I'm not sure how the documentation gets generated but we need to avoid
> > this, otherwise it will quickly get out of sync.
> 
> If I remember correctly, Luiz wants to get rid of qmp-commands.hx.  But
> we're not there, yet.

Right. We'll be able to do that when we finish to convert all commands
to the qapi. It's unfortunate that we (or maybe me) lost all speed at
the end of the race.
Wayne Xia - April 11, 2013, 6:20 a.m.
>>                  "bps_wr":0,
>>                  "iops":1000000,
>>                  "iops_rd":0,
>>                  "iops_wr":0,
>> +               "image":{
>> +                  "filename":"disks/test.img",
> 
> Please change to "disks/test.qcow2".  I don't want people to get the
> idea they should name their QCOW2 images .img.
> 
>> +                  "format":"qcow2",
> 
  OK.

> I wonder how inserted.file and inserted.drv are related to
> inserted.image.filename and inserted.image.format.  Redundant or not?
> Kevin?
> 
  From code, I think it is Redundant.

>> +                  "virtual-size":2048000,
>> +                  "backing_file":"base.img",
>> +                  "full-backing-filename":"disks/base.img",
>> +                  "backing-filename-format:"qcow2",
>> +                  "snapshots":[
>> +                     {
>> +                        "id": "1",
>> +                        "name": "snapshot1",
>> +                        "vm-state-size": 0,
>> +                        "date-sec": 10000200,
>> +                        "date-nsec": 12,
>> +                        "vm-clock-sec": 206,
>> +                        "vm-clock-nsec": 30
>> +                     }
>> +                  ],
>> +                  "backing-image":{
>> +                      "filename":"disks/base.img",
>> +                      "format":"qcow2",
> 
> And here I wonder how inserted.image.full-backing-filename and
> .backing-filename-format are related to
> inserted.image.backing-image.filename and .backing-image.format.  Kevin?
> 
  Different in source, inserted.image.* is what inserted.image tell,
inserted.image.backing-image.* is what inserted.image.backing-image
tell. Same for user, image.filename should be recommended to use.

>> +                      "virtual-size":2048000
>> +                  }
>> +               }
>>               },
>>               "type":"unknown"
>>            },
>
Wayne Xia - April 11, 2013, 6:25 a.m.
于 2013-4-11 2:57, Luiz Capitulino 写道:
> On Wed, 10 Apr 2013 18:17:04 +0200
> Markus Armbruster <armbru@redhat.com> wrote:
>
>> Stefan Hajnoczi <stefanha@gmail.com> writes:
>>
>>> On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
>>>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>>>> index 6b20684..b856be7 100644
>>>> --- a/qmp-commands.hx
>>>> +++ b/qmp-commands.hx
>>>> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>>>>            - "iops": limit total I/O operations per second (json-int)
>>>>            - "iops_rd": limit read operations per second (json-int)
>>>>            - "iops_wr": limit write operations per second (json-int)
>>>> +         - "image": the detail of the image, it is a json-object containing
>>>> +            the following:
>>>> +             - "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, not present if image
>>>> + format does not support it (json-int, optional)
>>>> +             - "encrypted": true if the image is encrypted, not present means
>>>> +                            false or the image format does not support
>>>> +                            encryption (json-bool, optional)
>>>> + - "backing_file": backing file name, not present means no backing
>>>> +                               file is used or the image format does not
>>>> +                               support backing file chain
>>>> +                               (json-string, optional)
>>>> +             - "full-backing-filename": full path of the backing file, not
>>>> + present if it equals backing_file or no
>>>> +                                        backing file is used
>>>> +                                        (json-string, optional)
>>>> +             - "backing-filename-format": the format of the backing file, not
>>>> +                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
>>>> +                                    with vm-clock-sec (json-int)
>>>> +             - "backing-image": the detail of the backing image, it is an
>>>> +                                optional json-object only present when a
>>>> +                                backing image present for this image
>>>
>>> Please don't duplicate the ImageInfo documentation from
>>> qapi-schema.json.
>>
>> No, this is actually how it still needs to be done.
>>
>> qmp-commands.hx predates qapi-schema.json.  We still generate
>> QMP/qmp-commands.txt from qmp-commands.hx, not from qapi-schema.json.
>
> Unfortunately, yes. However, as there are just a few commands missing
> to be converted to the qapi, we could start generating the docs from
> qapi-schema.json and avoid the duplication.
>
> There's a problem though. qapi-schema.json is not tied to the QMP protocol
> as qmp-commands.hx is, so I'm not sure it's a good place for the examples,
   I agree that example should not get mixed with qapi-schema.json, which
faces developer instead of user. Personally I think a standalone example
file is better(only call in and out, no text for the structure defines).

> as the examples _are_ QMP specific. On the other hand, I don't know where
> should the examples go.
>
> Ideas?
>
>>> I'm not sure how the documentation gets generated but we need to avoid
>>> this, otherwise it will quickly get out of sync.
>>
>> If I remember correctly, Luiz wants to get rid of qmp-commands.hx.  But
>> we're not there, yet.
>
> Right. We'll be able to do that when we finish to convert all commands
> to the qapi. It's unfortunate that we (or maybe me) lost all speed at
> the end of the race.
>
Stefan Hajnoczi - April 11, 2013, 8:54 a.m.
On Wed, Apr 10, 2013 at 03:30:10PM +0800, Wenchao Xia wrote:
> 于 2013-4-8 21:33, Stefan Hajnoczi 写道:
> >On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
> >>diff --git a/qmp-commands.hx b/qmp-commands.hx
> >>index 6b20684..b856be7 100644
> >>--- a/qmp-commands.hx
> >>+++ b/qmp-commands.hx
> >>@@ -1703,6 +1703,47 @@ Each json-object contain the following:
> >>           - "iops": limit total I/O operations per second (json-int)
> >>           - "iops_rd": limit read operations per second (json-int)
> >>           - "iops_wr": limit write operations per second (json-int)
> >>+         - "image": the detail of the image, it is a json-object containing
> >>+            the following:
> >>+             - "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, not present if image
> >>+                               format does not support it (json-int, optional)
> >>+             - "encrypted": true if the image is encrypted, not present means
> >>+                            false or the image format does not support
> >>+                            encryption (json-bool, optional)
> >>+             - "backing_file": backing file name, not present means no backing
> >>+                               file is used or the image format does not
> >>+                               support backing file chain
> >>+                               (json-string, optional)
> >>+             - "full-backing-filename": full path of the backing file, not
> >>+                                        present if it equals backing_file or no
> >>+                                        backing file is used
> >>+                                        (json-string, optional)
> >>+             - "backing-filename-format": the format of the backing file, not
> >>+                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
> >>+                                    with vm-clock-sec (json-int)
> >>+             - "backing-image": the detail of the backing image, it is an
> >>+                                optional json-object only present when a
> >>+                                backing image present for this image
> >
> >Please don't duplicate the ImageInfo documentation from
> >qapi-schema.json.
> >
> >I'm not sure how the documentation gets generated but we need to avoid
> >this, otherwise it will quickly get out of sync.
> >
> >Stefan
> >
>   So remove this section? It seems no other way to sync them except
> manually change both of them.

Given the discussion about duplication, this can stay for now.

Stefan
Markus Armbruster - April 11, 2013, 9:31 a.m.
Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:

> 于 2013-4-11 2:57, Luiz Capitulino 写道:
>> On Wed, 10 Apr 2013 18:17:04 +0200
>> Markus Armbruster <armbru@redhat.com> wrote:
>>
>>> Stefan Hajnoczi <stefanha@gmail.com> writes:
>>>
>>>> On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
>>>>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>>>>> index 6b20684..b856be7 100644
>>>>> --- a/qmp-commands.hx
>>>>> +++ b/qmp-commands.hx
>>>>> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>>>>>            - "iops": limit total I/O operations per second (json-int)
>>>>>            - "iops_rd": limit read operations per second (json-int)
>>>>>            - "iops_wr": limit write operations per second (json-int)
>>>>> + - "image": the detail of the image, it is a json-object
>>>>> containing
>>>>> +            the following:
>>>>> +             - "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, not present if image
>>>>> + format does not support it (json-int, optional)
>>>>> + - "encrypted": true if the image is encrypted, not present
>>>>> means
>>>>> +                            false or the image format does not support
>>>>> +                            encryption (json-bool, optional)
>>>>> + - "backing_file": backing file name, not present means no backing
>>>>> +                               file is used or the image format does not
>>>>> +                               support backing file chain
>>>>> +                               (json-string, optional)
>>>>> +             - "full-backing-filename": full path of the backing file, not
>>>>> + present if it equals backing_file or no
>>>>> +                                        backing file is used
>>>>> +                                        (json-string, optional)
>>>>> + - "backing-filename-format": the format of the backing file,
>>>>> not
>>>>> + present means unknown or no 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 nanoseconds 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 nanoseconds to be used
>>>>> +                                    with vm-clock-sec (json-int)
>>>>> +             - "backing-image": the detail of the backing image, it is an
>>>>> +                                optional json-object only present when a
>>>>> +                                backing image present for this image
>>>>
>>>> Please don't duplicate the ImageInfo documentation from
>>>> qapi-schema.json.
>>>
>>> No, this is actually how it still needs to be done.
>>>
>>> qmp-commands.hx predates qapi-schema.json.  We still generate
>>> QMP/qmp-commands.txt from qmp-commands.hx, not from qapi-schema.json.
>>
>> Unfortunately, yes. However, as there are just a few commands missing
>> to be converted to the qapi, we could start generating the docs from
>> qapi-schema.json and avoid the duplication.
>>
>> There's a problem though. qapi-schema.json is not tied to the QMP protocol
>> as qmp-commands.hx is, so I'm not sure it's a good place for the examples,
>   I agree that example should not get mixed with qapi-schema.json, which
> faces developer instead of user. Personally I think a standalone example
> file is better(only call in and out, no text for the structure defines).

How do we ensure the examples stay up-to-date?

Crazy idea: generate them as part of "make check".

[...]
Wayne Xia - April 12, 2013, 3:25 a.m.
于 2013-4-11 17:31, Markus Armbruster 写道:
> Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:
>
>> 于 2013-4-11 2:57, Luiz Capitulino 写道:
>>> On Wed, 10 Apr 2013 18:17:04 +0200
>>> Markus Armbruster <armbru@redhat.com> wrote:
>>>
>>>> Stefan Hajnoczi <stefanha@gmail.com> writes:
>>>>
>>>>> On Tue, Apr 02, 2013 at 07:47:24PM +0800, Wenchao Xia wrote:
>>>>>> diff --git a/qmp-commands.hx b/qmp-commands.hx
>>>>>> index 6b20684..b856be7 100644
>>>>>> --- a/qmp-commands.hx
>>>>>> +++ b/qmp-commands.hx
>>>>>> @@ -1703,6 +1703,47 @@ Each json-object contain the following:
>>>>>>             - "iops": limit total I/O operations per second (json-int)
>>>>>>             - "iops_rd": limit read operations per second (json-int)
>>>>>>             - "iops_wr": limit write operations per second (json-int)
>>>>>> + - "image": the detail of the image, it is a json-object
>>>>>> containing
>>>>>> +            the following:
>>>>>> +             - "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, not present if image
>>>>>> + format does not support it (json-int, optional)
>>>>>> + - "encrypted": true if the image is encrypted, not present
>>>>>> means
>>>>>> +                            false or the image format does not support
>>>>>> +                            encryption (json-bool, optional)
>>>>>> + - "backing_file": backing file name, not present means no backing
>>>>>> +                               file is used or the image format does not
>>>>>> +                               support backing file chain
>>>>>> +                               (json-string, optional)
>>>>>> +             - "full-backing-filename": full path of the backing file, not
>>>>>> + present if it equals backing_file or no
>>>>>> +                                        backing file is used
>>>>>> +                                        (json-string, optional)
>>>>>> + - "backing-filename-format": the format of the backing file,
>>>>>> not
>>>>>> + present means unknown or no 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 nanoseconds 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 nanoseconds to be used
>>>>>> +                                    with vm-clock-sec (json-int)
>>>>>> +             - "backing-image": the detail of the backing image, it is an
>>>>>> +                                optional json-object only present when a
>>>>>> +                                backing image present for this image
>>>>>
>>>>> Please don't duplicate the ImageInfo documentation from
>>>>> qapi-schema.json.
>>>>
>>>> No, this is actually how it still needs to be done.
>>>>
>>>> qmp-commands.hx predates qapi-schema.json.  We still generate
>>>> QMP/qmp-commands.txt from qmp-commands.hx, not from qapi-schema.json.
>>>
>>> Unfortunately, yes. However, as there are just a few commands missing
>>> to be converted to the qapi, we could start generating the docs from
>>> qapi-schema.json and avoid the duplication.
>>>
>>> There's a problem though. qapi-schema.json is not tied to the QMP protocol
>>> as qmp-commands.hx is, so I'm not sure it's a good place for the examples,
>>    I agree that example should not get mixed with qapi-schema.json, which
>> faces developer instead of user. Personally I think a standalone example
>> file is better(only call in and out, no text for the structure defines).
>
> How do we ensure the examples stay up-to-date?
>
> Crazy idea: generate them as part of "make check".
>
> [...]
>
   Generate example from qapi-schema.json is cool, maybe do it
in "make".

Patch

diff --git a/block/qapi.c b/block/qapi.c
index fa61c85..e98a028 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -202,9 +202,14 @@  int bdrv_query_image_info(BlockDriverState *bs,
     return 0;
 }
 
-BlockInfo *bdrv_query_info(BlockDriverState *bs)
+/* @p_info will be set only on success. */
+void bdrv_query_info(BlockDriverState *bs,
+                     BlockInfo **p_info,
+                     Error **errp)
 {
     BlockInfo *info = g_malloc0(sizeof(*info));
+    BlockDriverState *bs0;
+    ImageInfo **p_image_info;
     info->device = g_strdup(bs->device_name);
     info->type = g_strdup("unknown");
     info->locked = bdrv_dev_is_medium_locked(bs);
@@ -258,8 +263,28 @@  BlockInfo *bdrv_query_info(BlockDriverState *bs)
             info->inserted->iops_wr =
                            bs->io_limits.iops[BLOCK_IO_LIMIT_WRITE];
         }
+
+        bs0 = bs;
+        p_image_info = &info->inserted->image;
+        while (1) {
+            if (bdrv_query_image_info(bs0, p_image_info, errp)) {
+                goto err;
+            }
+            if (bs0->drv && bs0->backing_hd) {
+                bs0 = bs0->backing_hd;
+                (*p_image_info)->has_backing_image = true;
+                p_image_info = &((*p_image_info)->backing_image);
+            } else {
+                break;
+            }
+        }
     }
-    return info;
+
+    *p_info = info;
+    return;
+
+ err:
+    qapi_free_BlockInfo(info);
 }
 
 SnapshotInfoList *qmp_query_snapshots(Error **errp)
@@ -286,11 +311,18 @@  BlockInfoList *qmp_query_block(Error **errp)
 
     while ((bs = bdrv_next(bs))) {
         BlockInfoList *info = g_malloc0(sizeof(*info));
-        info->value = bdrv_query_info(bs);
+        bdrv_query_info(bs, &info->value, errp);
+        if (error_is_set(errp)) {
+            goto err;
+        }
 
         *p_next = info;
         p_next = &info->next;
     }
 
     return head;
+
+ err:
+    qapi_free_BlockInfoList(head);
+    return NULL;
 }
diff --git a/include/block/qapi.h b/include/block/qapi.h
index 0039a70..e0fd0a5 100644
--- a/include/block/qapi.h
+++ b/include/block/qapi.h
@@ -35,5 +35,7 @@  int bdrv_query_snapshot_info_list(BlockDriverState *bs,
 int bdrv_query_image_info(BlockDriverState *bs,
                           ImageInfo **p_info,
                           Error **errp);
-BlockInfo *bdrv_query_info(BlockDriverState *bs);
+void bdrv_query_info(BlockDriverState *bs,
+                     BlockInfo **p_info,
+                     Error **errp);
 #endif
diff --git a/qapi-schema.json b/qapi-schema.json
index ad9dd82..02dabc3 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -756,6 +756,8 @@ 
 #
 # @iops_wr: write I/O operations per second is specified
 #
+# @image: the info of image used (since: 1.5)
+#
 # Since: 0.14.0
 #
 # Notes: This interface is only found in @BlockInfo.
@@ -765,7 +767,8 @@ 
             '*backing_file': 'str', 'backing_file_depth': 'int',
             'encrypted': 'bool', 'encryption_key_missing': 'bool',
             'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
-            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int'} }
+            'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int',
+            'image': 'ImageInfo' } }
 
 ##
 # @BlockDeviceIoStatus:
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 6b20684..b856be7 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1703,6 +1703,47 @@  Each json-object contain the following:
          - "iops": limit total I/O operations per second (json-int)
          - "iops_rd": limit read operations per second (json-int)
          - "iops_wr": limit write operations per second (json-int)
+         - "image": the detail of the image, it is a json-object containing
+            the following:
+             - "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, not present if image
+                               format does not support it (json-int, optional)
+             - "encrypted": true if the image is encrypted, not present means
+                            false or the image format does not support
+                            encryption (json-bool, optional)
+             - "backing_file": backing file name, not present means no backing
+                               file is used or the image format does not
+                               support backing file chain
+                               (json-string, optional)
+             - "full-backing-filename": full path of the backing file, not
+                                        present if it equals backing_file or no
+                                        backing file is used
+                                        (json-string, optional)
+             - "backing-filename-format": the format of the backing file, not
+                                          present means unknown or no 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 nanoseconds 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 nanoseconds to be used
+                                    with vm-clock-sec (json-int)
+             - "backing-image": the detail of the backing image, it is an
+                                optional json-object only present when a
+                                backing image present for this image
 
 - "io-status": I/O operation status, only present if the device supports it
                and the VM is configured to stop on errors. It's always reset
@@ -1724,13 +1765,37 @@  Example:
                "drv":"qcow2",
                "encrypted":false,
                "file":"disks/test.img",
-               "backing_file_depth":0,
+               "backing_file_depth":1,
                "bps":1000000,
                "bps_rd":0,
                "bps_wr":0,
                "iops":1000000,
                "iops_rd":0,
                "iops_wr":0,
+               "image":{
+                  "filename":"disks/test.img",
+                  "format":"qcow2",
+                  "virtual-size":2048000,
+                  "backing_file":"base.img",
+                  "full-backing-filename":"disks/base.img",
+                  "backing-filename-format:"qcow2",
+                  "snapshots":[
+                     {
+                        "id": "1",
+                        "name": "snapshot1",
+                        "vm-state-size": 0,
+                        "date-sec": 10000200,
+                        "date-nsec": 12,
+                        "vm-clock-sec": 206,
+                        "vm-clock-nsec": 30
+                     }
+                  ],
+                  "backing-image":{
+                      "filename":"disks/base.img",
+                      "format":"qcow2",
+                      "virtual-size":2048000
+                  }
+               }
             },
             "type":"unknown"
          },