On 05/05/16 09:07, Tian, Feng wrote:
> Laszlo,
> 
> Thanks for your details. It looks make sense.
> 
> Reviewed-by: Feng Tian <[email protected]>

Many thanks! Commit ce1647fc608e.

Cheers!
Laszlo

> 
> Thanks
> Feng
> 
> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of Laszlo 
> Ersek
> Sent: Thursday, May 5, 2016 12:47 AM
> To: Tian, Feng <[email protected]>; edk2-devel-01 <[email protected]>
> Cc: Ni, Ruiyu <[email protected]>; Paolo Bonzini <[email protected]>; 
> Zeng, Star <[email protected]>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: ScsiDiskDxe: cope with broken 
> "Supported VPD Pages" VPD page
> 
> On 05/04/16 18:03, Laszlo Ersek wrote:
>> On 05/04/16 13:11, Laszlo Ersek wrote:
>>> On 05/04/16 02:58, Tian, Feng wrote:
>>>> Laszlo,
>>>>
>>>> Could you explain more? 
>>>>
>>>> Usb Flash drive is managed by UsbMassStorage driver, which is irrelevant 
>>>> with UefiScsiLib lib or ScsiDisk driver.
>>>
>>> Yeah, sorry about missing that part of the context.
>>>
>>> So, the environment is the following:
>>>
>>> - The USB flash drive with VendorId/ProductId 0x1516/0x6221 is 
>>> plugged into a Linux host.
>>>
>>> - The usb-storage driver in Linux presents the USB flash drive to the 
>>> rest of the system as a SCSI disk. The device node that is generated 
>>> for it looks like /dev/sd*, for example, /dev/sdi.
>>>
>>> - This device node can be used like any other SCSI device.
>>>
>>> - Using the virtio-scsi HBA, QEMU can provide a virtual machine with 
>>> various types of virtual SCSI devices. One of those is "scsi-block", 
>>> which is also known as "SCSI passthrough". It means that most of the 
>>> SCSI commands are forwarded transparently from guest device to 
>>> physical host device (/dev/sdi, for example), using the SG_IO ioctl() 
>>> call. Only a few SCSI commands are captured and emulated by QEMU.
>>>
>>> This feature is useful e.g. for burning physical optical media, or 
>>> writing physical tapes, from a virtual machine.
>>>
>>> - In this scenario, the USB stick that is plugged in the host is 
>>> exposed to the guest with this feature. So, when the 
>>> ScsiDiskInquiryDevice() function runs in the guest (as part of OVMF), 
>>> the INQUIRY command (asking for the Supported VPD Pages" VPD page) is 
>>> forwarded to the USB stick on the host. And that device returns garbage.
>>>
>>> - It is important to note that the "garbage" is not inserted by 
>>> either the host kernel's usb-storage driver, or by QEMU. Even without 
>>> virtualization, the host kernel consciously avoids asking SCSI disks 
>>> that are actually backed by USB mass-storage devices for VPD pages, 
>>> because the kernel developers have realized that most (if not all) of 
>>> USB mass-storage devices fail to respond correctly. Please see this 
>>> host kernel commit:
>>>
>>> http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit
>>> /?id=09b6b51b0b6c
>>>
>>> - In <https://bugzilla.redhat.com/show_bug.cgi?id=1330955#c14>, I 
>>> demonstrate what happens when such an INQUIRY is sent manually to the 
>>> SCSI disk that is backed by the USB flash drive. For a genuine SCSI 
>>> disk, the command completes:
>>>
>>> # sg_vpd -v /dev/sda
>>> Supported VPD pages VPD page:
>>>     inquiry cdb: 12 01 00 00 fc 00
>>>    [PQual=0  Peripheral device type: disk]
>>>   Supported VPD pages [sv]
>>>   Unit serial number [sn]
>>>   Device identification [di]
>>>   ATA information (SAT) [ai]
>>>   Block limits (SBC) [bl]
>>>   Block device characteristics (SBC) [bdc]
>>>   Logical block provisioning (SBC) [lbpv]
>>>
>>> Buth the USB flash drive responds with garbage:
>>>
>>> # sg_vpd -v /dev/sdi
>>> Supported VPD pages VPD page:
>>>     inquiry cdb: 12 01 00 00 fc 00
>>> invalid VPD response; probably a STANDARD INQUIRY response First 32 
>>> bytes of bad response
>>>  00   00 80 06 02 1f 00 00 00  00 00 00 00 00 00 00 00  ................
>>>  10   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
>>> fetching VPD page failed
>>>
>>> - So this patch is motivated by the case when a USB mass-storage 
>>> device is presented as a SCSI disk, directly on the (virtual) 
>>> hardware level, and it provides a bogus 0x00 VPD page.
>>
>> I'm no longer certain that edk2's ScsiDiskDxe is the right place to 
>> fix this problem. It seems that the usb-storage driver in Linux could 
>> be the culprit -- it should be watching for INQUIRY commands with EVPD 
>> set, and reject them before forwarding them to the device. That is the 
>> method that complies with both SPC-4 and the UFI command spec. (And, 
>> edk2 handles this case correctly, already.) Please see 
>> <https://bugzilla.redhat.com/show_bug.cgi?id=1330955#c17>.
>>
>> So, for the time being, I'm withdrawing this patch.
> 
> Sigh, scratch that please (and please excuse the noise).
> 
> It turns out that the USB device in question has:
> - one configuration
> - for that configuration, one interface
> - for that interface, a /bInterfaceSubClass/ value of 6
>   (implying "SCSI transparent command set")
> 
> This implies that the USB device in question is supposed to parse and handle 
> *all* valid SCSI commands that are sent to it.
> 
> Meaning, if the device gets an INQUIRY+EVPD command from ScsiDiskDxe -- 
> transparently forwarded by QEMU and the host Linux kernel --, then the device 
> is responsible for rejecting the command with CHECK CONDITION (if the device 
> doesn't support INQUIRY+EVPD).
> 
> Instead of this, however, the device silently returns a standard INQUIRY 
> response (rather than a CHECK CONDITION, or even the requested VPD page).
> 
> Hence, this device is *genuinely* broken. And, I would like to get this patch 
> into ScsiDiskDxe after all.
> 
> Thank you
> Laszlo
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
> 

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to