diff mbox

[RESEND,39/50] blockdev: Add blockdev-close-tray

Message ID 1422387983-32153-40-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz Jan. 27, 2015, 7:46 p.m. UTC
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 blockdev.c           | 22 ++++++++++++++++++++++
 qapi/block-core.json | 14 ++++++++++++++
 qmp-commands.hx      | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+)

Comments

Eric Blake Jan. 28, 2015, 7:58 p.m. UTC | #1
On 01/27/2015 12:46 PM, Max Reitz wrote:
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  blockdev.c           | 22 ++++++++++++++++++++++
>  qapi/block-core.json | 14 ++++++++++++++
>  qmp-commands.hx      | 33 +++++++++++++++++++++++++++++++++
>  3 files changed, 69 insertions(+)
> 

> +void qmp_blockdev_close_tray(const char *device, Error **errp)
> +{
> +    BlockBackend *blk;
> +
> +    blk = blk_by_name(device);
> +    if (!blk) {
> +        error_set(errp, QERR_DEVICE_NOT_FOUND, device);
> +        return;
> +    }
> +
> +    if (!blk_dev_has_removable_media(blk)) {
> +        error_setg(errp, "Device '%s' is not removable", device);
> +        return;
> +    }
> +
> +    if (!blk_dev_is_tray_open(blk)) {
> +        return;
> +    }

Is it worth documenting that this (and the one in 38/50) are intentional
no-ops if the tray is already in the desired state?

Reviewed-by: Eric Blake <eblake@redhat.com>
Max Reitz Jan. 28, 2015, 8 p.m. UTC | #2
On 2015-01-28 at 14:58, Eric Blake wrote:
> On 01/27/2015 12:46 PM, Max Reitz wrote:
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   blockdev.c           | 22 ++++++++++++++++++++++
>>   qapi/block-core.json | 14 ++++++++++++++
>>   qmp-commands.hx      | 33 +++++++++++++++++++++++++++++++++
>>   3 files changed, 69 insertions(+)
>>
>> +void qmp_blockdev_close_tray(const char *device, Error **errp)
>> +{
>> +    BlockBackend *blk;
>> +
>> +    blk = blk_by_name(device);
>> +    if (!blk) {
>> +        error_set(errp, QERR_DEVICE_NOT_FOUND, device);
>> +        return;
>> +    }
>> +
>> +    if (!blk_dev_has_removable_media(blk)) {
>> +        error_setg(errp, "Device '%s' is not removable", device);
>> +        return;
>> +    }
>> +
>> +    if (!blk_dev_is_tray_open(blk)) {
>> +        return;
>> +    }
> Is it worth documenting that this (and the one in 38/50) are intentional
> no-ops if the tray is already in the desired state?

There's certainly no harm in documenting it, so I might as well just do it.

Max

> Reviewed-by: Eric Blake <eblake@redhat.com>
diff mbox

Patch

diff --git a/blockdev.c b/blockdev.c
index a0b9f17..d6a3fdf 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2041,6 +2041,28 @@  out:
     }
 }
 
+void qmp_blockdev_close_tray(const char *device, Error **errp)
+{
+    BlockBackend *blk;
+
+    blk = blk_by_name(device);
+    if (!blk) {
+        error_set(errp, QERR_DEVICE_NOT_FOUND, device);
+        return;
+    }
+
+    if (!blk_dev_has_removable_media(blk)) {
+        error_setg(errp, "Device '%s' is not removable", device);
+        return;
+    }
+
+    if (!blk_dev_is_tray_open(blk)) {
+        return;
+    }
+
+    blk_dev_change_media_cb(blk, true);
+}
+
 /* throttling disk I/O limits */
 void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
                                int64_t bps_wr,
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 029f08b..802734a 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1739,6 +1739,20 @@ 
   'data': { 'device': 'str',
             '*force': 'bool' } }
 
+##
+# @blockdev-close-tray:
+#
+# Closes a block device's tray. If there is a block driver state tree associated
+# with the block device (which is currently ejected), that tree will be loaded
+# as the medium.
+#
+# @device: block device name
+#
+# Since: 2.3
+##
+{ 'command': 'blockdev-close-tray',
+  'data': { 'device': 'str' } }
+
 
 ##
 # @BlockErrorAction
diff --git a/qmp-commands.hx b/qmp-commands.hx
index cfa1b98..5927507 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3678,6 +3678,39 @@  Example (1):
 EQMP
 
     {
+        .name       = "blockdev-close-tray",
+        .args_type  = "device:s",
+        .mhandler.cmd_new = qmp_marshal_input_blockdev_close_tray,
+    },
+
+SQMP
+blockdev-close-tray
+-------------------
+
+Closes a block device's tray. If there is a block driver state tree associated
+with the block device (which is currently ejected), that tree will be loaded as
+the medium.
+
+Arguments:
+
+- "device": block device name (json-string)
+
+Example (1):
+
+-> { "execute": "blockdev-close-tray",
+     "arguments": { "device": "ide1-cd0" } }
+
+<- { "timestamp": { "seconds": 1418751345,
+                    "microseconds": 272147 },
+     "event": "DEVICE_TRAY_MOVED",
+     "data": { "device": "ide1-cd0",
+               "tray-open": false } }
+
+<- { "return": {} }
+
+EQMP
+
+    {
         .name       = "query-named-block-nodes",
         .args_type  = "",
         .mhandler.cmd_new = qmp_marshal_input_query_named_block_nodes,