From patchwork Fri Mar 22 14:19:07 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 230104 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BCD732C00C2 for ; Sat, 23 Mar 2013 02:54:07 +1100 (EST) Received: from localhost ([::1]:37641 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UJ2zq-0006No-W8 for incoming@patchwork.ozlabs.org; Fri, 22 Mar 2013 10:31:07 -0400 Received: from eggs.gnu.org ([208.118.235.92]:35786) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UJ2s0-00025v-G4 for qemu-devel@nongnu.org; Fri, 22 Mar 2013 10:23:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UJ2rx-0006rP-4T for qemu-devel@nongnu.org; Fri, 22 Mar 2013 10:23:00 -0400 Received: from e28smtp06.in.ibm.com ([122.248.162.6]:49898) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UJ2rw-0006qu-Bb for qemu-devel@nongnu.org; Fri, 22 Mar 2013 10:22:57 -0400 Received: from /spool/local by e28smtp06.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 22 Mar 2013 19:48:50 +0530 Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp06.in.ibm.com (192.168.1.136) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 22 Mar 2013 19:48:48 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id C89D2125804E for ; Fri, 22 Mar 2013 19:54:01 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r2MEMmg762521448 for ; Fri, 22 Mar 2013 19:52:48 +0530 Received: from d28av02.in.ibm.com (loopback [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r2MEMlxi026792 for ; Sat, 23 Mar 2013 01:22:50 +1100 Received: from RH63Wenchao ([9.125.29.101]) by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r2MEJPjn008189; Sat, 23 Mar 2013 01:22:44 +1100 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Fri, 22 Mar 2013 22:19:07 +0800 Message-Id: <1363961953-13561-12-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1363961953-13561-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1363961953-13561-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13032214-9574-0000-0000-00000728CFC5 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.6 Cc: kwolf@redhat.com, aliguori@us.ibm.com, stefanha@gmail.com, armbru@redhat.com, lcapitulino@redhat.com, pbonzini@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH V10 11/17] qmp: add ImageInfo in BlockDeviceInfo used by query-block X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- block/qapi.c | 39 ++++++++++++++++++++++++++-- include/block/qapi.h | 4 ++- qapi-schema.json | 5 +++- qmp-commands.hx | 67 +++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 109 insertions(+), 6 deletions(-) diff --git a/block/qapi.c b/block/qapi.c index df73f5b..9051947 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -200,9 +200,15 @@ int bdrv_query_image_info(BlockDriverState *bs, return 0; } -BlockInfo *bdrv_query_info(BlockDriverState *bs) +/* return 0 on success, and @p_info will be set only on success. */ +int bdrv_query_info(BlockDriverState *bs, + BlockInfo **p_info, + Error **errp) { BlockInfo *info = g_malloc0(sizeof(*info)); + BlockDriverState *bs0; + ImageInfo **p_image_info; + int ret = 0; info->device = g_strdup(bs->device_name); info->type = g_strdup("unknown"); info->locked = bdrv_dev_is_medium_locked(bs); @@ -256,8 +262,29 @@ 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 0; + + err: + qapi_free_BlockInfo(info); + return ret; } SnapshotInfoList *qmp_query_snapshots(Error **errp) @@ -284,11 +311,17 @@ BlockInfoList *qmp_query_block(Error **errp) while ((bs = bdrv_next(bs))) { BlockInfoList *info = g_malloc0(sizeof(*info)); - info->value = bdrv_query_info(bs); + if (bdrv_query_info(bs, &info->value, 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..49f9a17 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); +int bdrv_query_info(BlockDriverState *bs, + BlockInfo **p_info, + Error **errp); #endif diff --git a/qapi-schema.json b/qapi-schema.json index b927c97..9a9e673 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -754,6 +754,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. @@ -763,7 +765,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 a4cd229..f977c6f 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -1681,6 +1681,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 @@ -1702,13 +1743,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" },