qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V11 11/17] qmp: add ImageInfo in BlockDeviceInfo


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH V11 11/17] qmp: add ImageInfo in BlockDeviceInfo used by query-block
Date: Wed, 10 Apr 2013 18:27:01 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)

Wenchao Xia <address@hidden> 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 <address@hidden>
> ---
>  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"
>           },



reply via email to

[Prev in Thread] Current Thread [Next in Thread]