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 <[email protected]> > >>Reviewed-by: Eric Blake <[email protected]> > >>--- > >> 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. It looks like what you want is blk_bs(blk) != NULL. Kevin
