All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wen Congyang <wency@cn.fujitsu.com>
To: Max Reitz <mreitz@redhat.com>, qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Alberto Garcia <berto@igalia.com>,
	qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	John Snow <jsnow@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 29/38] blockdev: Add blockdev-insert-medium
Date: Tue, 8 Sep 2015 17:13:02 +0800	[thread overview]
Message-ID: <55EEA69E.4010706@cn.fujitsu.com> (raw)
In-Reply-To: <1437414365-11881-30-git-send-email-mreitz@redhat.com>

On 07/21/2015 01:45 AM, Max Reitz wrote:
> And a helper function for that, which directly takes a pointer to the
> BDS to be inserted instead of its node-name (which will be used for
> implementing 'change' using blockdev-insert-medium).
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  blockdev.c           | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  qapi/block-core.json | 17 +++++++++++++++++
>  qmp-commands.hx      | 37 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 102 insertions(+)
> 
> diff --git a/blockdev.c b/blockdev.c
> index 481760a..a80d0e2 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -2164,6 +2164,54 @@ void qmp_blockdev_remove_medium(const char *device, Error **errp)
>      }
>  }
>  
> +static void qmp_blockdev_insert_anon_medium(const char *device,
> +                                            BlockDriverState *bs, Error **errp)
> +{
> +    BlockBackend *blk;
> +    bool has_device;
> +
> +    blk = blk_by_name(device);
> +    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);
> +
> +    if (has_device && !blk_dev_has_removable_media(blk)) {
> +        error_setg(errp, "Device '%s' is not removable", device);
> +        return;
> +    }
> +
> +    if (has_device && !blk_dev_is_tray_open(blk)) {
> +        error_setg(errp, "Tray of device '%s' is not open", device);
> +        return;
> +    }
> +
> +    if (blk_bs(blk)) {
> +        error_setg(errp, "There already is a medium in device '%s'", device);
> +        return;
> +    }
> +
> +    blk_insert_bs(blk, bs);
> +}
> +
> +void qmp_blockdev_insert_medium(const char *device, const char *node_name,
> +                                Error **errp)
> +{
> +    BlockDriverState *bs;
> +
> +    bs = bdrv_find_node(node_name);
> +    if (!bs) {
> +        error_setg(errp, "Node '%s' not found", node_name);
> +        return;
> +    }

Hmm, it is OK if the bs is not top BDS?

Thanks
Wen Congyang

> +
> +    qmp_blockdev_insert_anon_medium(device, bs, errp);
> +}
> +
>  /* 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 63a83e4..84c9b23 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -1925,6 +1925,23 @@
>  { 'command': 'blockdev-remove-medium',
>    'data': { 'device': 'str' } }
>  
> +##
> +# @blockdev-insert-medium:
> +#
> +# Inserts a medium (a block driver state tree) into a block device. That block
> +# device's tray must currently be open and there must be no medium inserted
> +# already.
> +#
> +# @device:    block device name
> +#
> +# @node-name: name of a node in the block driver state graph
> +#
> +# Since: 2.5
> +##
> +{ 'command': 'blockdev-insert-medium',
> +  'data': { 'device': 'str',
> +            'node-name': 'str'} }
> +
>  
>  ##
>  # @BlockErrorAction
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index ff6c572..b4c34fe 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -3991,6 +3991,43 @@ Example:
>  EQMP
>  
>      {
> +        .name       = "blockdev-insert-medium",
> +        .args_type  = "device:s,node-name:s",
> +        .mhandler.cmd_new = qmp_marshal_input_blockdev_insert_medium,
> +    },
> +
> +SQMP
> +blockdev-insert-medium
> +----------------------
> +
> +Inserts a medium (a block driver state tree) into a block device. That block
> +device's tray must currently be open and there must be no medium inserted
> +already.
> +
> +Arguments:
> +
> +- "device": block device name (json-string)
> +- "node-name": root node of the BDS tree to insert into the block device
> +
> +Example:
> +
> +-> { "execute": "blockdev-add",
> +     "arguments": { "options": { "node-name": "node0",
> +                                 "driver": "raw",
> +                                 "file": { "driver": "file",
> +                                           "filename": "fedora.iso" } } } }
> +
> +<- { "return": {} }
> +
> +-> { "execute": "blockdev-insert-medium",
> +     "arguments": { "device": "ide1-cd0",
> +                    "node-name": "node0" } }
> +
> +<- { "return": {} }
> +
> +EQMP
> +
> +    {
>          .name       = "query-named-block-nodes",
>          .args_type  = "",
>          .mhandler.cmd_new = qmp_marshal_input_query_named_block_nodes,
> 

  parent reply	other threads:[~2015-09-08  9:13 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-20 17:45 [Qemu-devel] [PATCH v4 00/38] blockdev: BlockBackend and media Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 01/38] block: Remove host floppy support Max Reitz
2015-09-07 15:59   ` Kevin Wolf
2015-09-07 16:26     ` Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 02/38] blockdev: Allow creation of BDS trees without BB Max Reitz
2015-09-07 16:12   ` Kevin Wolf
2015-09-07 16:38     ` Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 03/38] iotests: Only create BB if necessary Max Reitz
2015-09-07 16:20   ` Kevin Wolf
2015-09-07 16:54     ` Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 04/38] block: Make bdrv_is_inserted() return a bool Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 05/38] block: Add blk_is_available() Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 06/38] block: Make bdrv_is_inserted() recursive Max Reitz
2015-09-07 17:43   ` Kevin Wolf
2015-09-07 18:03     ` Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 07/38] block/quorum: Implement bdrv_is_inserted() Max Reitz
2015-09-07 18:03   ` Kevin Wolf
2015-09-07 18:04     ` Max Reitz
2015-09-07 18:16       ` Kevin Wolf
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 08/38] block: Invoke change media CB before NULLing drv Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 09/38] hw/block/fdc: Implement tray status Max Reitz
2015-09-07 18:13   ` Kevin Wolf
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 10/38] hw/usb-storage: Check whether BB is inserted Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 11/38] block: Fix BB AIOCB AioContext without BDS Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 12/38] block: Move guest_block_size into BlockBackend Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 13/38] block: Remove wr_highest_sector from BlockAcctStats Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 14/38] block: Move BlockAcctStats into BlockBackend Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 15/38] block: Move I/O status and error actions into BB Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 16/38] block: Add BlockBackendRootState Max Reitz
2015-09-11 23:20   ` Eric Blake
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 17/38] block: Make some BB functions fall back to BBRS Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 18/38] block: Fail requests to empty BlockBackend Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 19/38] block: Prepare remaining BB functions for NULL BDS Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 20/38] block: Add blk_insert_bs() Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 21/38] block: Prepare for NULL BDS Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 22/38] blockdev: Do not create BDS for empty drive Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 23/38] blockdev: Pull out blockdev option extraction Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 24/38] blockdev: Allow more options for BB-less BDS tree Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 25/38] block: Add blk_remove_bs() Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 26/38] blockdev: Add blockdev-open-tray Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 27/38] blockdev: Add blockdev-close-tray Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 28/38] blockdev: Add blockdev-remove-medium Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 29/38] blockdev: Add blockdev-insert-medium Max Reitz
2015-09-08  5:53   ` Wen Congyang
2015-09-08 15:57     ` Eric Blake
2015-09-08  9:13   ` Wen Congyang [this message]
2015-09-08 21:20     ` Max Reitz
2015-09-09 10:01       ` Wen Congyang
2015-09-09 12:59         ` Max Reitz
2015-09-10  1:12           ` Wen Congyang
2015-09-10 19:09             ` Max Reitz
2015-09-11  7:30               ` Wen Congyang
2015-09-11 17:01                 ` Max Reitz
2015-09-10  3:22           ` Wen Congyang
2015-09-10 19:10             ` Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 30/38] blockdev: Implement eject with basic operations Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 31/38] blockdev: Implement change " Max Reitz
2015-07-20 17:45 ` [Qemu-devel] [PATCH v4 32/38] block: Inquire tray state before tray-moved events Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 33/38] qmp: Introduce blockdev-change-medium Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 34/38] hmp: Use blockdev-change-medium for change command Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 35/38] blockdev: read-only-mode for blockdev-change-medium Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 36/38] hmp: Add read-only-mode option to change command Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 37/38] iotests: More options for VM.add_drive() Max Reitz
2015-07-20 17:46 ` [Qemu-devel] [PATCH v4 38/38] iotests: Add test for change-related QMP commands Max Reitz
2015-09-02 15:02 ` [Qemu-devel] [PATCH v4 00/38] blockdev: BlockBackend and media Eric Blake
2015-09-07  5:53   ` Wen Congyang
2015-09-07 18:42     ` Max Reitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55EEA69E.4010706@cn.fujitsu.com \
    --to=wency@cn.fujitsu.com \
    --cc=armbru@redhat.com \
    --cc=berto@igalia.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.