diff options
author | Kevin Wolf <kwolf@redhat.com> | 2019-12-17 15:13:34 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2019-12-19 18:04:25 +0100 |
commit | 89b6fc45614bb45dcd58f1590415afe5c2791abd (patch) | |
tree | 3f1de174742b60342e52dcc4d98261777392be10 | |
parent | 7bb4941ace471fc7dd6ded4749b95b9622baa6ed (diff) | |
download | qemu-89b6fc45614bb45dcd58f1590415afe5c2791abd.zip qemu-89b6fc45614bb45dcd58f1590415afe5c2791abd.tar.gz qemu-89b6fc45614bb45dcd58f1590415afe5c2791abd.tar.bz2 |
hmp: Allow using qdev ID for qemu-io command
In order to issue requests on an existing BlockBackend with the
'qemu-io' HMP command, allow specifying the BlockBackend not only with a
BlockBackend name, but also with a qdev ID/QOM path for a device that
owns the (possibly anonymous) BlockBackend.
Because qdev names could be conflicting with BlockBackend and node
names, introduce a -d option to explicitly address a device. If the
option is not given, a BlockBackend or a node is addressed.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | hmp-commands.hx | 8 | ||||
-rw-r--r-- | monitor/hmp-cmds.c | 28 |
2 files changed, 23 insertions, 13 deletions
diff --git a/hmp-commands.hx b/hmp-commands.hx index cfcc044..dc23185 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1875,9 +1875,11 @@ ETEXI { .name = "qemu-io", - .args_type = "device:B,command:s", - .params = "[device] \"[command]\"", - .help = "run a qemu-io command on a block device", + .args_type = "qdev:-d,device:B,command:s", + .params = "[-d] [device] \"[command]\"", + .help = "run a qemu-io command on a block device\n\t\t\t" + "-d: [device] is a device ID rather than a " + "drive ID or node name", .cmd = hmp_qemu_io, }, diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index b2551c1..5f8941d 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -2468,23 +2468,31 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) { BlockBackend *blk; BlockBackend *local_blk = NULL; + bool qdev = qdict_get_try_bool(qdict, "qdev", false); const char* device = qdict_get_str(qdict, "device"); const char* command = qdict_get_str(qdict, "command"); Error *err = NULL; int ret; - blk = blk_by_name(device); - if (!blk) { - BlockDriverState *bs = bdrv_lookup_bs(NULL, device, &err); - if (bs) { - blk = local_blk = blk_new(bdrv_get_aio_context(bs), - 0, BLK_PERM_ALL); - ret = blk_insert_bs(blk, bs, &err); - if (ret < 0) { + if (qdev) { + blk = blk_by_qdev_id(device, &err); + if (!blk) { + goto fail; + } + } else { + blk = blk_by_name(device); + if (!blk) { + BlockDriverState *bs = bdrv_lookup_bs(NULL, device, &err); + if (bs) { + blk = local_blk = blk_new(bdrv_get_aio_context(bs), + 0, BLK_PERM_ALL); + ret = blk_insert_bs(blk, bs, &err); + if (ret < 0) { + goto fail; + } + } else { goto fail; } - } else { - goto fail; } } |