qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Wen Congyang <wency@cn.fujitsu.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: Wed, 9 Sep 2015 14:59:41 +0200	[thread overview]
Message-ID: <55F02D3D.6020102@redhat.com> (raw)
In-Reply-To: <55F00363.5080709@cn.fujitsu.com>

[-- Attachment #1: Type: text/plain, Size: 4820 bytes --]

On 09.09.2015 12:01, Wen Congyang wrote:
> On 09/09/2015 05:20 AM, Max Reitz wrote:
>> On 08.09.2015 11:13, Wen Congyang wrote:
>>> 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?
>>
>> I think so, yes. Generally, there's probably no reason to do that, but I
>> don't know why we should not allow that case. For instance, you might
>> want to make a backing file available read-only somewhere.
>>
>> It should be impossible to make it available writable, and it should not
>> be allowed to start a block-commit operation while the backing file can
>> be accessed by the guest, but this should be achieved using op blockers.
>>
>> What we need for this to work are fine-grained op blockers, I think. But
>> working around that for now by only allowing to insert top BDS won't
>> work, since you can still start block jobs which target top BDS, too
>> (e.g. blockdev-backup can write to a BDS/BB that is visible to the guest).
>>
>> All in all, I think it's fine to insert non-top BDS, but we should
>> definitely worry about which exact BDS one can insert once we have
>> fine-grained op blockers.
> 
> A BDS can be written by its parent, its block backend, a block job..
> So I think we should have some way to avoid more than two sources writing
> to it, otherwise the data may be corrupted.

Yes, and that would be op blockers.

As I said, using blockdev-backup you can write to a BB that can be
written to by the guest as well. I think this is a bug, but it is a bug
that needs to be fixed by having better op blockers in place, which Jeff
Cody is working on.

Regarding this series, I don't consider this to be too big of an issue.
Yes, if you are working with floppy disks, you can have the case of a
block job and the guest writing to the BDS at the same time. But I can't
really imagine who would use floppy disks and block jobs at the same
time (people who still use floppy disks for their VMs don't strike me as
the kind of people who use the management features of qemu, especially
not for those floppy disks).

Other than that, this function (blockdev-insert-medium) can only be used
for optical ROM devices (I don't think we have CD/DVD-RW support, do
we?), so it's much less of an issue there.

So all in all I don't consider this too big of an issue here. If others
think different, then I would delay this part of the series (which
overhauls the "change" command) until we have fine-grained op blockers.

Max


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

  reply	other threads:[~2015-09-09 13:00 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
2015-09-08 21:20     ` Max Reitz
2015-09-09 10:01       ` Wen Congyang
2015-09-09 12:59         ` Max Reitz [this message]
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=55F02D3D.6020102@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berto@igalia.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=wency@cn.fujitsu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).