From patchwork Sun Nov 1 14:51:15 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 37384 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 75B03B7BDB for ; Mon, 2 Nov 2009 02:00:39 +1100 (EST) Received: from localhost ([127.0.0.1]:33156 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N4bv2-0001Ch-Kq for incoming@patchwork.ozlabs.org; Sun, 01 Nov 2009 10:00:36 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N4bmS-0006Ft-Oz for qemu-devel@nongnu.org; Sun, 01 Nov 2009 09:51:44 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N4bmN-0006D1-TX for qemu-devel@nongnu.org; Sun, 01 Nov 2009 09:51:44 -0500 Received: from [199.232.76.173] (port=35614 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N4bmN-0006Cf-LD for qemu-devel@nongnu.org; Sun, 01 Nov 2009 09:51:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:22393) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N4bmM-0002MZ-SA for qemu-devel@nongnu.org; Sun, 01 Nov 2009 09:51:39 -0500 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nA1EpcwE026265 for ; Sun, 1 Nov 2009 09:51:38 -0500 Received: from localhost (vpn-10-169.rdu.redhat.com [10.11.10.169]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nA1EpaXh019134 for ; Sun, 1 Nov 2009 09:51:37 -0500 From: Luiz Capitulino To: qemu-devel@nongnu.org Date: Sun, 1 Nov 2009 12:51:15 -0200 Message-Id: <1257087078-5757-6-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1257087078-5757-1-git-send-email-lcapitulino@redhat.com> References: <1257087078-5757-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: [Qemu-devel] [PATCH 5/8] monitor: Convert bdrv_info() to QObject X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Each block device information is stored in a QDict and the returned QObject is a QList of all devices. The QDict contains the following: - "device": device name - "type": device type - "removable": 1 if the device is removable 0 otherwise - "locked": 1 if the device is locked 0 otherwise - "inserted": only present if the device is inserted, it is a QDict containing the following: - "file": device file name - "ro": 1 if read-only 0 otherwise - "drv": driver format name - "backing_file": backing file name if one is used - "encrypted": 1 if encrypted 0 otherwise This commit should not change user output, the following is an example of the returned QList: [ { "device": "ide0-hd0", "type": "hd", "removable": 0, "file": "/tmp/foobar", "ro": 0, "drv": "qcow2", "encrypted": 0 } { "device": "floppy0", "type": "floppy", "removable": 1, "locked": 0 } ] Signed-off-by: Luiz Capitulino --- Makefile | 2 +- block.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++---------- block.h | 4 +- monitor.c | 3 +- 4 files changed, 109 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 424639a..5196cfc 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o qjson.o # block-obj-y is code used by both qemu system emulation and qemu-img block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o -block-obj-y += nbd.o block.o aio.o aes.o osdep.o +block-obj-y += nbd.o block.o aio.o aes.o osdep.o $(qobject-obj-y) block-obj-$(CONFIG_POSIX) += posix-aio-compat.o block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o diff --git a/block.c b/block.c index fa0de25..c6ba7c2 100644 --- a/block.c +++ b/block.c @@ -26,6 +26,7 @@ #include "monitor.h" #include "block_int.h" #include "module.h" +#include "qemu-objects.h" #ifdef CONFIG_BSD #include @@ -1075,43 +1076,125 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum); } -void bdrv_info(Monitor *mon) +static void bdrv_print_dict(QObject *obj, void *opaque) { + QDict *bs_dict; + Monitor *mon = opaque; + + bs_dict = qobject_to_qdict(obj); + + monitor_printf(mon, "%s: type=%s removable=%d", + qdict_get_str(bs_dict, "device"), + qdict_get_str(bs_dict, "type"), + qdict_get_bool(bs_dict, "removable")); + + if (qdict_get_bool(bs_dict, "removable")) { + monitor_printf(mon, " locked=%d", (int)qdict_get_bool(bs_dict, "locked")); + } + + if (qdict_haskey(bs_dict, "inserted")) { + QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted")); + + monitor_printf(mon, " file="); + monitor_print_filename(mon, qdict_get_str(qdict, "file")); + if (qdict_haskey(qdict, "backing_file")) { + monitor_printf(mon, " backing_file="); + monitor_print_filename(mon, qdict_get_str(qdict, "backing_file")); + } + monitor_printf(mon, " ro=%d drv=%s encrypted=%d", + qdict_get_bool(qdict, "ro"), + qdict_get_str(qdict, "drv"), + qdict_get_bool(qdict, "encrypted")); + } else { + monitor_printf(mon, " [not inserted]"); + } + + monitor_printf(mon, "\n"); +} + +void bdrv_user_print(Monitor *mon, const QObject *data) +{ + qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon); +} + +/** + * bdrv_info(): Block devices information + * + * Each block device information is stored in a QDict and the + * returned QObject is a QList of all devices. + * + * The QDict contains the following: + * + * - "device": device name + * - "type": device type + * - "removable": 1 if the device is removable 0 otherwise + * - "locked": 1 if the device is locked 0 otherwise + * - "inserted": only present if the device is inserted, it is a QDict + * containing the following: + * - "file": device file name + * - "ro": 1 if read-only 0 otherwise + * - "drv": driver format name + * - "backing_file": backing file name if one is used + * - "encrypted": 1 if encrypted 0 otherwise + * + * Example: + * + * [ { "device": "ide0-hd0", "type": "hd", "removable": 0, + * "file": "/tmp/foobar", "ro": 0, "drv": "qcow2", "encrypted": 0 } + * { "device": "floppy0", "type": "floppy", "removable": 1, + * "locked": 0 } ] + */ +void bdrv_info(Monitor *mon, QObject **ret_data) +{ + QList *bs_list; BlockDriverState *bs; + bs_list = qlist_new(); + for (bs = bdrv_first; bs != NULL; bs = bs->next) { - monitor_printf(mon, "%s:", bs->device_name); - monitor_printf(mon, " type="); + QObject *bs_obj; + const char *type = "unknown"; + switch(bs->type) { case BDRV_TYPE_HD: - monitor_printf(mon, "hd"); + type = "hd"; break; case BDRV_TYPE_CDROM: - monitor_printf(mon, "cdrom"); + type = "cdrom"; break; case BDRV_TYPE_FLOPPY: - monitor_printf(mon, "floppy"); + type = "floppy"; break; } - monitor_printf(mon, " removable=%d", bs->removable); - if (bs->removable) { - monitor_printf(mon, " locked=%d", bs->locked); - } + + bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': %s, " + "'removable': %i, 'locked': %i }", NULL, + bs->device_name, type, bs->removable, + bs->locked); + assert(bs_obj != NULL); + if (bs->drv) { - monitor_printf(mon, " file="); - monitor_print_filename(mon, bs->filename); + QObject *obj; + QDict *bs_dict = qobject_to_qdict(bs_obj); + + obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, " + "'encrypted': %i }", NULL, + bs->filename, bs->read_only, + bs->drv->format_name, + bdrv_is_encrypted(bs)); + assert(obj != NULL); if (bs->backing_file[0] != '\0') { - monitor_printf(mon, " backing_file="); - monitor_print_filename(mon, bs->backing_file); + QDict *qdict = qobject_to_qdict(obj); + qdict_put(qdict, "backing_file", + qstring_from_str(bs->backing_file)); } - monitor_printf(mon, " ro=%d", bs->read_only); - monitor_printf(mon, " drv=%s", bs->drv->format_name); - monitor_printf(mon, " encrypted=%d", bdrv_is_encrypted(bs)); - } else { - monitor_printf(mon, " [not inserted]"); + + qdict_put_obj(bs_dict, "inserted", obj); } - monitor_printf(mon, "\n"); + qlist_append_obj(bs_list, bs_obj); } + + *ret_data = QOBJECT(bs_list); } /* The "info blockstats" command. */ diff --git a/block.h b/block.h index a966afb..99dc360 100644 --- a/block.h +++ b/block.h @@ -4,6 +4,7 @@ #include "qemu-aio.h" #include "qemu-common.h" #include "qemu-option.h" +#include "qobject.h" /* block.c */ typedef struct BlockDriver BlockDriver; @@ -41,7 +42,8 @@ typedef struct QEMUSnapshotInfo { #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB) -void bdrv_info(Monitor *mon); +void bdrv_user_print(Monitor *mon, const QObject *data); +void bdrv_info(Monitor *mon, QObject **ret_data); void bdrv_info_stats(Monitor *mon); void bdrv_init(void); diff --git a/monitor.c b/monitor.c index 667dd7c..b9fed9f 100644 --- a/monitor.c +++ b/monitor.c @@ -1979,7 +1979,8 @@ static const mon_cmd_t info_cmds[] = { .args_type = "", .params = "", .help = "show the block devices", - .mhandler.info = bdrv_info, + .user_print = bdrv_user_print, + .mhandler.info_new = bdrv_info, }, { .name = "blockstats",