From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38388) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZZEy6-0003M4-L0 for qemu-devel@nongnu.org; Tue, 08 Sep 2015 05:13:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZZEy3-0002dm-E1 for qemu-devel@nongnu.org; Tue, 08 Sep 2015 05:13:34 -0400 References: <1437414365-11881-1-git-send-email-mreitz@redhat.com> <1437414365-11881-30-git-send-email-mreitz@redhat.com> From: Wen Congyang Message-ID: <55EEA69E.4010706@cn.fujitsu.com> Date: Tue, 8 Sep 2015 17:13:02 +0800 MIME-Version: 1.0 In-Reply-To: <1437414365-11881-30-git-send-email-mreitz@redhat.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4 29/38] blockdev: Add blockdev-insert-medium List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz , qemu-block@nongnu.org Cc: Kevin Wolf , Alberto Garcia , qemu-devel@nongnu.org, Markus Armbruster , Stefan Hajnoczi , John Snow 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 > --- > 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, >