Laszlo, Thanks for your details. It looks make sense.
Reviewed-by: Feng Tian <[email protected]> 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

