Re: [Qemu-devel] [PATCH v2 06/10] block: Accept device model name for x-blockdev-remove-medium

2016-09-19 Thread Eric Blake
On 09/19/2016 11:54 AM, Kevin Wolf wrote:
> In order to remove the necessity to use BlockBackend names in the
> external API, we want to allow qdev device names in all device related
> commands.
> 
> This converts x-blockdev-remove-medium to accept a qdev device name.
> 
> As the command is experimental, we can still remove the 'device' option
> that uses the BlockBackend name. This requires some test case changes
> and is left for another series.
> 
> Signed-off-by: Kevin Wolf 
> ---
>  blockdev.c   | 28 
>  qapi/block-core.json |  7 +--
>  qmp-commands.hx  | 14 --
>  3 files changed, 29 insertions(+), 20 deletions(-)

Reviewed-by: Eric Blake 

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-devel] [PATCH v2 06/10] block: Accept device model name for x-blockdev-remove-medium

2016-09-19 Thread Kevin Wolf
In order to remove the necessity to use BlockBackend names in the
external API, we want to allow qdev device names in all device related
commands.

This converts x-blockdev-remove-medium to accept a qdev device name.

As the command is experimental, we can still remove the 'device' option
that uses the BlockBackend name. This requires some test case changes
and is left for another series.

Signed-off-by: Kevin Wolf 
---
 blockdev.c   | 28 
 qapi/block-core.json |  7 +--
 qmp-commands.hx  | 14 --
 3 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/blockdev.c b/blockdev.c
index 0eb173d..a007b22 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2281,7 +2281,7 @@ void qmp_eject(const char *device, bool has_force, bool 
force, Error **errp)
 }
 error_free(local_err);
 
-qmp_x_blockdev_remove_medium(device, errp);
+qmp_x_blockdev_remove_medium(true, device, false, NULL, errp);
 }
 
 void qmp_block_passwd(bool has_device, const char *device,
@@ -2415,30 +2415,34 @@ void qmp_blockdev_close_tray(bool has_device, const 
char *device,
 blk_dev_change_media_cb(blk, true);
 }
 
-void qmp_x_blockdev_remove_medium(const char *device, Error **errp)
+void qmp_x_blockdev_remove_medium(bool has_device, const char *device,
+  bool has_id, const char *id, Error **errp)
 {
 BlockBackend *blk;
 BlockDriverState *bs;
 AioContext *aio_context;
-bool has_device;
+bool has_attached_device;
 
-blk = blk_by_name(device);
+device = has_device ? device : NULL;
+id = has_id ? id : NULL;
+
+blk = qmp_get_blk(device, id, errp);
 if (!blk) {
-error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
-  "Device '%s' not found", device);
 return;
 }
 
 /* For BBs without a device, we can exchange the BDS tree at will */
-has_device = blk_get_attached_dev(blk);
+has_attached_device = blk_get_attached_dev(blk);
 
-if (has_device && !blk_dev_has_removable_media(blk)) {
-error_setg(errp, "Device '%s' is not removable", device);
+if (has_attached_device && !blk_dev_has_removable_media(blk)) {
+error_setg(errp, "Device '%s' is not removable", device ?: id);
 return;
 }
 
-if (has_device && blk_dev_has_tray(blk) && !blk_dev_is_tray_open(blk)) {
-error_setg(errp, "Tray of device '%s' is not open", device);
+if (has_attached_device && blk_dev_has_tray(blk) &&
+!blk_dev_is_tray_open(blk))
+{
+error_setg(errp, "Tray of device '%s' is not open", device ?: id);
 return;
 }
 
@@ -2604,7 +2608,7 @@ void qmp_blockdev_change_medium(const char *device, const 
char *filename,
 error_free(err);
 err = NULL;
 
-qmp_x_blockdev_remove_medium(device, &err);
+qmp_x_blockdev_remove_medium(true, device, false, NULL, errp);
 if (err) {
 error_propagate(errp, err);
 goto fail;
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 6ac6809..e370366 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2410,12 +2410,15 @@
 # This command is still a work in progress and is considered experimental.
 # Stay away from it unless you want to help with its development.
 #
-# @device: block device name
+# @device: #optional Block device name (deprecated, use @id instead)
+#
+# @id: #optional The name or QOM path of the guest device (since: 2.8)
 #
 # Since: 2.5
 ##
 { 'command': 'x-blockdev-remove-medium',
-  'data': { 'device': 'str' } }
+  'data': { '*device': 'str',
+'*id': 'str' } }
 
 ##
 # @x-blockdev-insert-medium:
diff --git a/qmp-commands.hx b/qmp-commands.hx
index bb00099..4d6d896 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -4382,7 +4382,7 @@ EQMP
 
 {
 .name   = "x-blockdev-remove-medium",
-.args_type  = "device:s",
+.args_type  = "device:s?,id:s?",
 .mhandler.cmd_new = qmp_marshal_x_blockdev_remove_medium,
 },
 
@@ -4400,18 +4400,20 @@ Stay away from it unless you want to help with its 
development.
 
 Arguments:
 
-- "device": block device name (json-string)
+- "device": block device name (deprecated, use @id instead)
+(json-string, optional)
+- "id": the name or QOM path of the guest device (json-string, optional)
 
 Example:
 
 -> { "execute": "x-blockdev-remove-medium",
- "arguments": { "device": "ide1-cd0" } }
+ "arguments": { "id": "ide0-1-0" } }
 
 <- { "error": { "class": "GenericError",
-"desc": "Tray of device 'ide1-cd0' is not open" } }
+"desc": "Tray of device 'ide0-1-0' is not open" } }
 
 -> { "execute": "blockdev-open-tray",
- "arguments": { "device": "ide1-cd0" } }
+ "arguments": { "id": "ide0-1-0" } }
 
 <- { "timestamp": { "seconds": 1418751627,
 "microseconds": 549958 },
@@ -4422,7 +4424,7 @@ Example:
 <- { "return": {} }
 
 -> { "execute": "x-blockdev-remove-medium",
- "ar