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 04/37] hw/usb-storage: Check whether BB is inserted
Date: Wed, 04 Mar 2015 09:58:06 -0500 [thread overview]
Message-ID: <54F71D7E.7050300@redhat.com> (raw)
In-Reply-To: <20150304145316.GV3465@noname.str.redhat.com>
On 2015-03-04 at 09:53, Kevin Wolf wrote:
> Am 04.03.2015 um 15:41 hat Max Reitz geschrieben:
>> On 2015-03-04 at 09:39, Kevin Wolf wrote:
>>> Am 04.03.2015 um 15:24 hat Max Reitz geschrieben:
>>>> On 2015-03-04 at 09:20, Kevin Wolf wrote:
>>>>> Am 04.03.2015 um 15:07 hat Max Reitz geschrieben:
>>>>>> On 2015-03-04 at 09:02, Kevin Wolf wrote:
>>>>>>> Am 09.02.2015 um 18:11 hat Max Reitz geschrieben:
>>>>>>>> Only call bdrv_key_required() on the BlockDriverState if the
>>>>>>>> BlockBackend has an inserted medium.
>>>>>>>>
>>>>>>>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>>>>>>>> Reviewed-by: Eric Blake <eblake@redhat.com>
>>>>>>>> ---
>>>>>>>> hw/usb/dev-storage.c | 2 +-
>>>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
>>>>>>>> index 4539733..3123baf 100644
>>>>>>>> --- a/hw/usb/dev-storage.c
>>>>>>>> +++ b/hw/usb/dev-storage.c
>>>>>>>> @@ -638,7 +638,7 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
>>>>>>>> usb_msd_handle_reset(dev);
>>>>>>>> s->scsi_dev = scsi_dev;
>>>>>>>> - if (bdrv_key_required(blk_bs(blk))) {
>>>>>>>> + if (blk_is_inserted(blk) && bdrv_key_required(blk_bs(blk))) {
>>>>>>>> if (cur_mon) {
>>>>>>>> monitor_read_bdrv_key_start(cur_mon, blk_bs(blk),
>>>>>>>> usb_msd_password_cb, s);
>>>>>>> Why would bdrv_key_required() ever return true when no medium is
>>>>>>> inserted? Sounds like a bug to me, like not resetting state correctly on
>>>>>>> bdrv_close() of an encrypted image.
>>>>>> The point is that blk_bs(blk) might be NULL.
>>>>> This is not what blk_is_inserted() is checking. It happens to protect
>>>>> you against segfaults because it's robust against using NULL, but with
>>>>> an existing BDS, checking whether there is a medium inserted (in the
>>>>> physical device for passthrough drivers) doesn't make sense.
>>>> Not right now it's not. See patch 6.
>>> Patch 6 looks unrelated, at least in v2. But if you're trying to say
>>> that I looked at the wrong version, you're right: It doesn't protect you
>>> against segfaults at this point yet (which is okay, because blk->bs
>>> can't be NULL yet), it only performs the misguided inserted check.
>> Oops, yes, I meant patch 7.
>>
>>> Doesn't answer my initial question or make that check any better.
>> The answer to your initial question is: bdrv_key_required() assumes
>> a non-NULL BDS pointer is passed (which is reasonable). Therefore,
>> it crashes when "no medium is inserted" in the sense of
>> !blk_bs(blk).
> That's a great argument in favour of checking blk_bs(bs), but I can't
> see how it's one for the completely unrelated blk_inserted(blk).
As said in IRC, I used blk_is_inserted() because it had the side-effect
of preventing dereferencing the NULL pointer, but I like it much more
than calling blk_bs() for that.
Why is that? Because no code outside of the block layer should access
the BDS directly, therefore, blk_bs() should not be called outside of
the block layer. Why don't I add blk_key_required()? Because that
function does not work on the BB level, but only per BDS, so I will not
add that BB function.
So I didn't want to add more of the ugliness that makes this code here
so ugly to it, but then again, it's the only correct way, you're right
(except for the "remove this completely out-of-place code from here").
Max
next prev parent reply other threads:[~2015-03-04 14:58 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
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 [this message]
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=54F71D7E.7050300@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 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).