Re: [PATCH v2 2/2] scsi: core: Do not query IO hints for USB devices

Alan Stern
2024-06-13T01:25:16Z

On Wed, Jun 12, 2024 at 01:37:34PM -0700, Bart Van Assche wrote:
> Recently it was reported that the following USB storage devices are unusable
> with Linux kernel 6.9:
> * Kingston DataTraveler G2
> * Garmin FR35
>
> This is because attempting to read the IO hint VPD page causes these devices
> to reset. Hence do not read the IO hint VPD page from USB storage devices.
>
> Cc: Alan Stern <stern@rowland.harvard.edu>
> Cc: linux-usb@vger.kernel.org
> Cc: Joao Machado <jocrismachado@gmail.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Christian Heusel <christian@heusel.eu>
> Cc: stable@vger.kernel.org
> Fixes: 4f53138fffc2 ("scsi: sd: Translate data lifetime information")
> Reported-by: Joao Machado <jocrismachado@gmail.com>
> Closes: https://lore.kernel.org/linux-scsi/20240130214911.1863909-1-bvanassche@acm.org/T/#mf4e3410d8f210454d7e4c3d1fb5c0f41e651b85f
> Tested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Bisected-by: Christian Heusel <christian@heusel.eu>
> Reported-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Closes: https://lore.kernel.org/linux-scsi/CACLx9VdpUanftfPo2jVAqXdcWe8Y43MsDeZmMPooTzVaVJAh2w@mail.gmail.com/
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---

Acked-by: Alan Stern <stern@rowland.harvard.edu>

> drivers/usb/storage/scsiglue.c | 6 ++++++
> drivers/usb/storage/uas.c | 7 +++++++
> 2 files changed, 13 insertions(+)
>
> diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
> index b31464740f6c..b4cf0349fd0d 100644
> --- a/drivers/usb/storage/scsiglue.c
> +++ b/drivers/usb/storage/scsiglue.c
> @@ -79,6 +79,12 @@ static int slave_alloc (struct scsi_device *sdev)
> if (us->protocol == USB_PR_BULK && us->max_lun > 0)
> sdev->sdev_bflags |= BLIST_FORCELUN;
>
> + /*
> + * Some USB storage devices reset if the IO hints VPD page is queried.
> + * Hence skip that VPD page.
> + */
> + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS;
> +
> return 0;
> }
>
> diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
> index a48870a87a29..77fdfb6a90c8 100644
> --- a/drivers/usb/storage/uas.c
> +++ b/drivers/usb/storage/uas.c
> @@ -21,6 +21,7 @@
> #include <scsi/scsi.h>
> #include <scsi/scsi_eh.h>
> #include <scsi/scsi_dbg.h>
> +#include <scsi/scsi_devinfo.h>
> #include <scsi/scsi_cmnd.h>
> #include <scsi/scsi_device.h>
> #include <scsi/scsi_host.h>
> @@ -820,6 +821,12 @@ static int uas_slave_alloc(struct scsi_device *sdev)
> struct uas_dev_info *devinfo =
> (struct uas_dev_info *)sdev->host->hostdata;
>
> + /*
> + * Some USB storage devices reset if the IO hints VPD page is queried.
> + * Hence skip that VPD page.
> + */
> + sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS;
> +
> sdev->hostdata = devinfo;
> return 0;
> }