All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: John Snow <jsnow@redhat.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 03/37] hw/block/fdc: Implement tray status
Date: Wed, 04 Mar 2015 17:06:10 -0500	[thread overview]
Message-ID: <54F781D2.4060408@redhat.com> (raw)
In-Reply-To: <20150304140014.GP3465@noname.str.redhat.com>

On 2015-03-04 at 09:00, Kevin Wolf wrote:
> Am 09.02.2015 um 18:11 hat Max Reitz geschrieben:
>> The tray of an FDD is open iff there is no medium inserted (there are
>> only two states for an FDD: "medium inserted" or "no medium inserted").
>>
>> This results in the tray being reported as open if qemu has been started
>> with the default floppy drive, which breaks some tests. Fix them.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   hw/block/fdc.c             | 20 +++++++++++++---
>>   tests/fdc-test.c           |  4 +---
>>   tests/qemu-iotests/067.out | 60 +++++++---------------------------------------
>>   tests/qemu-iotests/071.out |  2 --
>>   tests/qemu-iotests/081.out |  1 -
>>   tests/qemu-iotests/087.out |  6 -----
>>   6 files changed, 26 insertions(+), 67 deletions(-)
>>
>> diff --git a/hw/block/fdc.c b/hw/block/fdc.c
>> index 2bf87c9..0c5a6b4 100644
>> --- a/hw/block/fdc.c
>> +++ b/hw/block/fdc.c
>> @@ -192,6 +192,8 @@ typedef struct FDrive {
>>       uint8_t ro;               /* Is read-only           */
>>       uint8_t media_changed;    /* Is media changed       */
>>       uint8_t media_rate;       /* Data rate of medium    */
>> +
>> +    bool media_inserted;      /* Is there a medium in the tray */
>>   } FDrive;
>>   
>>   static void fd_init(FDrive *drv)
>> @@ -261,7 +263,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect,
>>   #endif
>>           drv->head = head;
>>           if (drv->track != track) {
>> -            if (drv->blk != NULL && blk_is_inserted(drv->blk)) {
>> +            if (drv->media_inserted) {
> I suspect that with the removal of blk_is_inserted() in several places,
> floppy passthrough (host_floppy block driver) is now even more broken
> than before, potentially not noticing removal of a medium any more.
>
> While checking this, I noticed that since commit 21fcf360,
> bdrv_media_changed() is completely unused. Media change has therefore
> probably been broken since at least May 2012.
>
> Considering this, it might actually be reasonable enough to remove the
> block driver. It's definitely better than having it there, but not
> working any better than host_device.
>
> Of course, alternatively you would also be welcome to fix the device
> model and reintroduce bdrv_media_changed() and blk_is_inserted() calls
> where necessary.

Status:

I thought about why I need this tray status at all. The result is: We 
need it because otherwise blockdev-close-tray doesn't do anything on 
floppy disk drives (you'd insert a medium with blockdev-insert-medium 
and the tray would immediately be reported as being closed, without any 
TRAY_MOVED event). So we do need it.

I tested floppy passthrough in a VM and it's horror, as can be expected. 
For instance, one cannot start qemu with floppy passthrough if the host 
drive is empty (which is actually helpful).

So what I'll be doing is set media_inserted to load && drv->blk in the 
media change CB and set it to true in the floppy drive initialization 
code if there is a BB and blk_is_inserted() is true. The tray will be 
considered closed if media_inserted && blk_is_inserted().

So why do I check blk_is_inserted() in the initialization code? If we 
just set media_inserted to true, that would be wrong. Imagine an empty 
drive (no BDS tree), media_inserted will be set to true, then you 
inserted a BDS tree (blockdev-insert-medium) and the tray will be 
considered closed without you having executed blockdev-close-tray 
(media_inserted is true, and now blk_is_inserted() is true as well).

So I have to check whether there's a BDS tree in the initialization 
code, if there isn't, media_inserted must be false. Why am I not using 
blk_bs() for that? I tried to explain for the USB patch: blk_bs() 
returns a BDS, and that's something for the block layer, nobody else 
should care about that.

How could blk_is_inserted() be wrong here, if blk_bs() is the thing that 
will work? Correct, if blk_bs() && !bdrv_is_inserted(blk_bs()). However, 
this will never be the case, because as said above, qemu actually cannot 
start with a host floppy drive without a medium, so 
!!blk_is_inserted(blk) == !!blk_bs(blk).

I see the question popping up "Why don't you just add a bool has_bs(BB) 
{ return blk_bs(BB); } and then not add that test to blk_is_inserted()"? 
I've asked that myself. Answer: Again, anything outside of the block 
layer should not care about things like BDS trees. But moreover, 
bdrv_is_inserted() does not only check whether all the host devices 
represented by BDSs are inserted, but also whether BDS.drv != NULL, 
which until this series was the sign for an empty drive. Therefore, 
checking blk_is_inserted() is the logical conclusion of 
bdrv_is_inserted() (bdrv_is_inserted() tests whether BDS.drv != NULL, 
blk_is_inserted() tests whether BLK.bs != NULL).

But medium management is now done on the BB level, so a separate 
function for checking whether there's a BDS tree (because that should be 
equivalent to "whether there's a medium") seems to have its merits. 
However, I don't think so. blk_is_inserted() is exactly that function: 
It's true if there is a BDS tree and, if there is host passthrough, 
whether all the media are inserted, which is correct.

In theory, guest models should not have to distinguish whether a BB does 
not have a medium because there is no BDS tree or because we're using 
passthrough and that BDS does not have a medium. So why does floppy have 
to distinguish? Because it does not have a real tray, but that's the 
model we have to be working with. Inserting a medium into a 
passed-through host drive must result in the tray being considered 
closed immediately; inserting a medium into a guest device through 
blockdev-insert-medium must not.

So our bane is that we need tray status for floppy disks but they don't 
have a tray, so inserting a medium in a host drive does something 
different than doing the same in a purely virtual drive. Dropping 
host_floppy probably solves that problem, but I'm too cautious for that.

Max

  parent reply	other threads:[~2015-03-04 22:06 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-09 17:11 [Qemu-devel] [PATCH v2 00/37] blockdev: BlockBackend and media Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 01/37] blockdev: Allow creation of BDS trees without BB Max Reitz
2015-02-09 18:17   ` Eric Blake
2015-02-09 18:29     ` Max Reitz
2015-03-04 13:39   ` Kevin Wolf
2015-03-04 14:04     ` Max Reitz
2015-03-04 14:15       ` Kevin Wolf
2015-03-04 14:23         ` Max Reitz
2015-03-04 21:44     ` Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 02/37] iotests: Only create BB if necessary Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 03/37] hw/block/fdc: Implement tray status Max Reitz
2015-02-09 18:23   ` Eric Blake
2015-03-04 14:00   ` Kevin Wolf
2015-03-04 14:07     ` Max Reitz
2015-03-04 22:06     ` Max Reitz [this message]
2015-03-05 10:11       ` Kevin Wolf
2015-03-16 13:36         ` Max Reitz
2015-03-16 15:47           ` Markus Armbruster
2015-03-16 15:48             ` Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 04/37] hw/usb-storage: Check whether BB is inserted Max Reitz
2015-03-04 14:02   ` Kevin Wolf
2015-03-04 14:07     ` Max Reitz
2015-03-04 14:20       ` Kevin Wolf
2015-03-04 14:24         ` Max Reitz
2015-03-04 14:39           ` Kevin Wolf
2015-03-04 14:41             ` Max Reitz
2015-03-04 14:52               ` Max Reitz
2015-03-04 14:53               ` Kevin Wolf
2015-03-04 14:58                 ` Max Reitz
2015-03-04 22:06     ` Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 05/37] block: Fix BB AIOCB AioContext without BDS Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 06/37] block: Make bdrv_is_inserted() return a bool Max Reitz
2015-02-09 18:29   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 07/37] block: Add blk_is_available() Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 08/37] block: Make bdrv_is_inserted() recursive Max Reitz
2015-02-09 19:16   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 09/37] block/quorum: Implement bdrv_is_inserted() Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 10/37] block: Move guest_block_size into BlockBackend Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 11/37] block: Remove wr_highest_sector from BlockAcctStats Max Reitz
2015-02-09 19:20   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 12/37] block: Move BlockAcctStats into BlockBackend Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 13/37] block: Move I/O status and error actions into BB Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 14/37] block: Add BlockBackendRootState Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 15/37] block: Make some BB functions fall back to BBRS Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 16/37] block: Fail requests to empty BlockBackend Max Reitz
2015-02-25 18:18   ` Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 17/37] block: Prepare remaining BB functions for NULL BDS Max Reitz
2015-02-09 20:47   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 18/37] blockdev: Use BB for blockdev-backup transaction Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 19/37] block: Add blk_insert_bs() Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 20/37] block: Prepare for NULL BDS Max Reitz
2015-02-09 21:21   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 21/37] blockdev: Do not create BDS for empty drive Max Reitz
2015-02-09 21:32   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 22/37] blockdev: Pull out blockdev option extraction Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 23/37] blockdev: Allow more options for BB-less BDS tree Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 24/37] block: Add blk_remove_bs() Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 25/37] blockdev: Add blockdev-open-tray Max Reitz
2015-02-09 22:01   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 26/37] blockdev: Add blockdev-close-tray Max Reitz
2015-02-09 22:18   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 27/37] blockdev: Add blockdev-remove-medium Max Reitz
2015-02-09 22:21   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 28/37] blockdev: Add blockdev-insert-medium Max Reitz
2015-02-09 22:23   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 29/37] blockdev: Implement eject with basic operations Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 30/37] blockdev: Implement change " Max Reitz
2015-02-09 22:28   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 31/37] block: Inquire tray state before tray-moved events Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 32/37] qmp: Introduce blockdev-change-medium Max Reitz
2015-02-09 23:09   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 33/37] hmp: Use blockdev-change-medium for change command Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 34/37] blockdev: read-only-mode for blockdev-change-medium Max Reitz
2015-02-09 23:15   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 35/37] hmp: Add read-only-mode option to change command Max Reitz
2015-02-09 23:17   ` Eric Blake
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 36/37] iotests: More options for VM.add_drive() Max Reitz
2015-02-09 17:11 ` [Qemu-devel] [PATCH v2 37/37] iotests: Add test for change-related QMP commands Max Reitz
2015-02-10  0:06   ` Eric Blake
2015-02-10 20:37     ` 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=54F781D2.4060408@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --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.