Message ID | 1364903250-10429-12-git-send-email-xiawenc@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
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
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
于 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.
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.
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" > },
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.
>> "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" >> }, >
于 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. >
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
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". [...]
于 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".
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" },
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(-)