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

Reply via email to