On Mon, 14 Jan 2013 15:09:42 +0800 Wenchao Xia <xiaw...@linux.vnet.ibm.com> wrote:
> This mirror function will return all image info including > snapshots. Now Qemu have both query-images and query-block > interfaces. > > Signed-off-by: Wenchao Xia <xiaw...@linux.vnet.ibm.com> > --- > block.c | 19 +++++++++++++ > qapi-schema.json | 27 +++++++++++++++++++ > qmp-commands.hx | 76 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 122 insertions(+), 0 deletions(-) > > diff --git a/block.c b/block.c > index 502c06e..8192d8e 100644 > --- a/block.c > +++ b/block.c > @@ -2963,6 +2963,25 @@ ImageInfo *bdrv_query_image_info(BlockDriverState *bs, > Error **errp) > return info; > } > > +DeviceImageInfoList *qmp_query_images(Error **errp) > +{ > + DeviceImageInfoList *head = NULL, **p_next = &head; > + BlockDriverState *bs; > + > + QTAILQ_FOREACH(bs, &bdrv_states, list) { > + DeviceImageInfo *dii = g_malloc0(sizeof(*dii)); > + dii->device = g_strdup(bs->device_name); > + dii->info = bdrv_query_image_info(bs, NULL); > + DeviceImageInfoList *diil = g_malloc0(sizeof(*diil)); > + diil->value = dii; > + > + *p_next = diil; > + p_next = &diil->next; > + } When the device doesn't have an image, this returns: { "device": "ide1-cd0", "info": { "virtual-size": 0, "filename": "", "format": "" } }, But it would be better to return an empty dict or even omit 'info' completely. One more comment below. > + > + return head; > +} > + > BlockInfo *bdrv_query_block_info(BlockDriverState *bs) > { > BlockInfo *info = g_malloc0(sizeof(*info)); > diff --git a/qapi-schema.json b/qapi-schema.json > index 5dfa052..565737c 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -245,6 +245,22 @@ > '*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'] > } } > > ## > +# @DeviceImageInfo: > +# > +# Information about an image used by QEMU block device > +# > +# @device: name of the block device > +# > +# @info: info of the image used. Info is too generic, please call it 'image'. > +# > +# Since: 1.4 > +# > +## > + > +{ 'type': 'DeviceImageInfo', > + 'data': {'device': 'str', 'info': 'ImageInfo' } } > + > +## > # @StatusInfo: > # > # Information about VCPU run state > @@ -720,6 +736,17 @@ > { 'command': 'query-block', 'returns': ['BlockInfo'] } > > ## > +# @query-images: > +# > +# Get a list of DeviceImageInfo for all virtual block devices. > +# > +# Returns: a list of @DeviceImageInfo describing each virtual block device > +# > +# Since: 1.4 > +## > +{ 'command': 'query-images', '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 5c692d0..c31a142 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -1668,6 +1668,82 @@ EQMP > }, > > SQMP > +query-images > +----------- > + > +Show the block devices' images. > + > +Each block image information is stored in a json-object and the returned > value > +is a json-array of all devices' images. > + > +Each json-object contain the following: > + > +- "device": device name (json-string) > +- "info": related image information, it is a json-object containing the > following: > + - "filename": image file name (json-string) > + - "format": image format (json-string) > + - "virtual-size": maximum capacity in bytes of the image (json-int) > + - "dirty-flag": true if image is not cleanly closed (json-bool, > optional) > + - "actual-size": actual size on disk in bytes of the image > (json-int, optional) > + - "cluster-size": size of a cluster in bytes (json-int, optional) > + - "encrypted": true if the image is encrypted (json-bool, optional) > + - "backing_file": backing file name (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": internal 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", > + "info":{ > + "filename":"disks/test0.img", > + "format":"qcow2", > + "virtual-size":1024000 > + } > + }, > + { > + "device":"ide0-hd1", > + "info":{ > + "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 = "", > + .mhandler.cmd_new = qmp_marshal_input_query_images, > + }, > + > +SQMP > query-blockstats > ---------------- >