[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 11/17] block: Convert bdrv_info() to QObject
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH 11/17] block: Convert bdrv_info() to QObject |
Date: |
Fri, 20 Nov 2009 15:06:26 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) |
Luiz Capitulino <address@hidden> writes:
> Each block device information is stored in a QDict and the
> returned QObject is a QList of all devices.
>
> This commit should not change user output.
>
> Signed-off-by: Luiz Capitulino <address@hidden>
> ---
> 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 6be75a1..3424cdb 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -80,7 +80,7 @@ qobject-obj-y += qjson.o json-lexer.o json-streamer.o
> json-parser.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
>
Both $(block-obj-y) and $(qobject-obj-y) go into obj-y, which thus list
all the $(qobject-obj-y) objects twice. Sure that's okay?
> diff --git a/block.c b/block.c
> index 6fdabff..fc4e2f2 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 <sys/types.h>
> @@ -1133,43 +1134,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"));
qdict_get_bool() returns int, no need to cast.
> + }
> +
> + 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_info_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
Use above and example below suggest that "locked" is only present if
device is removable. Document?
> + * - "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 }
Shouldn't "file" & friends ne in nested dictionary "inserted"?
> + * { "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;
> }
This changes human-readable output for bad bs->type from "type=" to
"type=unknown". Fine with me.
> - 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 }",
> + bs->device_name, type, bs->removable,
> + bs->locked);
> + assert(bs_obj != NULL);
Failure modes of qobject_from_jsonf()? I'm asking because depending on
the answer assert() may not be appropriate here.
> +
> 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 }",
> + bs->filename, bs->read_only,
> + bs->drv->format_name,
> + bdrv_is_encrypted(bs));
> + assert(obj != NULL);
Ditto.
> 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 2d4f066..3ca7112 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_info_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 1528f08..e4fed10 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -2047,7 +2047,8 @@ static const mon_cmd_t info_cmds[] = {
> .args_type = "",
> .params = "",
> .help = "show the block devices",
> - .mhandler.info = bdrv_info,
> + .user_print = bdrv_info_print,
> + .mhandler.info_new = bdrv_info,
> },
> {
> .name = "blockstats",
- [Qemu-devel] [PATCH 02/17] Makefile: move QObject objs to their own entry, (continued)
- [Qemu-devel] [PATCH 02/17] Makefile: move QObject objs to their own entry, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 03/17] QDict: Introduce qdict_get_qbool(), Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 04/17] QDict: Introduce qdict_get_qlist(), Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 05/17] monitor: Convert do_info_status() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 06/17] monitor: Convert do_info_kvm() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 07/17] monitor: Convert do_info_name() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 08/17] monitor: Convert do_info_hpet() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 09/17] monitor: Convert do_info_uuid() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 11/17] block: Convert bdrv_info() to QObject, Luiz Capitulino, 2009/11/17
- Re: [Qemu-devel] [PATCH 11/17] block: Convert bdrv_info() to QObject,
Markus Armbruster <=
- [Qemu-devel] [PATCH 10/17] migration: Convert do_info_migrate() to QObject, Luiz Capitulino, 2009/11/17
- [Qemu-devel] [PATCH 12/17] char: Convert qemu_chr_info() to QObject, Luiz Capitulino, 2009/11/17
[Qemu-devel] [PATCH 15/17] VNC: Convert do_info_vnc() to QObject, Luiz Capitulino, 2009/11/17
[Qemu-devel] [PATCH 13/17] PCI: Convert pci_device_hot_add() to QObject, Luiz Capitulino, 2009/11/17