From 24fb4133001e1f54a526f0927837f30c1507169a Mon Sep 17 00:00:00 2001 From: Max Reitz Date: Fri, 6 Nov 2015 16:27:06 +0100 Subject: [PATCH] qmp: Introduce blockdev-change-medium Introduce a new QMP command 'blockdev-change-medium' which is intended to replace the 'change' command for block devices. The existing function qmp_change_blockdev() is accordingly renamed to qmp_blockdev_change_medium(). Signed-off-by: Max Reitz Signed-off-by: Kevin Wolf --- blockdev.c | 7 ++++--- include/sysemu/blockdev.h | 2 -- qapi-schema.json | 6 ++++-- qapi/block-core.json | 23 +++++++++++++++++++++++ qmp-commands.hx | 31 +++++++++++++++++++++++++++++++ qmp.c | 2 +- ui/cocoa.m | 10 ++++++---- 7 files changed, 69 insertions(+), 12 deletions(-) diff --git a/blockdev.c b/blockdev.c index 53d4edfe20..b3a958c4aa 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2143,8 +2143,9 @@ void qmp_blockdev_insert_medium(const char *device, const char *node_name, qmp_blockdev_insert_anon_medium(device, bs, errp); } -void qmp_change_blockdev(const char *device, const char *filename, - const char *format, Error **errp) +void qmp_blockdev_change_medium(const char *device, const char *filename, + bool has_format, const char *format, + Error **errp) { BlockBackend *blk; BlockDriverState *medium_bs = NULL; @@ -2165,7 +2166,7 @@ void qmp_change_blockdev(const char *device, const char *filename, bdrv_flags = blk_get_open_flags_from_root_state(blk); - if (format) { + if (has_format) { options = qdict_new(); qdict_put(options, "driver", qstring_from_str(format)); } diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h index a00be94895..b06a0607a9 100644 --- a/include/sysemu/blockdev.h +++ b/include/sysemu/blockdev.h @@ -63,8 +63,6 @@ DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type); /* device-hotplug */ -void qmp_change_blockdev(const char *device, const char *filename, - const char *format, Error **errp); void hmp_commit(Monitor *mon, const QDict *qdict); void hmp_drive_del(Monitor *mon, const QDict *qdict); #endif diff --git a/qapi-schema.json b/qapi-schema.json index 8c3a42a1ac..691200e16a 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1856,8 +1856,10 @@ # device's password. The behavior of reads and writes to the block # device between when these calls are executed is undefined. # -# Notes: It is strongly recommended that this interface is not used especially -# for changing block devices. +# Notes: This interface is deprecated, and it is strongly recommended that you +# avoid using it. For changing block devices, use +# blockdev-change-medium; for changing VNC parameters, use +# change-vnc-password. # # Since: 0.14.0 ## diff --git a/qapi/block-core.json b/qapi/block-core.json index 5c4fc727dc..e9fa6493be 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1958,6 +1958,29 @@ 'node-name': 'str'} } +## +# @blockdev-change-medium: +# +# Changes the medium inserted into a block device by ejecting the current medium +# and loading a new image file which is inserted as the new medium (this command +# combines blockdev-open-tray, blockdev-remove-medium, blockdev-insert-medium +# and blockdev-close-tray). +# +# @device: block device name +# +# @filename: filename of the new image to be loaded +# +# @format: #optional, format to open the new image with (defaults to +# the probed format) +# +# Since: 2.5 +## +{ 'command': 'blockdev-change-medium', + 'data': { 'device': 'str', + 'filename': 'str', + '*format': 'str' } } + + ## # @BlockErrorAction # diff --git a/qmp-commands.hx b/qmp-commands.hx index 203ce6ac34..f6d9c256f2 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -4179,6 +4179,37 @@ Example: } } } ] } +EQMP + + { + .name = "blockdev-change-medium", + .args_type = "device:B,filename:F,format:s?", + .mhandler.cmd_new = qmp_marshal_blockdev_change_medium, + }, + +SQMP +blockdev-change-medium +---------------------- + +Changes the medium inserted into a block device by ejecting the current medium +and loading a new image file which is inserted as the new medium. + +Arguments: + +- "device": device name (json-string) +- "filename": filename of the new image (json-string) +- "format": format of the new image (json-string, optional) + +Examples: + +1. Change a removable medium + +-> { "execute": "blockdev-change-medium", + "arguments": { "device": "ide1-cd0", + "filename": "/srv/images/Fedora-12-x86_64-DVD.iso", + "format": "raw" } } +<- { "return": {} } + EQMP { diff --git a/qmp.c b/qmp.c index ff54e5a765..4e44f98e9d 100644 --- a/qmp.c +++ b/qmp.c @@ -414,7 +414,7 @@ void qmp_change(const char *device, const char *target, if (strcmp(device, "vnc") == 0) { qmp_change_vnc(target, has_arg, arg, errp); } else { - qmp_change_blockdev(device, target, arg, errp); + qmp_blockdev_change_medium(device, target, has_arg, arg, errp); } } diff --git a/ui/cocoa.m b/ui/cocoa.m index c0d6bb2f70..2d8e4e27c5 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -1113,10 +1113,12 @@ QemuCocoaView *cocoaView; } Error *err = NULL; - qmp_change_blockdev([drive cStringUsingEncoding: NSASCIIStringEncoding], - [file cStringUsingEncoding: NSASCIIStringEncoding], - "raw", - &err); + qmp_blockdev_change_medium([drive cStringUsingEncoding: + NSASCIIStringEncoding], + [file cStringUsingEncoding: + NSASCIIStringEncoding], + true, "raw", + &err); handleAnyDeviceErrors(err); } } -- 2.39.2